summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LICENSE.md48
-rw-r--r--README.md6
-rw-r--r--core/bind/core_bind.cpp5
-rw-r--r--core/bind/core_bind.h1
-rw-r--r--core/io/http_client.cpp8
-rw-r--r--core/io/resource_format_xml.cpp1
-rw-r--r--core/os/memory.h8
-rw-r--r--core/os/os.cpp4
-rw-r--r--core/os/os.h1
-rw-r--r--core/typedefs.h2
-rw-r--r--doc/base/classes.xml33
-rw-r--r--main/input_default.cpp8
-rw-r--r--modules/gdscript/gd_editor.cpp1
-rwxr-xr-xplatform/iphone/gl_view.mm71
-rw-r--r--platform/iphone/os_iphone.cpp22
-rw-r--r--platform/iphone/os_iphone.h8
-rw-r--r--scene/2d/tile_map.cpp5
-rw-r--r--scene/audio/event_player.cpp2
-rw-r--r--scene/resources/packed_scene.cpp29
-rw-r--r--scene/resources/packed_scene.h11
-rw-r--r--scene/resources/scene_format_text.cpp32
-rw-r--r--tools/editor/editor_node.cpp6
-rw-r--r--tools/editor/editor_settings.cpp54
-rw-r--r--tools/editor/editor_settings.h3
-rw-r--r--tools/editor/plugins/animation_player_editor_plugin.cpp6
-rw-r--r--tools/editor/plugins/canvas_item_editor_plugin.cpp2
-rw-r--r--tools/editor/plugins/script_editor_plugin.cpp4
-rw-r--r--tools/editor/project_manager.cpp6
-rw-r--r--tools/scripts/sort-demos.sh29
-rw-r--r--tools/steam/community_capsule.jpgbin0 -> 5571 bytes
-rw-r--r--tools/steam/community_capsule.pngbin0 -> 7263 bytes
-rw-r--r--tools/steam/header.pngbin0 -> 18980 bytes
-rw-r--r--tools/steam/icon32.icns1029
-rw-r--r--tools/steam/icon32.icobin0 -> 4286 bytes
-rw-r--r--tools/steam/icons.zipbin0 -> 114972 bytes
-rw-r--r--tools/steam/large_capsule.pngbin0 -> 19020 bytes
-rw-r--r--tools/steam/main_capsule.pngbin0 -> 25359 bytes
-rw-r--r--tools/steam/make_icons.sh7
-rw-r--r--tools/steam/small_capsule.pngbin0 -> 9144 bytes
-rw-r--r--version.py2
40 files changed, 1312 insertions, 142 deletions
diff --git a/LICENSE.md b/LICENSE.md
index 2f78f0e37d..2f3e879c8c 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,27 +1,27 @@
- GODOT ENGINE
- http://www.godotengine.org
-**********************************************************************
- Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur.
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ GODOT ENGINE
+ http://www.godotengine.org
+
+************************************************************************
+
+ Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur.
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
-**********************************************************************
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+************************************************************************
diff --git a/README.md b/README.md
index 20d1367762..2586a5ea0d 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
![GODOT](/logo.png)
+http://www.godotengine.org
+
### The Engine
Godot is a fully featured, open source, MIT licensed, game engine. It focuses on having great tools, and a visual oriented workflow that can export to PC, Mobile and Web platforms with no hassle.
@@ -11,7 +13,7 @@ Godot has been developed by Juan Linietsky and Ariel Manzur for several years, a
### Documentation
-Documentation has been moved to the [OpenProject Wiki](http://godotengine.org/projects/godot-engine/wiki/Documentation).
+Documentation has been moved to [ReadTheDocs](http://docs.godotengine.org).
### Binary Downloads, Community, etc.
@@ -22,6 +24,6 @@ http://www.godotengine.org
### Compiling from Source
Compilation instructions for every platform can be found in the Wiki:
-http://godotengine.org/projects/godot-engine/wiki/Advanced_topics
+http://docs.godotengine.org/en/latest/reference/_compiling.html
[![Build Status](https://travis-ci.org/godotengine/godot.svg?branch=master)](https://travis-ci.org/godotengine/godot)
diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp
index b291ee396b..229640ba11 100644
--- a/core/bind/core_bind.cpp
+++ b/core/bind/core_bind.cpp
@@ -689,6 +689,10 @@ void _OS::native_video_pause() {
OS::get_singleton()->native_video_pause();
};
+void _OS::native_video_unpause() {
+ OS::get_singleton()->native_video_unpause();
+};
+
void _OS::native_video_stop() {
OS::get_singleton()->native_video_stop();
@@ -874,6 +878,7 @@ void _OS::_bind_methods() {
ObjectTypeDB::bind_method(_MD("native_video_is_playing"),&_OS::native_video_is_playing);
ObjectTypeDB::bind_method(_MD("native_video_stop"),&_OS::native_video_stop);
ObjectTypeDB::bind_method(_MD("native_video_pause"),&_OS::native_video_pause);
+ ObjectTypeDB::bind_method(_MD("native_video_unpause"),&_OS::native_video_unpause);
ObjectTypeDB::bind_method(_MD("get_scancode_string","code"),&_OS::get_scancode_string);
ObjectTypeDB::bind_method(_MD("is_scancode_unicode","code"),&_OS::is_scancode_unicode);
diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h
index 30cc93fa11..4a9bb2a961 100644
--- a/core/bind/core_bind.h
+++ b/core/bind/core_bind.h
@@ -131,6 +131,7 @@ public:
Error native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track);
bool native_video_is_playing();
void native_video_pause();
+ void native_video_unpause();
void native_video_stop();
void set_iterations_per_second(int p_ips);
diff --git a/core/io/http_client.cpp b/core/io/http_client.cpp
index 19a7286dcf..b070e52f0a 100644
--- a/core/io/http_client.cpp
+++ b/core/io/http_client.cpp
@@ -306,8 +306,8 @@ Error HTTPClient::poll(){
for(int i=0;i<responses.size();i++) {
- String s = responses[i].strip_edges();
- s = s.to_lower();
+ String header = responses[i].strip_edges();
+ String s = header.to_lower();
if (s.length()==0)
continue;
if (s.begins_with("content-length:")) {
@@ -316,7 +316,7 @@ Error HTTPClient::poll(){
}
if (s.begins_with("transfer-encoding:")) {
- String encoding = s.substr(s.find(":")+1,s.length()).strip_edges();
+ String encoding = header.substr(header.find(":")+1,header.length()).strip_edges();
//print_line("TRANSFER ENCODING: "+encoding);
if (encoding=="chunked") {
chunked=true;
@@ -330,7 +330,7 @@ Error HTTPClient::poll(){
response_num=num.to_int();
} else {
- response_headers.push_back(s);
+ response_headers.push_back(header);
}
}
diff --git a/core/io/resource_format_xml.cpp b/core/io/resource_format_xml.cpp
index 8c8d79948a..03b77a4aab 100644
--- a/core/io/resource_format_xml.cpp
+++ b/core/io/resource_format_xml.cpp
@@ -1796,6 +1796,7 @@ Error ResourceInteractiveLoaderXML::rename_dependencies(FileAccess *p_f, const S
fw->store_8(c);
c=f->get_8();
}
+ f->close();
bool all_ok = fw->get_error()==OK;
diff --git a/core/os/memory.h b/core/os/memory.h
index 98b973bc06..8eb5ceccb6 100644
--- a/core/os/memory.h
+++ b/core/os/memory.h
@@ -308,11 +308,11 @@ T* memnew_arr_template(size_t p_elements,const char *p_descr="") {
same strategy used by std::vector, and the DVector class, so it should be safe.*/
size_t len = sizeof(T) * p_elements;
- unsigned int *mem = (unsigned int*)Memory::alloc_static( len + DEFAULT_ALIGNMENT, p_descr );
+ unsigned int *mem = (unsigned int*)Memory::alloc_static( len + MAX(sizeof(size_t), DEFAULT_ALIGNMENT), p_descr );
T *failptr=0; //get rid of a warning
ERR_FAIL_COND_V( !mem, failptr );
*mem=p_elements;
- mem = (unsigned int *)( ((uint8_t*)mem) + DEFAULT_ALIGNMENT);
+ mem = (unsigned int *)( ((uint8_t*)mem) + MAX(sizeof(size_t), DEFAULT_ALIGNMENT));
T* elems = (T*)mem;
/* call operator new */
@@ -331,14 +331,14 @@ T* memnew_arr_template(size_t p_elements,const char *p_descr="") {
template<typename T>
size_t memarr_len(const T *p_class) {
- uint8_t* ptr = ((uint8_t*)p_class) - DEFAULT_ALIGNMENT;
+ uint8_t* ptr = ((uint8_t*)p_class) - MAX(sizeof(size_t), DEFAULT_ALIGNMENT);
return *(size_t*)ptr;
}
template<typename T>
void memdelete_arr(T *p_class) {
- unsigned int * elems = (unsigned int*)(((uint8_t*)p_class) - DEFAULT_ALIGNMENT);
+ unsigned int * elems = (unsigned int*)(((uint8_t*)p_class) - MAX(sizeof(size_t), DEFAULT_ALIGNMENT));
for (unsigned int i=0;i<*elems;i++) {
diff --git a/core/os/os.cpp b/core/os/os.cpp
index 0bc06c8375..1aee6d9aa2 100644
--- a/core/os/os.cpp
+++ b/core/os/os.cpp
@@ -478,6 +478,10 @@ void OS::native_video_pause() {
};
+void OS::native_video_unpause() {
+
+};
+
void OS::native_video_stop() {
};
diff --git a/core/os/os.h b/core/os/os.h
index 0d4edb035d..a80b81bfa2 100644
--- a/core/os/os.h
+++ b/core/os/os.h
@@ -376,6 +376,7 @@ public:
virtual Error native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track);
virtual bool native_video_is_playing() const;
virtual void native_video_pause();
+ virtual void native_video_unpause();
virtual void native_video_stop();
virtual bool can_use_threads() const;
diff --git a/core/typedefs.h b/core/typedefs.h
index 91d4b8f81d..48acca326e 100644
--- a/core/typedefs.h
+++ b/core/typedefs.h
@@ -74,7 +74,7 @@
#endif
#ifndef DEFAULT_ALIGNMENT
-#define DEFAULT_ALIGNMENT 16
+#define DEFAULT_ALIGNMENT 1
#endif
diff --git a/doc/base/classes.xml b/doc/base/classes.xml
index 59455d480d..9f12c7cb52 100644
--- a/doc/base/classes.xml
+++ b/doc/base/classes.xml
@@ -5433,7 +5433,7 @@
Standard themed Button.
</brief_description>
<description>
- Button is just the standard themed button: [image src="images/button_example.png"/] It can contain text and an icon, and will display them according to the current [Theme].
+ Button is the standard themed button. It can contain text and an icon, and will display them according to the current [Theme].
</description>
<methods>
<method name="set_text">
@@ -13032,7 +13032,9 @@ Returns an empty String "" at the end of the list.
<return type="Dictionary">
</return>
<description>
- Returns all response headers as dictionary where the keys and values are transformed to lower case. A key with more than one value is a simple string with "; " as separator. example: (content-length:12), (content-type:application/json; charset=utf-8)
+ Returns all response headers as dictionary where the case-sensitivity of the keys and values is kept like the server delivers it. A value is a simple String, this string can have more than one value where "; " is used as separator.
+Structure: ("key":"value1; value2")
+Example: (content-length:12), (Content-Type:application/json; charset=UTF-8)
</description>
</method>
<method name="get_response_body_length" qualifiers="const">
@@ -19383,10 +19385,12 @@ Returns an empty String "" at the end of the list.
</class>
<class name="NodePath" category="Built-In Types">
<brief_description>
- Built-in type optimized for path traversing.
+ Pre-parsed scene tree path.
</brief_description>
<description>
- Built-in type optimized for path traversing. A Node path is an optimized compiled path used for traversing the scene tree. It references nodes and can reference properties in that node, or even reference properties inside the resources of the node.
+ A pre-parsed relative or absolute path in a scene tree, for use with [method Node.get_node] and similar functions. It can reference a node, a resource within a node, or a property of a node or resource. For instance, [code]"Path2D/PathFollow2D/Sprite:texture:size"[/code] would refer to the size property of the texture resource on the node named "Sprite" which is a child of the other named nodes in the path. Note that if you want to get a resource, you must end the path with a colon, otherwise the last element will be used as a property name.
+ You will usually just pass a string to [method Node.get_node] and it will be automatically converted, but you may occasionally want to parse a path ahead of time with [NodePath] or the literal syntax [code]@"path"[/code]. Exporting a [NodePath] variable will give you a node selection widget in the properties panel of the editor, which can often be useful.
+ A [NodePath] is made up of a list of node names, a list of "subnode" (resource) names, and the name of a property in the final node or resource.
</description>
<methods>
<method name="get_name">
@@ -19395,21 +19399,21 @@ Returns an empty String "" at the end of the list.
<argument index="0" name="idx" type="int">
</argument>
<description>
- Return a path level name.
+ Get the node name indicated by [code]idx[/code] (0 to [method get_name_count])
</description>
</method>
<method name="get_name_count">
<return type="int">
</return>
<description>
- Return the path level count.
+ Get the number of node names which make up the path.
</description>
</method>
<method name="get_property">
<return type="String">
</return>
<description>
- Return the property associated (empty if none).
+ Get the path's property name, or an empty string if the path doesn't have a property.
</description>
</method>
<method name="get_subname">
@@ -19418,14 +19422,14 @@ Returns an empty String "" at the end of the list.
<argument index="0" name="idx" type="int">
</argument>
<description>
- Return the subname level name.
+ Get the resource name indicated by [code]idx[/code] (0 to [method get_subname_count])
</description>
</method>
<method name="get_subname_count">
<return type="int">
</return>
<description>
- Return the subname count.
+ Get the number of resource names in the path.
</description>
</method>
<method name="is_absolute">
@@ -19448,6 +19452,7 @@ Returns an empty String "" at the end of the list.
<argument index="0" name="from" type="String">
</argument>
<description>
+ Create a NodePath from a string, e.g. "Path2D/PathFollow2D/Sprite:texture:size". A path is absolute if it starts with a slash. Absolute paths are only valid in the global scene tree, not within individual scenes. In a relative path, [code]"."[/code] and [code]".."[/code] indicate the current node and its parent.
</description>
</method>
</methods>
@@ -20052,6 +20057,10 @@ Returns an empty String "" at the end of the list.
<description>
</description>
</method>
+ <method name="native_video_unpause">
+ <description>
+ </description>
+ </method>
<method name="get_scancode_string" qualifiers="const">
<return type="String">
</return>
@@ -20178,7 +20187,7 @@ Returns an empty String "" at the end of the list.
Base class for all non built-in types. Everything not a built-in type starts the inheritance chain from this class.
Objects do not manage memory, if inheriting from one the object will most likely have to be deleted manually (call the [method free] function from the script or delete from C++).
Some derivates add memory management, such as [Reference] (which keeps a reference count and deletes itself automatically when no longer referenced) and [Node], which deletes the children tree when deleted.
- Objects export properties, which are mainly useful for storage and editing, but not really so much in programming. Properties are exported in [method _get_property_list] and handled in [method _get] and [method _set]. However, scripting languages and C++ have simper means to export them.
+ Objects export properties, which are mainly useful for storage and editing, but not really so much in programming. Properties are exported in [method _get_property_list] and handled in [method _get] and [method _set]. However, scripting languages and C++ have simpler means to export them.
Objects also receive notifications ([method _notification]). Notifications are a simple way to notify the object about simple events, so they can all be handled together.
</description>
<methods>
@@ -28597,7 +28606,7 @@ This method controls whether the position between two cached points is interpola
<argument index="0" name="state" type="Physics2DDirectBodyState">
</argument>
<description>
- Override this function to use a custom force integrator. This allows to hook up to the physics processing and alter the simulation state for the object on every frame.
+ Called during physics processing, allowing you to read and safely modify the simulation state for the object. By default it works in addition to the usual physics behavior, but [method set_use_custom_integrator] allows you to disable the default behavior and do fully custom force integration for a body.
</description>
</method>
<method name="set_mode">
@@ -28758,7 +28767,7 @@ This method controls whether the position between two cached points is interpola
<argument index="0" name="enable" type="bool">
</argument>
<description>
- Set to true if the body shall not do any internal force integration at all (like gravity or air friction). Only the [method _integrate_forces] will be able to integrate them if overrided.
+ Pass true to disable the internal force integration (like gravity or air friction) for this body. Other than collision response, the body will only move as determined by the [method _integrate_forces] function, if defined.
</description>
</method>
<method name="is_using_custom_integrator">
diff --git a/main/input_default.cpp b/main/input_default.cpp
index 90d406810a..d2aed239cb 100644
--- a/main/input_default.cpp
+++ b/main/input_default.cpp
@@ -487,6 +487,7 @@ static const char *s_ControllerMappings [] =
"030000006f0e00001304000000010000,Generic X-Box pad,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,",
"030000006f0e00001e01000011010000,Rock Candy Gamepad for PS3,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,",
"030000006f0e00001f01000000010000,Generic X-Box pad,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,",
+ "030000006f0e00002801000011010000,PDP Rock Candy Wireless Controller for PS3,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b11,rightshoulder:b5,rightx:a2,start:b9,righty:a3,dpleft:h0.8,lefttrigger:b6,x:b0,dpup:h0.1,back:b8,leftstick:b10,leftshoulder:b4,y:b3,a:b1,dpright:h0.2,righttrigger:b7,b:b2,",
"030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,",
"03000000790000000600000010010000,DragonRise Inc. Generic USB Joystick,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,",
"03000000790000001100000010010000,RetroLink Saturn Classic Controller,x:b3,a:b0,b:b1,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,",
@@ -501,19 +502,22 @@ static const char *s_ControllerMappings [] =
"03000000c9110000f055000011010000,HJC Game GAMEPAD,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b4,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,",
"03000000de280000ff11000001000000,Valve Streaming Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
"03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,",
+ "03000000fd0500002a26000000010000,3dfx InterAct HammerHead FX,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b5,rightshoulder:b7,rightx:a2,start:b11,righty:a3,dpleft:h0.8,lefttrigger:b8,x:b0,dpup:h0.1,back:b10,leftstick:b2,leftshoulder:b6,y:b1,a:b3,dpright:h0.2,righttrigger:b9,b:b4,",
"03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,",
- "05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,",
- "05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,",
+ "05000000362800000100000002010000,OUYA Game Controller,leftx:a0,lefty:a1,dpdown:b9,rightstick:b7,rightshoulder:b5,rightx:a3,start:b16,righty:a4,dpleft:b10,lefttrigger:b12,x:b1,dpup:b8,back:b14,leftstick:b6,leftshoulder:b4,y:b2,a:b0,dpright:b11,righttrigger:b13,b:b3,",
+ "05000000362800000100000003010000,OUYA Game Controller,leftx:a0,lefty:a1,dpdown:b9,rightstick:b7,rightshoulder:b5,rightx:a3,start:b16,righty:a4,dpleft:b10,lefttrigger:b12,x:b1,dpup:b8,back:b14,leftstick:b6,leftshoulder:b4,y:b2,a:b0,dpright:b11,righttrigger:b13,b:b3,",
"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
"050000004c050000c405000000010000,PS4 Controller (Bluetooth),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
"050000007e0500003003000001000000,Nintendo Wii U Pro Controller,a:b0,b:b1,x:b3,y:b2,back:b8,start:b9,guide:b10,leftshoulder:b4,rightshoulder:b5,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16,",
"05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,y:b3,x:b2,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,",
"060000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,",
+
#endif
#if defined(__ANDROID__)
"Default Android Gamepad,Default Controller,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b8,rightshoulder:b10,rightx:a2,start:b6,righty:a3,dpleft:h0.8,lefttrigger:a4,x:b2,dpup:h0.1,back:b4,leftstick:b7,leftshoulder:b9,y:b3,a:b0,dpright:h0.2,righttrigger:a5,b:b1,",
"4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,",
+ "484f524920434f2e2c4c544420205041,Hori Gem Pad 3,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b6,rightshoulder:b18,rightx:a2,start:b16,righty:a3,dpleft:h0.8,lefttrigger:b9,x:b0,dpup:h0.1,back:b15,leftstick:b4,leftshoulder:b3,y:b2,a:b1,dpright:h0.2,righttrigger:b10,b:b17,",
#endif
#ifdef JAVASCRIPT_ENABLED
diff --git a/modules/gdscript/gd_editor.cpp b/modules/gdscript/gd_editor.cpp
index b4e5c04c95..ff19518ad5 100644
--- a/modules/gdscript/gd_editor.cpp
+++ b/modules/gdscript/gd_editor.cpp
@@ -52,6 +52,7 @@ String GDScriptLanguage::get_template(const String& p_class_name, const String&
"# var a=2\n"+
"# var b=\"textvar\"\n\n"+
"func _ready():\n"+
+ "\t# Called every time the node is added to the scene.\n"+
"\t# Initialization here\n"+
"\tpass\n"+
"\n"+
diff --git a/platform/iphone/gl_view.mm b/platform/iphone/gl_view.mm
index 88361e87e4..94fbb9e174 100755
--- a/platform/iphone/gl_view.mm
+++ b/platform/iphone/gl_view.mm
@@ -58,6 +58,7 @@ void _show_keyboard(String);
void _hide_keyboard();
bool _play_video(String, float, String, String);
bool _is_video_playing();
+void _pause_video();
void _focus_out_video();
void _unpause_video();
void _stop_video();
@@ -74,64 +75,30 @@ void _hide_keyboard() {
keyboard_text = "";
};
-/*
-bool _play_video(String p_path, float p_volume) {
-
- float player_volume = p_volume * AudioServer::get_singleton()->get_singleton()->get_stream_global_volume_scale();
- video_previous_volume = [[MPMusicPlayerController applicationMusicPlayer] volume];
-
- //[[MPMusicPlayerController applicationMusicPlayer] setVolume: player_volume];
-
- p_path = Globals::get_singleton()->globalize_path(p_path);
-
- NSString* file_path = [[[NSString alloc] initWithUTF8String:p_path.utf8().get_data()] autorelease];
- NSURL *file_url = [NSURL fileURLWithPath:file_path];
-
- _instance.moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:file_url];
- _instance.moviePlayerController.controlStyle = MPMovieControlStyleNone;
- [_instance.moviePlayerController setScalingMode:MPMovieScalingModeAspectFit];
- //[_instance.moviePlayerController setScalingMode:MPMovieScalingModeAspectFill];
-
- [[NSNotificationCenter defaultCenter] addObserver:_instance
- selector:@selector(moviePlayBackDidFinish:)
- name:MPMoviePlayerPlaybackDidFinishNotification
- object:_instance.moviePlayerController];
-
- [_instance.moviePlayerController.view setFrame:_instance.bounds];
- _instance.moviePlayerController.view.userInteractionEnabled = NO;
- [_instance addSubview:_instance.moviePlayerController.view];
- [_instance.moviePlayerController play];
-
- video_playing = true;
-
- return true;
-}
-*/
-
bool _play_video(String p_path, float p_volume, String p_audio_track, String p_subtitle_track) {
p_path = Globals::get_singleton()->globalize_path(p_path);
NSString* file_path = [[[NSString alloc] initWithUTF8String:p_path.utf8().get_data()] autorelease];
- //NSURL *file_url = [NSURL fileURLWithPath:file_path];
_instance.avAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:file_path]];
+
_instance.avPlayerItem =[[AVPlayerItem alloc]initWithAsset:_instance.avAsset];
[_instance.avPlayerItem addObserver:_instance forKeyPath:@"status" options:0 context:nil];
- _instance.avPlayer = [[AVPlayer alloc]initWithPlayerItem:_instance.avPlayerItem];
- _instance.avPlayerLayer =[AVPlayerLayer playerLayerWithPlayer:_instance.avPlayer];
+ _instance.avPlayer = [[AVPlayer alloc]initWithPlayerItem:_instance.avPlayerItem];
+ _instance.avPlayerLayer =[AVPlayerLayer playerLayerWithPlayer:_instance.avPlayer];
- [_instance.avPlayer addObserver:_instance forKeyPath:@"status" options:0 context:nil];
- [[NSNotificationCenter defaultCenter] addObserver:_instance
+ [_instance.avPlayer addObserver:_instance forKeyPath:@"status" options:0 context:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:_instance
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[_instance.avPlayer currentItem]];
[_instance.avPlayer addObserver:_instance forKeyPath:@"rate" options:NSKeyValueObservingOptionNew context:0];
- [_instance.avPlayerLayer setFrame:_instance.bounds];
- [_instance.layer addSublayer:_instance.avPlayerLayer];
- [_instance.avPlayer play];
+ [_instance.avPlayerLayer setFrame:_instance.bounds];
+ [_instance.layer addSublayer:_instance.avPlayerLayer];
+ [_instance.avPlayer play];
AVMediaSelectionGroup *audioGroup = [_instance.avAsset mediaSelectionGroupForMediaCharacteristic: AVMediaCharacteristicAudible];
@@ -173,23 +140,19 @@ bool _play_video(String p_path, float p_volume, String p_audio_track, String p_s
}
}
- video_playing = true;
+ video_playing = true;
return true;
}
bool _is_video_playing() {
- //NSInteger playback_state = _instance.moviePlayerController.playbackState;
- //return video_playing || _instance.moviePlayerController.playbackState == MPMoviePlaybackStatePlaying;
- //if (video_found_error)
- // return false;
- //return (_instance.moviePlayerController.playbackState == MPMoviePlaybackStatePlaying);
-
- return video_playing || (_instance.avPlayer.rate > 0 && !_instance.avPlayer.error);
+ if (_instance.avPlayer.error) {
+ printf("Error during playback\n");
+ }
+ return (_instance.avPlayer.rate > 0 && !_instance.avPlayer.error);
}
void _pause_video() {
- //[_instance.moviePlayerController pause];
video_current_time = _instance.avPlayer.currentTime;
[_instance.avPlayer pause];
video_playing = false;
@@ -204,15 +167,9 @@ void _unpause_video() {
[_instance.avPlayer play];
video_playing = true;
-
- //video_current_time = kCMTimeZero;
};
void _stop_video() {
- //[_instance.moviePlayerController stop];
- //[_instance.moviePlayerController.view removeFromSuperview];
- //[[MPMusicPlayerController applicationMusicPlayer] setVolume: video_previous_volume];
-
[_instance.avPlayer pause];
[_instance.avPlayerLayer removeFromSuperlayer];
_instance.avPlayer = nil;
diff --git a/platform/iphone/os_iphone.cpp b/platform/iphone/os_iphone.cpp
index ec62cb5c26..9f6b8433aa 100644
--- a/platform/iphone/os_iphone.cpp
+++ b/platform/iphone/os_iphone.cpp
@@ -41,6 +41,7 @@
#include "core/os/dir_access.h"
#include "core/os/file_access.h"
+#include "core/io/file_access_pack.h"
#include "core/globals.h"
#include "sem_iphone.h"
@@ -517,12 +518,25 @@ extern void _focus_out_video();
Error OSIPhone::native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track) {
FileAccess* f = FileAccess::open(p_path, FileAccess::READ);
bool exists = f && f->is_open();
- printf("file exists for %ls, %i, %p\n", p_path.c_str(), (int)exists, f);
- if (f)
- memdelete(f);
+
+ String tempFile = get_data_dir();
if (!exists)
return FAILED;
- if ( _play_video(p_path, p_volume, p_audio_track, p_subtitle_track) )
+
+ if (p_path.begins_with("res://")) {
+ if (PackedData::get_singleton()->has_path(p_path)) {
+ print("Unable to play %S using the native player as it resides in a .pck file\n", p_path.c_str());
+ return ERR_INVALID_PARAMETER;
+ } else {
+ p_path = p_path.replace("res:/", Globals::get_singleton()->get_resource_path());
+ }
+ } else if (p_path.begins_with("user://"))
+ p_path = p_path.replace("user:/", get_data_dir());
+
+ memdelete(f);
+
+ print("Playing video: %S\n", p_path.c_str());
+ if (_play_video(p_path, p_volume, p_audio_track, p_subtitle_track) )
return OK;
return FAILED;
}
diff --git a/platform/iphone/os_iphone.h b/platform/iphone/os_iphone.h
index abe797fed1..d34e8bfe95 100644
--- a/platform/iphone/os_iphone.h
+++ b/platform/iphone/os_iphone.h
@@ -195,12 +195,12 @@ public:
void set_unique_ID(String p_ID);
String get_unique_ID() const;
- virtual Error native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track);
- virtual bool native_video_is_playing() const;
- virtual void native_video_pause();
+ virtual Error native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track);
+ virtual bool native_video_is_playing() const;
+ virtual void native_video_pause();
virtual void native_video_unpause();
virtual void native_video_focus_out();
- virtual void native_video_stop();
+ virtual void native_video_stop();
OSIPhone(int width, int height);
~OSIPhone();
diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp
index 2014c9730f..1cd6399962 100644
--- a/scene/2d/tile_map.cpp
+++ b/scene/2d/tile_map.cpp
@@ -450,6 +450,7 @@ void TileMap::_update_dirty_quadrants() {
_fix_cell_transform(xform,c,shape_ofs+center_ofs,s);
if (debug_canvas_item) {
+ vs->canvas_item_add_set_transform(debug_canvas_item,xform);
shape->draw(debug_canvas_item,debug_collision_color);
}
@@ -459,6 +460,10 @@ void TileMap::_update_dirty_quadrants() {
}
}
+ if (debug_canvas_item) {
+ vs->canvas_item_add_set_transform(debug_canvas_item,Matrix32());
+ }
+
if (navigation) {
Ref<NavigationPolygon> navpoly = tile_set->tile_get_navigation_polygon(c.id);
if (navpoly.is_valid()) {
diff --git a/scene/audio/event_player.cpp b/scene/audio/event_player.cpp
index eabe84a8ee..f43c3c2a59 100644
--- a/scene/audio/event_player.cpp
+++ b/scene/audio/event_player.cpp
@@ -54,6 +54,8 @@ void EventPlayer::set_stream(const Ref<EventStream> &p_stream) {
stream=p_stream;
if (stream.is_valid())
playback=stream->instance_playback();
+ else
+ playback.unref();
if (playback.is_valid()) {
diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp
index 4c23ddbaf7..a9010e79a2 100644
--- a/scene/resources/packed_scene.cpp
+++ b/scene/resources/packed_scene.cpp
@@ -1316,11 +1316,23 @@ StringName SceneState::get_node_name(int p_idx) const {
return names[nodes[p_idx].name];
}
+
+bool SceneState::is_node_instance_placeholder(int p_idx) const {
+
+ ERR_FAIL_INDEX_V(p_idx,nodes.size(),false);
+
+ return nodes[p_idx].instance>=0 && nodes[p_idx].instance&FLAG_INSTANCE_IS_PLACEHOLDER;
+
+}
+
Ref<PackedScene> SceneState::get_node_instance(int p_idx) const {
ERR_FAIL_INDEX_V(p_idx,nodes.size(),Ref<PackedScene>());
if (nodes[p_idx].instance>=0) {
- return variants[nodes[p_idx].instance];
+ if (nodes[p_idx].instance&FLAG_INSTANCE_IS_PLACEHOLDER)
+ return Ref<PackedScene>();
+ else
+ return variants[nodes[p_idx].instance&FLAG_MASK];
} else if (nodes[p_idx].parent<0 || nodes[p_idx].parent==NO_PARENT_SAVED) {
if (base_scene_idx>=0) {
@@ -1334,6 +1346,19 @@ Ref<PackedScene> SceneState::get_node_instance(int p_idx) const {
}
+
+String SceneState::get_node_instance_placeholder(int p_idx) const {
+
+ ERR_FAIL_INDEX_V(p_idx,nodes.size(),String());
+
+ if (nodes[p_idx].instance>=0 && nodes[p_idx].instance&FLAG_INSTANCE_IS_PLACEHOLDER) {
+ return variants[nodes[p_idx].instance&FLAG_MASK];
+ }
+
+ return String();
+
+}
+
Vector<StringName> SceneState::get_node_groups(int p_idx) const{
ERR_FAIL_INDEX_V(p_idx,nodes.size(),Vector<StringName>());
Vector<StringName> groups;
@@ -1577,6 +1602,8 @@ void SceneState::_bind_methods() {
ObjectTypeDB::bind_method(_MD("get_node_name","idx"),&SceneState::get_node_name);
ObjectTypeDB::bind_method(_MD("get_node_path","idx","for_parent"),&SceneState::get_node_path,DEFVAL(false));
ObjectTypeDB::bind_method(_MD("get_node_owner_path","idx"),&SceneState::get_node_owner_path);
+ ObjectTypeDB::bind_method(_MD("is_node_instance_placeholder","idx"),&SceneState::is_node_instance_placeholder);
+ ObjectTypeDB::bind_method(_MD("get_node_instance_placeholder","idx"),&SceneState::get_node_instance_placeholder);
ObjectTypeDB::bind_method(_MD("get_node_instance:PackedScene","idx"),&SceneState::get_node_instance);
ObjectTypeDB::bind_method(_MD("get_node_groups","idx"),&SceneState::_get_node_groups);
ObjectTypeDB::bind_method(_MD("get_node_property_count","idx"),&SceneState::get_node_property_count);
diff --git a/scene/resources/packed_scene.h b/scene/resources/packed_scene.h
index 7fda4392d8..6a26cc472c 100644
--- a/scene/resources/packed_scene.h
+++ b/scene/resources/packed_scene.h
@@ -48,11 +48,7 @@ class SceneState : public Reference {
int base_scene_idx;
enum {
- FLAG_ID_IS_PATH=(1<<30),
- FLAG_INSTANCE_IS_PLACEHOLDER=(1<<30),
- FLAG_MASK=(1<<24)-1,
NO_PARENT_SAVED=0x7FFFFFFF,
-
};
struct NodeData {
@@ -115,7 +111,10 @@ protected:
public:
enum {
- TYPE_INSTANCED=0x7FFFFFFF
+ FLAG_ID_IS_PATH=(1<<30),
+ TYPE_INSTANCED=0x7FFFFFFF,
+ FLAG_INSTANCE_IS_PLACEHOLDER=(1<<30),
+ FLAG_MASK=(1<<24)-1,
};
static void set_disable_placeholders(bool p_disable);
@@ -148,6 +147,8 @@ public:
NodePath get_node_path(int p_idx,bool p_for_parent=false) const;
NodePath get_node_owner_path(int p_idx) const;
Ref<PackedScene> get_node_instance(int p_idx) const;
+ String get_node_instance_placeholder(int p_idx) const;
+ bool is_node_instance_placeholder(int p_idx) const;
Vector<StringName> get_node_groups(int p_idx) const;
int get_node_property_count(int p_idx) const;
diff --git a/scene/resources/scene_format_text.cpp b/scene/resources/scene_format_text.cpp
index d9f6beabc0..6bd5f520d2 100644
--- a/scene/resources/scene_format_text.cpp
+++ b/scene/resources/scene_format_text.cpp
@@ -389,6 +389,22 @@ Error ResourceInteractiveLoaderText::poll() {
}
}
+ if (next_tag.fields.has("instance_placeholder")) {
+
+ String path=next_tag.fields["instance_placeholder"];
+
+ int path_v = packed_scene->get_state()->add_value(path);
+
+ if (packed_scene->get_state()->get_node_count()==0) {
+ error=ERR_FILE_CORRUPT;
+ error_text="Instance Placeholder can't be used for inheritance.";
+ _printerr();
+ return error;
+ }
+
+ instance=path_v|SceneState::FLAG_INSTANCE_IS_PLACEHOLDER;
+ }
+
if (next_tag.fields.has("owner")) {
owner=packed_scene->get_state()->add_node_path(next_tag.fields["owner"]);
} else {
@@ -720,6 +736,7 @@ Error ResourceInteractiveLoaderText::rename_dependencies(FileAccess *p_f, const
fw->store_8(c);
c=f->get_8();
}
+ f->close();
bool all_ok = fw->get_error()==OK;
@@ -1124,7 +1141,10 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path,const RES& p_re
if (packed_scene.is_valid()) {
//add instances to external resources if saving a packed scene
for(int i=0;i<packed_scene->get_state()->get_node_count();i++) {
- Ref<PackedScene> instance=packed_scene->get_state()->get_node_instance(i);
+ if (packed_scene->get_state()->is_node_instance_placeholder(i))
+ continue;
+
+ Ref<PackedScene> instance=packed_scene->get_state()->get_node_instance(i);
if (instance.is_valid() && !external_resources.has(instance)) {
int index = external_resources.size();
external_resources[instance]=index;
@@ -1268,8 +1288,10 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path,const RES& p_re
NodePath path = state->get_node_path(i,true);
NodePath owner = state->get_node_owner_path(i);
Ref<PackedScene> instance = state->get_node_instance(i);
+ String instance_placeholder = state->get_node_instance_placeholder(i);
Vector<StringName> groups = state->get_node_groups(i);
+
if (instance.is_valid())
print_line("for path "+String(path)+" instance "+instance->get_path());
@@ -1298,6 +1320,14 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path,const RES& p_re
f->store_string(header);
+ if (instance_placeholder!=String()) {
+
+ String vars;
+ f->store_string(" instance_placeholder=");
+ VariantWriter::write_to_string(instance_placeholder,vars,_write_resources,this);
+ f->store_string(vars);
+ }
+
if (instance.is_valid()) {
String vars;
diff --git a/tools/editor/editor_node.cpp b/tools/editor/editor_node.cpp
index 227ce24aa5..7fa85c4476 100644
--- a/tools/editor/editor_node.cpp
+++ b/tools/editor/editor_node.cpp
@@ -380,6 +380,10 @@ void EditorNode::_notification(int p_what) {
_menu_option_confirm(FILE_QUIT, false);
};
+ if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
+ scene_tabs->set_tab_close_display_policy( (bool(EDITOR_DEF("global/always_show_close_button_in_scene_tabs", false)) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY) );
+ }
+
}
void EditorNode::_fs_changed() {
@@ -5059,7 +5063,7 @@ EditorNode::EditorNode() {
scene_tabs=memnew( Tabs );
scene_tabs->add_tab("unsaved");
scene_tabs->set_tab_align(Tabs::ALIGN_CENTER);
- scene_tabs->set_tab_close_display_policy(Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY);
+ scene_tabs->set_tab_close_display_policy( (bool(EDITOR_DEF("global/always_show_close_button_in_scene_tabs", false)) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY) );
scene_tabs->connect("tab_changed",this,"_scene_tab_changed");
scene_tabs->connect("right_button_pressed",this,"_scene_tab_script_edited");
scene_tabs->connect("tab_close", this, "_scene_tab_closed");
diff --git a/tools/editor/editor_settings.cpp b/tools/editor/editor_settings.cpp
index e8b40bdcf3..78fde9950d 100644
--- a/tools/editor/editor_settings.cpp
+++ b/tools/editor/editor_settings.cpp
@@ -165,22 +165,33 @@ void EditorSettings::create() {
return; //pointless
DirAccess *dir=NULL;
- Object *object;
Variant meta;
String config_path;
String config_dir;
String config_file="editor_settings.xml";
+ Ref<ConfigFile> extra_config = memnew(ConfigFile);
- if (OS::get_singleton()->has_environment("APPDATA")) {
- // Most likely under windows, save here
- config_path=OS::get_singleton()->get_environment("APPDATA");
- config_dir=String(_MKSTR(VERSION_SHORT_NAME)).capitalize();
- } else if (OS::get_singleton()->has_environment("HOME")) {
+ String exe_path = OS::get_singleton()->get_executable_path().get_base_dir();
+ DirAccess* d = DirAccess::create_for_path(exe_path);
+ if (d->file_exists(exe_path + "/._sc_")) {
- config_path=OS::get_singleton()->get_environment("HOME");
- config_dir="."+String(_MKSTR(VERSION_SHORT_NAME)).to_lower();
- }
+ // editor is self contained
+ config_path = exe_path;
+ config_dir = "editor_data";
+ extra_config->load(exe_path + "/._sc_");
+ } else {
+
+ if (OS::get_singleton()->has_environment("APPDATA")) {
+ // Most likely under windows, save here
+ config_path=OS::get_singleton()->get_environment("APPDATA");
+ config_dir=String(_MKSTR(VERSION_SHORT_NAME)).capitalize();
+ } else if (OS::get_singleton()->has_environment("HOME")) {
+
+ config_path=OS::get_singleton()->get_environment("HOME");
+ config_dir="."+String(_MKSTR(VERSION_SHORT_NAME)).to_lower();
+ }
+ };
ObjectTypeDB::register_type<EditorSettings>(); //otherwise it can't be unserialized
String config_file_path;
@@ -286,10 +297,20 @@ void EditorSettings::create() {
fail:
+ // patch init projects
+ if (extra_config->has_section("init_projects")) {
+ Vector<String> list = extra_config->get_value("init_projects", "list");
+ for (int i=0; i<list.size(); i++) {
+
+ list[i] = exe_path + "/" + list[i];
+ };
+ extra_config->set_value("init_projects", "list", list);
+ };
+
singleton = Ref<EditorSettings>( memnew( EditorSettings ) );
singleton->config_file_path=config_file_path;
singleton->settings_path=config_path+"/"+config_dir;
- singleton->_load_defaults();
+ singleton->_load_defaults(extra_config);
singleton->setup_network();
singleton->scan_plugins();
@@ -435,7 +456,7 @@ void EditorSettings::destroy() {
singleton=Ref<EditorSettings>();
}
-void EditorSettings::_load_defaults() {
+void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_THREAD_SAFE_METHOD_
@@ -542,6 +563,17 @@ void EditorSettings::_load_defaults() {
set("run/auto_save_before_running",true);
set("resources/save_compressed_resources",true);
set("resources/auto_reload_modified_images",true);
+
+ if (p_extra_config.is_valid() && p_extra_config->has_section("init_projects") && p_extra_config->has_section_key("init_projects", "list")) {
+
+ Vector<String> list = p_extra_config->get_value("init_projects", "list");
+ for (int i=0; i<list.size(); i++) {
+
+ String name = list[i].replace("/", "::");
+ set("projects/"+name, list[i]);
+ };
+ };
+
}
void EditorSettings::notify_changes() {
diff --git a/tools/editor/editor_settings.h b/tools/editor/editor_settings.h
index d1a11360af..40aa00015e 100644
--- a/tools/editor/editor_settings.h
+++ b/tools/editor/editor_settings.h
@@ -33,6 +33,7 @@
#include "resource.h"
#include "os/thread_safe.h"
+#include "core/io/config_file.h"
class EditorPlugin;
@@ -86,7 +87,7 @@ private:
EditorPlugin *_load_plugin_editor(const String& p_path);
Error _load_plugin(const String& p_path,Plugin& plugin);
- void _load_defaults();
+ void _load_defaults(Ref<ConfigFile> p_extra_config = NULL);
String project_config_path;
diff --git a/tools/editor/plugins/animation_player_editor_plugin.cpp b/tools/editor/plugins/animation_player_editor_plugin.cpp
index fcb9f4db14..010753e88c 100644
--- a/tools/editor/plugins/animation_player_editor_plugin.cpp
+++ b/tools/editor/plugins/animation_player_editor_plugin.cpp
@@ -621,10 +621,11 @@ void AnimationPlayerEditor::ensure_visibility() {
Dictionary AnimationPlayerEditor::get_state() const {
+
Dictionary d;
d["visible"]=is_visible();
- if (is_visible() && player) {
+ if (EditorNode::get_singleton()->get_edited_scene() && is_visible() && player) {
d["player"]=EditorNode::get_singleton()->get_edited_scene()->get_path_to(player);
d["animation"]=player->get_current_animation();
@@ -637,6 +638,9 @@ void AnimationPlayerEditor::set_state(const Dictionary& p_state) {
if (p_state.has("visible") && p_state["visible"]) {
+ if (!EditorNode::get_singleton()->get_edited_scene())
+ return;
+
Node *n = EditorNode::get_singleton()->get_edited_scene()->get_node(p_state["player"]);
if (n && n->cast_to<AnimationPlayer>()) {
player=n->cast_to<AnimationPlayer>();
diff --git a/tools/editor/plugins/canvas_item_editor_plugin.cpp b/tools/editor/plugins/canvas_item_editor_plugin.cpp
index f3ff001d84..f8bc97a433 100644
--- a/tools/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/tools/editor/plugins/canvas_item_editor_plugin.cpp
@@ -1560,7 +1560,7 @@ void CanvasItemEditor::_viewport_input_event(const InputEvent& p_event) {
Matrix32 rot;
rot.elements[1] = (dfrom - center).normalized();
rot.elements[0] = rot.elements[1].tangent();
- node->set_rot(snap_angle(rot.xform_inv(dto-center).angle(), node->get_rot()));
+ node->set_rot(snap_angle(rot.xform_inv(dto-center).angle() + node->get_rot(), node->get_rot()));
display_rotate_to = dto;
display_rotate_from = center;
viewport->update();
diff --git a/tools/editor/plugins/script_editor_plugin.cpp b/tools/editor/plugins/script_editor_plugin.cpp
index 18f3787cff..8d0527cff7 100644
--- a/tools/editor/plugins/script_editor_plugin.cpp
+++ b/tools/editor/plugins/script_editor_plugin.cpp
@@ -609,7 +609,7 @@ void ScriptEditor::_breaked(bool p_breaked,bool p_can_debug) {
void ScriptEditor::_show_debugger(bool p_show) {
- debug_menu->get_popup()->set_item_checked( debug_menu->get_popup()->get_item_index(DEBUG_SHOW), p_show);
+// debug_menu->get_popup()->set_item_checked( debug_menu->get_popup()->get_item_index(DEBUG_SHOW), p_show);
}
void ScriptEditor::_script_created(Ref<Script> p_script) {
@@ -979,7 +979,7 @@ void ScriptEditor::_menu_option(int p_option) {
} break;
case SEARCH_WEBSITE: {
- OS::get_singleton()->shell_open("http://www.godotengine.org/projects/godot-engine/wiki/Documentation#Tutorials");
+ OS::get_singleton()->shell_open("http://docs.godotengine.org/");
} break;
case WINDOW_NEXT: {
diff --git a/tools/editor/project_manager.cpp b/tools/editor/project_manager.cpp
index 589d9d3d99..579eb8c7c7 100644
--- a/tools/editor/project_manager.cpp
+++ b/tools/editor/project_manager.cpp
@@ -788,7 +788,7 @@ void ProjectManager::_erase_project() {
return;
- erase_ask->set_text("Erase project from list?? (Folder contents will not be modified)");
+ erase_ask->set_text("Remove project from list?? (Folder contents will not be modified)");
erase_ask->popup_centered_minsize();
}
@@ -943,7 +943,7 @@ ProjectManager::ProjectManager() {
Button* erase = memnew( Button );
- erase->set_text("Erase");
+ erase->set_text("Remove");
tree_vb->add_child(erase);
erase->connect("pressed", this,"_erase_project");
erase_btn=erase;
@@ -970,7 +970,7 @@ ProjectManager::ProjectManager() {
erase_ask = memnew( ConfirmationDialog );
- erase_ask->get_ok()->set_text("Erase");
+ erase_ask->get_ok()->set_text("Remove");
erase_ask->get_ok()->connect("pressed", this,"_erase_project_confirm");
add_child(erase_ask);
diff --git a/tools/scripts/sort-demos.sh b/tools/scripts/sort-demos.sh
new file mode 100644
index 0000000000..d4770b337e
--- /dev/null
+++ b/tools/scripts/sort-demos.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# When scanning for demos, the project manager sorts them based on their
+# timestamp, i.e. last modification date. This can make for a pretty
+# messy output, so this script 'touches' each engine.cfg file in reverse
+# alphabetical order to ensure a nice listing.
+#
+# It's good practice to run it once before packaging demos on the build
+# server.
+
+if [ ! -d "demos" ]; then
+ echo "Run this script from the root directory where 'demos/' is contained."
+ exit 1
+fi
+
+if [ -e demos.list ]; then
+ rm -f demos.list
+fi
+
+for dir in 2d 3d gui misc viewport; do
+ find "demos/$dir" -name "engine.cfg" |sort >> demos.list
+done
+cat demos.list |sort -r > demos_r.list
+
+while read line; do
+ touch $line
+ sleep 0.2
+done < demos_r.list
+
+#rm -f demos.list demos_r.list
diff --git a/tools/steam/community_capsule.jpg b/tools/steam/community_capsule.jpg
new file mode 100644
index 0000000000..abbc4793f7
--- /dev/null
+++ b/tools/steam/community_capsule.jpg
Binary files differ
diff --git a/tools/steam/community_capsule.png b/tools/steam/community_capsule.png
new file mode 100644
index 0000000000..ec9fa0a930
--- /dev/null
+++ b/tools/steam/community_capsule.png
Binary files differ
diff --git a/tools/steam/header.png b/tools/steam/header.png
new file mode 100644
index 0000000000..547b28df8d
--- /dev/null
+++ b/tools/steam/header.png
Binary files differ
diff --git a/tools/steam/icon32.icns b/tools/steam/icon32.icns
new file mode 100644
index 0000000000..6234e7d5ac
--- /dev/null
+++ b/tools/steam/icon32.icns
@@ -0,0 +1,1029 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg width="32" height="32">
+ <circle cx="0" cy="0" r="1" fill="white"/>
+ <circle cx="1" cy="0" r="1" fill="white"/>
+ <circle cx="2" cy="0" r="1" fill="white"/>
+ <circle cx="3" cy="0" r="1" fill="rgba(99.4095%,99.3835%,99.3835%,1)"/>
+ <circle cx="4" cy="0" r="1" fill="rgba(93.6355%,93.3593%,93.3593%,1)"/>
+ <circle cx="5" cy="0" r="1" fill="rgba(86.1707%,85.568%,85.568%,1)"/>
+ <circle cx="6" cy="0" r="1" fill="rgba(83.0671%,82.3316%,82.3316%,1)"/>
+ <circle cx="7" cy="0" r="1" fill="rgba(82.8702%,82.1271%,82.1271%,1)"/>
+ <circle cx="8" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="9" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="10" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="11" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="12" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="13" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="14" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="15" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="16" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="17" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="18" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="19" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="20" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="21" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="22" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="23" cy="0" r="1" fill="rgba(82.884%,82.1408%,82.1408%,1)"/>
+ <circle cx="24" cy="0" r="1" fill="rgba(82.8779%,82.1332%,82.1332%,1)"/>
+ <circle cx="25" cy="0" r="1" fill="rgba(82.9374%,82.1958%,82.1958%,1)"/>
+ <circle cx="26" cy="0" r="1" fill="rgba(85.2064%,84.5624%,84.5624%,1)"/>
+ <circle cx="27" cy="0" r="1" fill="rgba(92.0974%,91.754%,91.754%,1)"/>
+ <circle cx="28" cy="0" r="1" fill="rgba(98.8174%,98.7655%,98.7655%,1)"/>
+ <circle cx="29" cy="0" r="1" fill="white"/>
+ <circle cx="30" cy="0" r="1" fill="white"/>
+ <circle cx="31" cy="0" r="1" fill="white"/>
+ <circle cx="0" cy="1" r="1" fill="white"/>
+ <circle cx="1" cy="1" r="1" fill="white"/>
+ <circle cx="2" cy="1" r="1" fill="rgba(96.3653%,96.2066%,96.2066%,1)"/>
+ <circle cx="3" cy="1" r="1" fill="rgba(80.1495%,79.2859%,79.2859%,1)"/>
+ <circle cx="4" cy="1" r="1" fill="rgba(67.9744%,66.5827%,66.5827%,1)"/>
+ <circle cx="5" cy="1" r="1" fill="rgba(64.5335%,62.9908%,62.9908%,1)"/>
+ <circle cx="6" cy="1" r="1" fill="rgba(63.9979%,62.4308%,62.4308%,1)"/>
+ <circle cx="7" cy="1" r="1" fill="rgba(63.9811%,62.414%,62.414%,1)"/>
+ <circle cx="8" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="9" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="10" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="11" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="12" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="13" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="14" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="15" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="16" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="17" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="18" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="19" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="20" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="21" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="22" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="23" cy="1" r="1" fill="rgba(63.9826%,62.4155%,62.4155%,1)"/>
+ <circle cx="24" cy="1" r="1" fill="rgba(63.9811%,62.414%,62.414%,1)"/>
+ <circle cx="25" cy="1" r="1" fill="rgba(63.9841%,62.417%,62.417%,1)"/>
+ <circle cx="26" cy="1" r="1" fill="rgba(64.329%,62.7771%,62.7771%,1)"/>
+ <circle cx="27" cy="1" r="1" fill="rgba(66.8711%,65.4322%,65.4322%,1)"/>
+ <circle cx="28" cy="1" r="1" fill="rgba(77.0367%,76.0388%,76.0388%,1)"/>
+ <circle cx="29" cy="1" r="1" fill="rgba(94.0887%,93.8323%,93.8323%,1)"/>
+ <circle cx="30" cy="1" r="1" fill="white"/>
+ <circle cx="31" cy="1" r="1" fill="white"/>
+ <circle cx="0" cy="2" r="1" fill="white"/>
+ <circle cx="1" cy="2" r="1" fill="rgba(96.4508%,96.2966%,96.2966%,1)"/>
+ <circle cx="2" cy="2" r="1" fill="rgba(74.4732%,73.3623%,73.3623%,1)"/>
+ <circle cx="3" cy="2" r="1" fill="rgba(63.5355%,61.9501%,61.9501%,1)"/>
+ <circle cx="4" cy="2" r="1" fill="rgba(63.6469%,62.0661%,62.0661%,1)"/>
+ <circle cx="5" cy="2" r="1" fill="rgba(63.8956%,62.3255%,62.3255%,1)"/>
+ <circle cx="6" cy="2" r="1" fill="rgba(63.9185%,62.3499%,62.3499%,1)"/>
+ <circle cx="7" cy="2" r="1" fill="rgba(63.9185%,62.3499%,62.3499%,1)"/>
+ <circle cx="8" cy="2" r="1" fill="rgba(63.9185%,62.3499%,62.3499%,1)"/>
+ <circle cx="9" cy="2" r="1" fill="rgba(63.917%,62.3499%,62.3499%,1)"/>
+ <circle cx="10" cy="2" r="1" fill="rgba(63.9353%,62.3529%,62.3438%,1)"/>
+ <circle cx="11" cy="2" r="1" fill="rgba(64.1657%,62.4002%,62.2644%,1)"/>
+ <circle cx="12" cy="2" r="1" fill="rgba(64.4846%,62.4674%,62.153%,1)"/>
+ <circle cx="13" cy="2" r="1" fill="rgba(64.3595%,62.4414%,62.1973%,1)"/>
+ <circle cx="14" cy="2" r="1" fill="rgba(63.9475%,62.356%,62.3392%,1)"/>
+ <circle cx="15" cy="2" r="1" fill="rgba(63.917%,62.3499%,62.3499%,1)"/>
+ <circle cx="16" cy="2" r="1" fill="rgba(63.9185%,62.3499%,62.3499%,1)"/>
+ <circle cx="17" cy="2" r="1" fill="rgba(63.9094%,62.3484%,62.3529%,1)"/>
+ <circle cx="18" cy="2" r="1" fill="rgba(64.0864%,62.385%,62.2919%,1)"/>
+ <circle cx="19" cy="2" r="1" fill="rgba(64.4923%,62.4689%,62.15%,1)"/>
+ <circle cx="20" cy="2" r="1" fill="rgba(64.3732%,62.4445%,62.1912%,1)"/>
+ <circle cx="21" cy="2" r="1" fill="rgba(64.0299%,62.3728%,62.3117%,1)"/>
+ <circle cx="22" cy="2" r="1" fill="rgba(63.917%,62.3499%,62.3499%,1)"/>
+ <circle cx="23" cy="2" r="1" fill="rgba(63.9185%,62.3499%,62.3499%,1)"/>
+ <circle cx="24" cy="2" r="1" fill="rgba(63.9185%,62.3499%,62.3499%,1)"/>
+ <circle cx="25" cy="2" r="1" fill="rgba(63.9185%,62.3499%,62.3499%,1)"/>
+ <circle cx="26" cy="2" r="1" fill="rgba(63.9063%,62.3362%,62.3362%,1)"/>
+ <circle cx="27" cy="2" r="1" fill="rgba(63.7293%,62.153%,62.153%,1)"/>
+ <circle cx="28" cy="2" r="1" fill="rgba(63.3249%,61.7304%,61.7304%,1)"/>
+ <circle cx="29" cy="2" r="1" fill="rgba(70.7195%,69.4453%,69.4453%,1)"/>
+ <circle cx="30" cy="2" r="1" fill="rgba(93.5225%,93.2418%,93.2418%,1)"/>
+ <circle cx="31" cy="2" r="1" fill="white"/>
+ <circle cx="0" cy="3" r="1" fill="rgba(99.7345%,99.7223%,99.7223%,1)"/>
+ <circle cx="1" cy="3" r="1" fill="rgba(80.4944%,79.6475%,79.6475%,1)"/>
+ <circle cx="2" cy="3" r="1" fill="rgba(63.5645%,61.9806%,61.9806%,1)"/>
+ <circle cx="3" cy="3" r="1" fill="rgba(63.8788%,62.3072%,62.3072%,1)"/>
+ <circle cx="4" cy="3" r="1" fill="rgba(63.9231%,62.3545%,62.3545%,1)"/>
+ <circle cx="5" cy="3" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="6" cy="3" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="7" cy="3" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="8" cy="3" r="1" fill="rgba(63.9155%,62.3514%,62.3545%,1)"/>
+ <circle cx="9" cy="3" r="1" fill="rgba(64.0482%,62.3789%,62.3087%,1)"/>
+ <circle cx="10" cy="3" r="1" fill="rgba(63.9231%,62.3529%,62.3529%,1)"/>
+ <circle cx="11" cy="3" r="1" fill="rgba(60.0778%,61.5595%,63.6912%,1)"/>
+ <circle cx="12" cy="3" r="1" fill="rgba(52.5399%,60.0031%,66.3127%,1)"/>
+ <circle cx="13" cy="3" r="1" fill="rgba(52.2271%,59.939%,66.421%,1)"/>
+ <circle cx="14" cy="3" r="1" fill="rgba(63.5248%,62.2705%,62.4903%,1)"/>
+ <circle cx="15" cy="3" r="1" fill="rgba(63.9506%,62.359%,62.3423%,1)"/>
+ <circle cx="16" cy="3" r="1" fill="rgba(63.92%,62.3529%,62.3529%,1)"/>
+ <circle cx="17" cy="3" r="1" fill="rgba(64.1825%,62.4063%,62.2614%,1)"/>
+ <circle cx="18" cy="3" r="1" fill="rgba(59.8688%,61.5167%,63.7629%,1)"/>
+ <circle cx="19" cy="3" r="1" fill="rgba(49.6986%,59.4156%,67.2984%,1)"/>
+ <circle cx="20" cy="3" r="1" fill="rgba(56.1013%,60.737%,65.0721%,1)"/>
+ <circle cx="21" cy="3" r="1" fill="rgba(62.2797%,62.0142%,62.9236%,1)"/>
+ <circle cx="22" cy="3" r="1" fill="rgba(64.2267%,62.4155%,62.2461%,1)"/>
+ <circle cx="23" cy="3" r="1" fill="rgba(63.9307%,62.3545%,62.3499%,1)"/>
+ <circle cx="24" cy="3" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="25" cy="3" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="26" cy="3" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="27" cy="3" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="28" cy="3" r="1" fill="rgba(63.9155%,62.3468%,62.3468%,1)"/>
+ <circle cx="29" cy="3" r="1" fill="rgba(63.3097%,61.7136%,61.7136%,1)"/>
+ <circle cx="30" cy="3" r="1" fill="rgba(75.3201%,74.2473%,74.2473%,1)"/>
+ <circle cx="31" cy="3" r="1" fill="rgba(98.1582%,98.0774%,98.0774%,1)"/>
+ <circle cx="0" cy="4" r="1" fill="rgba(94.0902%,93.8338%,93.8338%,1)"/>
+ <circle cx="1" cy="4" r="1" fill="rgba(68.3284%,66.952%,66.952%,1)"/>
+ <circle cx="2" cy="4" r="1" fill="rgba(63.624%,62.0432%,62.0432%,1)"/>
+ <circle cx="3" cy="4" r="1" fill="rgba(63.9231%,62.3545%,62.3545%,1)"/>
+ <circle cx="4" cy="4" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="5" cy="4" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="6" cy="4" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="7" cy="4" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="8" cy="4" r="1" fill="rgba(64.0742%,62.385%,62.2995%,1)"/>
+ <circle cx="9" cy="4" r="1" fill="rgba(61.6526%,61.883%,63.1418%,1)"/>
+ <circle cx="10" cy="4" r="1" fill="rgba(44.9165%,58.4268%,68.9631%,1)"/>
+ <circle cx="11" cy="4" r="1" fill="rgba(33.312%,56.0311%,73.0007%,1)"/>
+ <circle cx="12" cy="4" r="1" fill="rgba(28.397%,55.0164%,74.7097%,1)"/>
+ <circle cx="13" cy="4" r="1" fill="rgba(31.1406%,55.5825%,73.7545%,1)"/>
+ <circle cx="14" cy="4" r="1" fill="rgba(56.8887%,60.8988%,64.799%,1)"/>
+ <circle cx="15" cy="4" r="1" fill="rgba(64.5869%,62.4903%,62.121%,1)"/>
+ <circle cx="16" cy="4" r="1" fill="rgba(64.2451%,62.4201%,62.24%,1)"/>
+ <circle cx="17" cy="4" r="1" fill="rgba(64.1703%,62.4048%,62.2675%,1)"/>
+ <circle cx="18" cy="4" r="1" fill="rgba(45.1087%,58.4695%,68.8975%,1)"/>
+ <circle cx="19" cy="4" r="1" fill="rgba(27.5746%,54.847%,74.995%,1)"/>
+ <circle cx="20" cy="4" r="1" fill="rgba(30.0328%,55.3536%,74.139%,1)"/>
+ <circle cx="21" cy="4" r="1" fill="rgba(37.0352%,56.8002%,71.7037%,1)"/>
+ <circle cx="22" cy="4" r="1" fill="rgba(52.9259%,60.0824%,66.1769%,1)"/>
+ <circle cx="23" cy="4" r="1" fill="rgba(64.033%,62.3758%,62.3133%,1)"/>
+ <circle cx="24" cy="4" r="1" fill="rgba(63.9261%,62.3545%,62.3514%,1)"/>
+ <circle cx="25" cy="4" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="26" cy="4" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="27" cy="4" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="28" cy="4" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="29" cy="4" r="1" fill="rgba(63.8087%,62.2354%,62.2354%,1)"/>
+ <circle cx="30" cy="4" r="1" fill="rgba(65.6138%,64.1199%,64.1199%,1)"/>
+ <circle cx="31" cy="4" r="1" fill="rgba(89.1127%,88.6397%,88.6397%,1)"/>
+ <circle cx="0" cy="5" r="1" fill="rgba(87.0603%,86.4988%,86.4988%,1)"/>
+ <circle cx="1" cy="5" r="1" fill="rgba(64.7318%,63.1983%,63.1983%,1)"/>
+ <circle cx="2" cy="5" r="1" fill="rgba(63.8849%,62.3148%,62.3148%,1)"/>
+ <circle cx="3" cy="5" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="4" cy="5" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="5" cy="5" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="6" cy="5" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="7" cy="5" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="8" cy="5" r="1" fill="rgba(64.2771%,62.4262%,62.2293%,1)"/>
+ <circle cx="9" cy="5" r="1" fill="rgba(58.4024%,61.2131%,64.2725%,1)"/>
+ <circle cx="10" cy="5" r="1" fill="rgba(30.7561%,55.5032%,73.8888%,1)"/>
+ <circle cx="11" cy="5" r="1" fill="rgba(27.277%,54.7845%,75.0988%,1)"/>
+ <circle cx="12" cy="5" r="1" fill="rgba(27.7897%,54.8913%,74.9203%,1)"/>
+ <circle cx="13" cy="5" r="1" fill="rgba(27.4037%,54.8104%,75.0546%,1)"/>
+ <circle cx="14" cy="5" r="1" fill="rgba(42.3804%,57.9034%,69.8451%,1)"/>
+ <circle cx="15" cy="5" r="1" fill="rgba(59.8184%,61.5045%,63.7797%,1)"/>
+ <circle cx="16" cy="5" r="1" fill="rgba(59.53%,61.4466%,63.8804%,1)"/>
+ <circle cx="17" cy="5" r="1" fill="rgba(55.9915%,60.7156%,65.1118%,1)"/>
+ <circle cx="18" cy="5" r="1" fill="rgba(32.3003%,55.8236%,73.3516%,1)"/>
+ <circle cx="19" cy="5" r="1" fill="rgba(27.538%,54.8394%,75.0088%,1)"/>
+ <circle cx="20" cy="5" r="1" fill="rgba(27.6982%,54.8714%,74.9523%,1)"/>
+ <circle cx="21" cy="5" r="1" fill="rgba(26.7277%,54.6715%,75.2895%,1)"/>
+ <circle cx="22" cy="5" r="1" fill="rgba(41.6068%,57.7447%,70.1152%,1)"/>
+ <circle cx="23" cy="5" r="1" fill="rgba(63.9902%,62.3667%,62.3285%,1)"/>
+ <circle cx="24" cy="5" r="1" fill="rgba(63.9292%,62.3545%,62.3499%,1)"/>
+ <circle cx="25" cy="5" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="26" cy="5" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="27" cy="5" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="28" cy="5" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="29" cy="5" r="1" fill="rgba(63.9231%,62.3545%,62.3545%,1)"/>
+ <circle cx="30" cy="5" r="1" fill="rgba(63.7751%,62.2004%,62.2004%,1)"/>
+ <circle cx="31" cy="5" r="1" fill="rgba(80.5188%,79.6735%,79.6735%,1)"/>
+ <circle cx="0" cy="6" r="1" fill="rgba(84.1505%,83.4607%,83.4607%,1)"/>
+ <circle cx="1" cy="6" r="1" fill="rgba(64.1398%,62.5803%,62.5803%,1)"/>
+ <circle cx="2" cy="6" r="1" fill="rgba(63.9139%,62.3453%,62.3453%,1)"/>
+ <circle cx="3" cy="6" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="4" cy="6" r="1" fill="rgba(63.9292%,62.3545%,62.3499%,1)"/>
+ <circle cx="5" cy="6" r="1" fill="rgba(63.9414%,62.3575%,62.3453%,1)"/>
+ <circle cx="6" cy="6" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="7" cy="6" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="8" cy="6" r="1" fill="rgba(64.1917%,62.4079%,62.2599%,1)"/>
+ <circle cx="9" cy="6" r="1" fill="rgba(59.9573%,61.5335%,63.7308%,1)"/>
+ <circle cx="10" cy="6" r="1" fill="rgba(32.5353%,55.8709%,73.2692%,1)"/>
+ <circle cx="11" cy="6" r="1" fill="rgba(27.541%,54.8394%,75.0072%,1)"/>
+ <circle cx="12" cy="6" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="13" cy="6" r="1" fill="rgba(27.747%,54.8821%,74.9355%,1)"/>
+ <circle cx="14" cy="6" r="1" fill="rgba(29.1798%,55.1781%,74.4366%,1)"/>
+ <circle cx="15" cy="6" r="1" fill="rgba(32.2942%,55.8206%,73.3532%,1)"/>
+ <circle cx="16" cy="6" r="1" fill="rgba(31.9921%,55.758%,73.4585%,1)"/>
+ <circle cx="17" cy="6" r="1" fill="rgba(31.5404%,55.6649%,73.6156%,1)"/>
+ <circle cx="18" cy="6" r="1" fill="rgba(27.9637%,54.9264%,74.8608%,1)"/>
+ <circle cx="19" cy="6" r="1" fill="rgba(27.8355%,54.9004%,74.905%,1)"/>
+ <circle cx="20" cy="6" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="21" cy="6" r="1" fill="rgba(27.2587%,54.7814%,75.1049%,1)"/>
+ <circle cx="22" cy="6" r="1" fill="rgba(44.1566%,58.2712%,69.2271%,1)"/>
+ <circle cx="23" cy="6" r="1" fill="rgba(64.3381%,62.4384%,62.208%,1)"/>
+ <circle cx="24" cy="6" r="1" fill="rgba(63.9185%,62.3529%,62.3545%,1)"/>
+ <circle cx="25" cy="6" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="26" cy="6" r="1" fill="rgba(63.9261%,62.3545%,62.3514%,1)"/>
+ <circle cx="27" cy="6" r="1" fill="rgba(63.9445%,62.3575%,62.3453%,1)"/>
+ <circle cx="28" cy="6" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="29" cy="6" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="30" cy="6" r="1" fill="rgba(63.6118%,62.031%,62.031%,1)"/>
+ <circle cx="31" cy="6" r="1" fill="rgba(77.3739%,76.3897%,76.3897%,1)"/>
+ <circle cx="0" cy="7" r="1" fill="rgba(83.9826%,83.2868%,83.2868%,1)"/>
+ <circle cx="1" cy="7" r="1" fill="rgba(64.1215%,62.562%,62.562%,1)"/>
+ <circle cx="2" cy="7" r="1" fill="rgba(63.9139%,62.3453%,62.3453%,1)"/>
+ <circle cx="3" cy="7" r="1" fill="rgba(63.9368%,62.356%,62.3484%,1)"/>
+ <circle cx="4" cy="7" r="1" fill="rgba(64.0253%,62.3743%,62.3163%,1)"/>
+ <circle cx="5" cy="7" r="1" fill="rgba(63.8834%,62.3453%,62.3667%,1)"/>
+ <circle cx="6" cy="7" r="1" fill="rgba(64.2954%,62.4308%,62.2232%,1)"/>
+ <circle cx="7" cy="7" r="1" fill="rgba(63.9826%,62.3651%,62.3316%,1)"/>
+ <circle cx="8" cy="7" r="1" fill="rgba(64.4434%,62.4613%,62.1714%,1)"/>
+ <circle cx="9" cy="7" r="1" fill="rgba(58.0041%,61.1307%,64.4114%,1)"/>
+ <circle cx="10" cy="7" r="1" fill="rgba(32.5475%,55.874%,73.2647%,1)"/>
+ <circle cx="11" cy="7" r="1" fill="rgba(27.5395%,54.8394%,75.0072%,1)"/>
+ <circle cx="12" cy="7" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="13" cy="7" r="1" fill="rgba(27.8492%,54.9035%,74.9004%,1)"/>
+ <circle cx="14" cy="7" r="1" fill="rgba(27.7485%,54.8821%,74.9355%,1)"/>
+ <circle cx="15" cy="7" r="1" fill="rgba(27.5547%,54.8425%,75.0027%,1)"/>
+ <circle cx="16" cy="7" r="1" fill="rgba(27.5746%,54.847%,74.995%,1)"/>
+ <circle cx="17" cy="7" r="1" fill="rgba(27.6005%,54.8516%,74.9859%,1)"/>
+ <circle cx="18" cy="7" r="1" fill="rgba(27.8294%,54.8989%,74.9065%,1)"/>
+ <circle cx="19" cy="7" r="1" fill="rgba(27.8447%,54.902%,74.902%,1)"/>
+ <circle cx="20" cy="7" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="21" cy="7" r="1" fill="rgba(27.4083%,54.8119%,75.053%,1)"/>
+ <circle cx="22" cy="7" r="1" fill="rgba(43.1098%,58.0545%,69.5918%,1)"/>
+ <circle cx="23" cy="7" r="1" fill="rgba(63.2868%,62.2217%,62.5727%,1)"/>
+ <circle cx="24" cy="7" r="1" fill="rgba(64.2115%,62.4125%,62.2522%,1)"/>
+ <circle cx="25" cy="7" r="1" fill="rgba(64.0497%,62.3789%,62.3087%,1)"/>
+ <circle cx="26" cy="7" r="1" fill="rgba(64.2679%,62.4247%,62.2324%,1)"/>
+ <circle cx="27" cy="7" r="1" fill="rgba(63.7995%,62.3285%,62.3941%,1)"/>
+ <circle cx="28" cy="7" r="1" fill="rgba(64.0497%,62.3789%,62.3087%,1)"/>
+ <circle cx="29" cy="7" r="1" fill="rgba(63.9139%,62.3514%,62.356%,1)"/>
+ <circle cx="30" cy="7" r="1" fill="rgba(63.6118%,62.0294%,62.0294%,1)"/>
+ <circle cx="31" cy="7" r="1" fill="rgba(77.2%,76.2097%,76.2097%,1)"/>
+ <circle cx="0" cy="8" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="8" r="1" fill="rgba(64.123%,62.5635%,62.5635%,1)"/>
+ <circle cx="2" cy="8" r="1" fill="rgba(63.9139%,62.3453%,62.3453%,1)"/>
+ <circle cx="3" cy="8" r="1" fill="rgba(64.3183%,62.4353%,62.2156%,1)"/>
+ <circle cx="4" cy="8" r="1" fill="rgba(54.4976%,60.4059%,65.6306%,1)"/>
+ <circle cx="5" cy="8" r="1" fill="rgba(43.093%,58.0514%,69.5964%,1)"/>
+ <circle cx="6" cy="8" r="1" fill="rgba(56.6781%,60.8576%,64.8707%,1)"/>
+ <circle cx="7" cy="8" r="1" fill="rgba(63.5706%,62.2797%,62.475%,1)"/>
+ <circle cx="8" cy="8" r="1" fill="rgba(53.4112%,60.1831%,66.0105%,1)"/>
+ <circle cx="9" cy="8" r="1" fill="rgba(34.8653%,56.3531%,72.4605%,1)"/>
+ <circle cx="10" cy="8" r="1" fill="rgba(28.0003%,54.934%,74.847%,1)"/>
+ <circle cx="11" cy="8" r="1" fill="rgba(27.8218%,54.8974%,74.9096%,1)"/>
+ <circle cx="12" cy="8" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="13" cy="8" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="14" cy="8" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="15" cy="8" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="16" cy="8" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="17" cy="8" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="18" cy="8" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="19" cy="8" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="20" cy="8" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="21" cy="8" r="1" fill="rgba(27.7638%,54.8852%,74.9294%,1)"/>
+ <circle cx="22" cy="8" r="1" fill="rgba(29.3889%,55.2209%,74.3648%,1)"/>
+ <circle cx="23" cy="8" r="1" fill="rgba(42.1057%,57.847%,69.9428%,1)"/>
+ <circle cx="24" cy="8" r="1" fill="rgba(60.0214%,61.5488%,63.711%,1)"/>
+ <circle cx="25" cy="8" r="1" fill="rgba(62.3774%,62.034%,62.8901%,1)"/>
+ <circle cx="26" cy="8" r="1" fill="rgba(50.1381%,59.5071%,67.1458%,1)"/>
+ <circle cx="27" cy="8" r="1" fill="rgba(44.358%,58.3124%,69.1569%,1)"/>
+ <circle cx="28" cy="8" r="1" fill="rgba(61.4038%,61.8341%,63.2288%,1)"/>
+ <circle cx="29" cy="8" r="1" fill="rgba(64.1459%,62.3987%,62.2751%,1)"/>
+ <circle cx="30" cy="8" r="1" fill="rgba(63.6072%,62.0294%,62.031%,1)"/>
+ <circle cx="31" cy="8" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="9" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="9" r="1" fill="rgba(64.1184%,62.562%,62.565%,1)"/>
+ <circle cx="2" cy="9" r="1" fill="rgba(64.2924%,62.4231%,62.2141%,1)"/>
+ <circle cx="3" cy="9" r="1" fill="rgba(58.0743%,61.146%,64.387%,1)"/>
+ <circle cx="4" cy="9" r="1" fill="rgba(33.9574%,56.1654%,72.7749%,1)"/>
+ <circle cx="5" cy="9" r="1" fill="rgba(27.0375%,54.7356%,75.1812%,1)"/>
+ <circle cx="6" cy="9" r="1" fill="rgba(31.8013%,55.7183%,73.5241%,1)"/>
+ <circle cx="7" cy="9" r="1" fill="rgba(40.5859%,57.5326%,70.4677%,1)"/>
+ <circle cx="8" cy="9" r="1" fill="rgba(30.8248%,55.5169%,73.8643%,1)"/>
+ <circle cx="9" cy="9" r="1" fill="rgba(27.3732%,54.8043%,75.0652%,1)"/>
+ <circle cx="10" cy="9" r="1" fill="rgba(27.8279%,54.8989%,74.9081%,1)"/>
+ <circle cx="11" cy="9" r="1" fill="rgba(27.8447%,54.902%,74.902%,1)"/>
+ <circle cx="12" cy="9" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="13" cy="9" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="14" cy="9" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="15" cy="9" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="16" cy="9" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="17" cy="9" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="18" cy="9" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="19" cy="9" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="20" cy="9" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="21" cy="9" r="1" fill="rgba(27.8477%,54.9035%,74.9004%,1)"/>
+ <circle cx="22" cy="9" r="1" fill="rgba(27.7104%,54.8745%,74.9477%,1)"/>
+ <circle cx="23" cy="9" r="1" fill="rgba(27.5364%,54.8379%,75.0088%,1)"/>
+ <circle cx="24" cy="9" r="1" fill="rgba(36.0464%,56.5972%,72.05%,1)"/>
+ <circle cx="25" cy="9" r="1" fill="rgba(38.3337%,57.0687%,71.2535%,1)"/>
+ <circle cx="26" cy="9" r="1" fill="rgba(28.5618%,55.05%,74.6517%,1)"/>
+ <circle cx="27" cy="9" r="1" fill="rgba(27.6051%,54.8531%,74.9844%,1)"/>
+ <circle cx="28" cy="9" r="1" fill="rgba(44.1382%,58.2681%,69.2332%,1)"/>
+ <circle cx="29" cy="9" r="1" fill="rgba(63.2853%,62.2217%,62.5742%,1)"/>
+ <circle cx="30" cy="9" r="1" fill="rgba(63.6927%,62.0462%,62.002%,1)"/>
+ <circle cx="31" cy="9" r="1" fill="rgba(77.2137%,76.2219%,76.2234%,1)"/>
+ <circle cx="0" cy="10" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="10" r="1" fill="rgba(64.2542%,62.591%,62.5177%,1)"/>
+ <circle cx="2" cy="10" r="1" fill="rgba(61.9684%,61.944%,63.0228%,1)"/>
+ <circle cx="3" cy="10" r="1" fill="rgba(39.4156%,57.293%,70.8766%,1)"/>
+ <circle cx="4" cy="10" r="1" fill="rgba(27.3579%,54.8013%,75.0713%,1)"/>
+ <circle cx="5" cy="10" r="1" fill="rgba(27.8447%,54.902%,74.902%,1)"/>
+ <circle cx="6" cy="10" r="1" fill="rgba(27.6158%,54.8547%,74.9813%,1)"/>
+ <circle cx="7" cy="10" r="1" fill="rgba(27.3198%,54.7936%,75.0835%,1)"/>
+ <circle cx="8" cy="10" r="1" fill="rgba(27.6753%,54.8669%,74.9599%,1)"/>
+ <circle cx="9" cy="10" r="1" fill="rgba(27.8508%,54.9035%,74.8989%,1)"/>
+ <circle cx="10" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="11" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="12" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="13" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="14" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="15" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="16" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="17" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="18" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="19" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="20" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="21" cy="10" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="22" cy="10" r="1" fill="rgba(27.8447%,54.902%,74.902%,1)"/>
+ <circle cx="23" cy="10" r="1" fill="rgba(27.8294%,54.8989%,74.9065%,1)"/>
+ <circle cx="24" cy="10" r="1" fill="rgba(27.4815%,54.8272%,75.0286%,1)"/>
+ <circle cx="25" cy="10" r="1" fill="rgba(27.3777%,54.8058%,75.0637%,1)"/>
+ <circle cx="26" cy="10" r="1" fill="rgba(27.7745%,54.8882%,74.9264%,1)"/>
+ <circle cx="27" cy="10" r="1" fill="rgba(27.6905%,54.8699%,74.9554%,1)"/>
+ <circle cx="28" cy="10" r="1" fill="rgba(29.1783%,55.1781%,74.4366%,1)"/>
+ <circle cx="29" cy="10" r="1" fill="rgba(51.107%,59.707%,66.8101%,1)"/>
+ <circle cx="30" cy="10" r="1" fill="rgba(63.8773%,62.0844%,61.9379%,1)"/>
+ <circle cx="31" cy="10" r="1" fill="rgba(77.2213%,76.2249%,76.2203%,1)"/>
+ <circle cx="0" cy="11" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="11" r="1" fill="rgba(64.4862%,62.6383%,62.4384%,1)"/>
+ <circle cx="2" cy="11" r="1" fill="rgba(57.8683%,61.0971%,64.448%,1)"/>
+ <circle cx="3" cy="11" r="1" fill="rgba(31.2123%,55.5978%,73.7301%,1)"/>
+ <circle cx="4" cy="11" r="1" fill="rgba(27.5608%,54.844%,74.9996%,1)"/>
+ <circle cx="5" cy="11" r="1" fill="rgba(27.8462%,54.902%,74.9004%,1)"/>
+ <circle cx="6" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="7" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="8" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="9" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="10" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="11" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="12" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="13" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="14" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="15" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="16" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="17" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="18" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="19" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="20" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="21" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="22" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="23" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="24" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="25" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="26" cy="11" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="27" cy="11" r="1" fill="rgba(27.8538%,54.9035%,74.8989%,1)"/>
+ <circle cx="28" cy="11" r="1" fill="rgba(27.1351%,54.7555%,75.1476%,1)"/>
+ <circle cx="29" cy="11" r="1" fill="rgba(41.6251%,57.7493%,70.1091%,1)"/>
+ <circle cx="30" cy="11" r="1" fill="rgba(63.3539%,61.976%,62.1195%,1)"/>
+ <circle cx="31" cy="11" r="1" fill="rgba(77.2473%,76.2295%,76.2112%,1)"/>
+ <circle cx="0" cy="12" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="12" r="1" fill="rgba(64.1672%,62.5727%,62.5483%,1)"/>
+ <circle cx="2" cy="12" r="1" fill="rgba(63.5431%,62.269%,62.475%,1)"/>
+ <circle cx="3" cy="12" r="1" fill="rgba(45.1118%,58.4695%,68.896%,1)"/>
+ <circle cx="4" cy="12" r="1" fill="rgba(27.8965%,54.9126%,74.8836%,1)"/>
+ <circle cx="5" cy="12" r="1" fill="rgba(27.8141%,54.8959%,74.9126%,1)"/>
+ <circle cx="6" cy="12" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="7" cy="12" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="8" cy="12" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="9" cy="12" r="1" fill="rgba(27.7699%,54.8562%,74.876%,1)"/>
+ <circle cx="10" cy="12" r="1" fill="rgba(27.7226%,54.8272%,74.8608%,1)"/>
+ <circle cx="11" cy="12" r="1" fill="rgba(27.8309%,54.8943%,74.8974%,1)"/>
+ <circle cx="12" cy="12" r="1" fill="rgba(27.8447%,54.902%,74.902%,1)"/>
+ <circle cx="13" cy="12" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="14" cy="12" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="15" cy="12" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="16" cy="12" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="17" cy="12" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="18" cy="12" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="19" cy="12" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="20" cy="12" r="1" fill="rgba(27.8447%,54.902%,74.902%,1)"/>
+ <circle cx="21" cy="12" r="1" fill="rgba(27.8233%,54.8898%,74.8943%,1)"/>
+ <circle cx="22" cy="12" r="1" fill="rgba(27.715%,54.8226%,74.8577%,1)"/>
+ <circle cx="23" cy="12" r="1" fill="rgba(27.7836%,54.8653%,74.8806%,1)"/>
+ <circle cx="24" cy="12" r="1" fill="rgba(27.8447%,54.9035%,74.902%,1)"/>
+ <circle cx="25" cy="12" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="26" cy="12" r="1" fill="rgba(27.8447%,54.902%,74.902%,1)"/>
+ <circle cx="27" cy="12" r="1" fill="rgba(27.5837%,54.8486%,74.992%,1)"/>
+ <circle cx="28" cy="12" r="1" fill="rgba(31.8257%,55.7259%,73.518%,1)"/>
+ <circle cx="29" cy="12" r="1" fill="rgba(56.1975%,60.7599%,65.0416%,1)"/>
+ <circle cx="30" cy="12" r="1" fill="rgba(63.9475%,62.0996%,61.912%,1)"/>
+ <circle cx="31" cy="12" r="1" fill="rgba(77.2137%,76.2234%,76.2219%,1)"/>
+ <circle cx="0" cy="13" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="13" r="1" fill="rgba(64.1215%,62.5635%,62.565%,1)"/>
+ <circle cx="2" cy="13" r="1" fill="rgba(64.1428%,62.3926%,62.266%,1)"/>
+ <circle cx="3" cy="13" r="1" fill="rgba(61.0788%,61.767%,63.3417%,1)"/>
+ <circle cx="4" cy="13" r="1" fill="rgba(36.35%,56.6598%,71.9417%,1)"/>
+ <circle cx="5" cy="13" r="1" fill="rgba(27.4098%,54.8119%,75.053%,1)"/>
+ <circle cx="6" cy="13" r="1" fill="rgba(27.8447%,54.9035%,74.902%,1)"/>
+ <circle cx="7" cy="13" r="1" fill="rgba(27.8126%,54.8821%,74.8913%,1)"/>
+ <circle cx="8" cy="13" r="1" fill="rgba(27.1183%,54.4488%,74.6487%,1)"/>
+ <circle cx="9" cy="13" r="1" fill="rgba(28.7739%,55.4894%,75.2361%,1)"/>
+ <circle cx="10" cy="13" r="1" fill="rgba(29.8528%,56.1852%,75.6481%,1)"/>
+ <circle cx="11" cy="13" r="1" fill="rgba(27.3213%,54.58%,74.728%,1)"/>
+ <circle cx="12" cy="13" r="1" fill="rgba(27.5837%,54.7387%,74.8104%,1)"/>
+ <circle cx="13" cy="13" r="1" fill="rgba(27.8569%,54.9096%,74.9065%,1)"/>
+ <circle cx="14" cy="13" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="15" cy="13" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="16" cy="13" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="17" cy="13" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="18" cy="13" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="19" cy="13" r="1" fill="rgba(27.8599%,54.9126%,74.9081%,1)"/>
+ <circle cx="20" cy="13" r="1" fill="rgba(27.4922%,54.6822%,74.7784%,1)"/>
+ <circle cx="21" cy="13" r="1" fill="rgba(27.4998%,54.6929%,74.7936%,1)"/>
+ <circle cx="22" cy="13" r="1" fill="rgba(30.0084%,56.2829%,75.7015%,1)"/>
+ <circle cx="23" cy="13" r="1" fill="rgba(28.4535%,55.288%,75.1217%,1)"/>
+ <circle cx="24" cy="13" r="1" fill="rgba(27.1687%,54.4793%,74.667%,1)"/>
+ <circle cx="25" cy="13" r="1" fill="rgba(27.8386%,54.8989%,74.9004%,1)"/>
+ <circle cx="26" cy="13" r="1" fill="rgba(27.8111%,54.8959%,74.9142%,1)"/>
+ <circle cx="27" cy="13" r="1" fill="rgba(28.1178%,54.9584%,74.8058%,1)"/>
+ <circle cx="28" cy="13" r="1" fill="rgba(48.1849%,59.1043%,67.8264%,1)"/>
+ <circle cx="29" cy="13" r="1" fill="rgba(64.2191%,62.414%,62.2492%,1)"/>
+ <circle cx="30" cy="13" r="1" fill="rgba(63.6271%,62.0325%,62.0233%,1)"/>
+ <circle cx="31" cy="13" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="14" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="14" r="1" fill="rgba(64.123%,62.5635%,62.5635%,1)"/>
+ <circle cx="2" cy="14" r="1" fill="rgba(63.9139%,62.3453%,62.3453%,1)"/>
+ <circle cx="3" cy="14" r="1" fill="rgba(64.1398%,62.3987%,62.2766%,1)"/>
+ <circle cx="4" cy="14" r="1" fill="rgba(42.1439%,57.8546%,69.9229%,1)"/>
+ <circle cx="5" cy="14" r="1" fill="rgba(27.2068%,54.7707%,75.1232%,1)"/>
+ <circle cx="6" cy="14" r="1" fill="rgba(27.8233%,54.8898%,74.8943%,1)"/>
+ <circle cx="7" cy="14" r="1" fill="rgba(27.6844%,54.7997%,74.8409%,1)"/>
+ <circle cx="8" cy="14" r="1" fill="rgba(46.2409%,66.4668%,81.416%,1)"/>
+ <circle cx="9" cy="14" r="1" fill="rgba(75.7458%,84.9928%,91.8227%,1)"/>
+ <circle cx="10" cy="14" r="1" fill="rgba(79.2706%,86.6392%,92.1019%,1)"/>
+ <circle cx="11" cy="14" r="1" fill="rgba(60.3326%,75.3948%,86.5232%,1)"/>
+ <circle cx="12" cy="14" r="1" fill="rgba(31.3344%,57.1313%,76.1959%,1)"/>
+ <circle cx="13" cy="14" r="1" fill="rgba(27.5731%,54.7311%,74.8043%,1)"/>
+ <circle cx="14" cy="14" r="1" fill="rgba(27.8584%,54.9111%,74.9081%,1)"/>
+ <circle cx="15" cy="14" r="1" fill="rgba(27.5731%,54.7326%,74.8089%,1)"/>
+ <circle cx="16" cy="14" r="1" fill="rgba(26.8971%,54.3114%,74.5724%,1)"/>
+ <circle cx="17" cy="14" r="1" fill="rgba(27.6524%,54.7829%,74.8363%,1)"/>
+ <circle cx="18" cy="14" r="1" fill="rgba(27.8569%,54.9111%,74.9065%,1)"/>
+ <circle cx="19" cy="14" r="1" fill="rgba(27.4693%,54.6639%,74.7646%,1)"/>
+ <circle cx="20" cy="14" r="1" fill="rgba(33.1945%,58.32%,76.8872%,1)"/>
+ <circle cx="21" cy="14" r="1" fill="rgba(63.5966%,77.3907%,87.5822%,1)"/>
+ <circle cx="22" cy="14" r="1" fill="rgba(79.881%,87.0237%,92.3201%,1)"/>
+ <circle cx="23" cy="14" r="1" fill="rgba(73.7942%,83.8163%,91.2154%,1)"/>
+ <circle cx="24" cy="14" r="1" fill="rgba(42.7893%,64.2863%,80.174%,1)"/>
+ <circle cx="25" cy="14" r="1" fill="rgba(27.4311%,54.6426%,74.7555%,1)"/>
+ <circle cx="26" cy="14" r="1" fill="rgba(27.7577%,54.8836%,74.931%,1)"/>
+ <circle cx="27" cy="14" r="1" fill="rgba(29.2332%,55.1888%,74.4167%,1)"/>
+ <circle cx="28" cy="14" r="1" fill="rgba(55.2972%,60.5707%,65.3468%,1)"/>
+ <circle cx="29" cy="14" r="1" fill="rgba(64.4755%,62.4674%,62.1607%,1)"/>
+ <circle cx="30" cy="14" r="1" fill="rgba(63.6103%,62.0294%,62.0294%,1)"/>
+ <circle cx="31" cy="14" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="15" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="15" r="1" fill="rgba(64.123%,62.5635%,62.5635%,1)"/>
+ <circle cx="2" cy="15" r="1" fill="rgba(63.9216%,62.3468%,62.3438%,1)"/>
+ <circle cx="3" cy="15" r="1" fill="rgba(64.0162%,62.3728%,62.3194%,1)"/>
+ <circle cx="4" cy="15" r="1" fill="rgba(42.0249%,57.8302%,69.9641%,1)"/>
+ <circle cx="5" cy="15" r="1" fill="rgba(27.2145%,54.7723%,75.1202%,1)"/>
+ <circle cx="6" cy="15" r="1" fill="rgba(27.1321%,54.4579%,74.6548%,1)"/>
+ <circle cx="7" cy="15" r="1" fill="rgba(40.5112%,62.8794%,79.4095%,1)"/>
+ <circle cx="8" cy="15" r="1" fill="rgba(88.3421%,91.8837%,94.5296%,1)"/>
+ <circle cx="9" cy="15" r="1" fill="rgba(69.34%,68.5878%,68.4962%,1)"/>
+ <circle cx="10" cy="15" r="1" fill="rgba(49.5277%,48.7846%,48.983%,1)"/>
+ <circle cx="11" cy="15" r="1" fill="rgba(70.7088%,70.6935%,71.0994%,1)"/>
+ <circle cx="12" cy="15" r="1" fill="rgba(59.8657%,74.4808%,85.2995%,1)"/>
+ <circle cx="13" cy="15" r="1" fill="rgba(27.5792%,54.7738%,74.873%,1)"/>
+ <circle cx="14" cy="15" r="1" fill="rgba(27.5868%,54.7417%,74.8119%,1)"/>
+ <circle cx="15" cy="15" r="1" fill="rgba(32.2637%,57.6654%,76.4401%,1)"/>
+ <circle cx="16" cy="15" r="1" fill="rgba(43.9353%,64.9607%,80.5005%,1)"/>
+ <circle cx="17" cy="15" r="1" fill="rgba(30.9255%,56.8292%,75.9747%,1)"/>
+ <circle cx="18" cy="15" r="1" fill="rgba(27.6005%,54.7509%,74.818%,1)"/>
+ <circle cx="19" cy="15" r="1" fill="rgba(28.4733%,55.3597%,75.2316%,1)"/>
+ <circle cx="20" cy="15" r="1" fill="rgba(64.7044%,77.0443%,86.1997%,1)"/>
+ <circle cx="21" cy="15" r="1" fill="rgba(67.7058%,67.3045%,67.4815%,1)"/>
+ <circle cx="22" cy="15" r="1" fill="rgba(49.5399%,48.8151%,49.0227%,1)"/>
+ <circle cx="23" cy="15" r="1" fill="rgba(73.4035%,72.6528%,72.5048%,1)"/>
+ <circle cx="24" cy="15" r="1" fill="rgba(85.449%,90.5135%,94.2702%,1)"/>
+ <circle cx="25" cy="15" r="1" fill="rgba(36.5072%,60.351%,77.9736%,1)"/>
+ <circle cx="26" cy="15" r="1" fill="rgba(27.2267%,54.5525%,74.7463%,1)"/>
+ <circle cx="27" cy="15" r="1" fill="rgba(29.2271%,55.1873%,74.4182%,1)"/>
+ <circle cx="28" cy="15" r="1" fill="rgba(55.1003%,60.531%,65.4154%,1)"/>
+ <circle cx="29" cy="15" r="1" fill="rgba(64.448%,62.4613%,62.1698%,1)"/>
+ <circle cx="30" cy="15" r="1" fill="rgba(63.6118%,62.0294%,62.0294%,1)"/>
+ <circle cx="31" cy="15" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="16" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="16" r="1" fill="rgba(64.123%,62.5635%,62.5635%,1)"/>
+ <circle cx="2" cy="16" r="1" fill="rgba(63.9216%,62.3468%,62.3438%,1)"/>
+ <circle cx="3" cy="16" r="1" fill="rgba(64.0146%,62.3728%,62.3194%,1)"/>
+ <circle cx="4" cy="16" r="1" fill="rgba(42.0233%,57.8302%,69.9641%,1)"/>
+ <circle cx="5" cy="16" r="1" fill="rgba(27.2145%,54.7723%,75.1202%,1)"/>
+ <circle cx="6" cy="16" r="1" fill="rgba(26.6407%,54.1497%,74.4839%,1)"/>
+ <circle cx="7" cy="16" r="1" fill="rgba(58.6587%,74.5525%,86.2852%,1)"/>
+ <circle cx="8" cy="16" r="1" fill="rgba(82.0249%,81.8204%,81.9333%,1)"/>
+ <circle cx="9" cy="16" r="1" fill="rgba(28.7587%,28.3772%,29.1234%,1)"/>
+ <circle cx="10" cy="16" r="1" fill="rgba(23.592%,23.1922%,23.9963%,1)"/>
+ <circle cx="11" cy="16" r="1" fill="rgba(32.3705%,31.5923%,32.0089%,1)"/>
+ <circle cx="12" cy="16" r="1" fill="rgba(68.4504%,74.9844%,80.0137%,1)"/>
+ <circle cx="13" cy="16" r="1" fill="rgba(31.5969%,57.5708%,76.7575%,1)"/>
+ <circle cx="14" cy="16" r="1" fill="rgba(26.5156%,54.0719%,74.4396%,1)"/>
+ <circle cx="15" cy="16" r="1" fill="rgba(54.0719%,71.2963%,84.0253%,1)"/>
+ <circle cx="16" cy="16" r="1" fill="rgba(95.3033%,97.0657%,98.3658%,1)"/>
+ <circle cx="17" cy="16" r="1" fill="rgba(48.0766%,67.5502%,81.9394%,1)"/>
+ <circle cx="18" cy="16" r="1" fill="rgba(26.389%,53.9925%,74.3969%,1)"/>
+ <circle cx="19" cy="16" r="1" fill="rgba(34.6792%,59.5789%,77.966%,1)"/>
+ <circle cx="20" cy="16" r="1" fill="rgba(68.3268%,72.8725%,76.5118%,1)"/>
+ <circle cx="21" cy="16" r="1" fill="rgba(29.1096%,28.4154%,28.9357%,1)"/>
+ <circle cx="22" cy="16" r="1" fill="rgba(23.5828%,23.1815%,23.9872%,1)"/>
+ <circle cx="23" cy="16" r="1" fill="rgba(31.9966%,31.6136%,32.311%,1)"/>
+ <circle cx="24" cy="16" r="1" fill="rgba(86.0166%,86.3157%,86.7231%,1)"/>
+ <circle cx="25" cy="16" r="1" fill="rgba(52.0287%,70.3227%,83.8331%,1)"/>
+ <circle cx="26" cy="16" r="1" fill="rgba(26.5553%,54.1329%,74.5129%,1)"/>
+ <circle cx="27" cy="16" r="1" fill="rgba(29.2271%,55.1873%,74.4182%,1)"/>
+ <circle cx="28" cy="16" r="1" fill="rgba(55.0988%,60.5295%,65.417%,1)"/>
+ <circle cx="29" cy="16" r="1" fill="rgba(64.448%,62.4613%,62.1698%,1)"/>
+ <circle cx="30" cy="16" r="1" fill="rgba(63.6118%,62.0294%,62.0294%,1)"/>
+ <circle cx="31" cy="16" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="17" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="17" r="1" fill="rgba(64.123%,62.5635%,62.5635%,1)"/>
+ <circle cx="2" cy="17" r="1" fill="rgba(63.9216%,62.3468%,62.3438%,1)"/>
+ <circle cx="3" cy="17" r="1" fill="rgba(64.0146%,62.3728%,62.3194%,1)"/>
+ <circle cx="4" cy="17" r="1" fill="rgba(42.0233%,57.8302%,69.9641%,1)"/>
+ <circle cx="5" cy="17" r="1" fill="rgba(27.2145%,54.7723%,75.1202%,1)"/>
+ <circle cx="6" cy="17" r="1" fill="rgba(26.6819%,54.1756%,74.4976%,1)"/>
+ <circle cx="7" cy="17" r="1" fill="rgba(55.0256%,72.2835%,85.0233%,1)"/>
+ <circle cx="8" cy="17" r="1" fill="rgba(81.0712%,81.2039%,81.5656%,1)"/>
+ <circle cx="9" cy="17" r="1" fill="rgba(28.8075%,28.3894%,29.1081%,1)"/>
+ <circle cx="10" cy="17" r="1" fill="rgba(23.5996%,23.1998%,24.007%,1)"/>
+ <circle cx="11" cy="17" r="1" fill="rgba(32.6299%,31.7327%,32.0607%,1)"/>
+ <circle cx="12" cy="17" r="1" fill="rgba(64.9485%,72.7764%,78.764%,1)"/>
+ <circle cx="13" cy="17" r="1" fill="rgba(30.6035%,56.9512%,76.4126%,1)"/>
+ <circle cx="14" cy="17" r="1" fill="rgba(26.4805%,54.0505%,74.4274%,1)"/>
+ <circle cx="15" cy="17" r="1" fill="rgba(58.0621%,73.7911%,85.4124%,1)"/>
+ <circle cx="16" cy="17" r="1" fill="rgba(99.7101%,99.8199%,99.8993%,1)"/>
+ <circle cx="17" cy="17" r="1" fill="rgba(51.6182%,69.7658%,83.1693%,1)"/>
+ <circle cx="18" cy="17" r="1" fill="rgba(26.3325%,53.9574%,74.3771%,1)"/>
+ <circle cx="19" cy="17" r="1" fill="rgba(33.2082%,58.6603%,77.4563%,1)"/>
+ <circle cx="20" cy="17" r="1" fill="rgba(65.2277%,70.9148%,75.3964%,1)"/>
+ <circle cx="21" cy="17" r="1" fill="rgba(29.4209%,28.5924%,29.0135%,1)"/>
+ <circle cx="22" cy="17" r="1" fill="rgba(23.5859%,23.1876%,23.9948%,1)"/>
+ <circle cx="23" cy="17" r="1" fill="rgba(32.0897%,31.6487%,32.3049%,1)"/>
+ <circle cx="24" cy="17" r="1" fill="rgba(84.5853%,85.4032%,86.1967%,1)"/>
+ <circle cx="25" cy="17" r="1" fill="rgba(48.751%,68.275%,82.6947%,1)"/>
+ <circle cx="26" cy="17" r="1" fill="rgba(26.6743%,54.2061%,74.5541%,1)"/>
+ <circle cx="27" cy="17" r="1" fill="rgba(29.2271%,55.1873%,74.4182%,1)"/>
+ <circle cx="28" cy="17" r="1" fill="rgba(55.0988%,60.5295%,65.417%,1)"/>
+ <circle cx="29" cy="17" r="1" fill="rgba(64.448%,62.4613%,62.1698%,1)"/>
+ <circle cx="30" cy="17" r="1" fill="rgba(63.6118%,62.0294%,62.0294%,1)"/>
+ <circle cx="31" cy="17" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="18" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="18" r="1" fill="rgba(64.123%,62.5635%,62.5635%,1)"/>
+ <circle cx="2" cy="18" r="1" fill="rgba(63.9216%,62.3468%,62.3438%,1)"/>
+ <circle cx="3" cy="18" r="1" fill="rgba(64.0131%,62.3713%,62.3178%,1)"/>
+ <circle cx="4" cy="18" r="1" fill="rgba(42.0005%,57.8134%,69.9535%,1)"/>
+ <circle cx="5" cy="18" r="1" fill="rgba(27.2114%,54.7707%,75.1202%,1)"/>
+ <circle cx="6" cy="18" r="1" fill="rgba(27.4296%,54.6441%,74.7585%,1)"/>
+ <circle cx="7" cy="18" r="1" fill="rgba(34.4823%,59.1119%,77.3129%,1)"/>
+ <circle cx="8" cy="18" r="1" fill="rgba(77.525%,85.1392%,90.7973%,1)"/>
+ <circle cx="9" cy="18" r="1" fill="rgba(67.8889%,67.6158%,67.8828%,1)"/>
+ <circle cx="10" cy="18" r="1" fill="rgba(49.0242%,48.3696%,48.6351%,1)"/>
+ <circle cx="11" cy="18" r="1" fill="rgba(64.2329%,66.5797%,68.7312%,1)"/>
+ <circle cx="12" cy="18" r="1" fill="rgba(48.7907%,67.5486%,81.4298%,1)"/>
+ <circle cx="13" cy="18" r="1" fill="rgba(27.2511%,54.5693%,74.7585%,1)"/>
+ <circle cx="14" cy="18" r="1" fill="rgba(26.6056%,54.1283%,74.4717%,1)"/>
+ <circle cx="15" cy="18" r="1" fill="rgba(57.8286%,73.6461%,85.3315%,1)"/>
+ <circle cx="16" cy="18" r="1" fill="rgba(99.6002%,99.7513%,99.8596%,1)"/>
+ <circle cx="17" cy="18" r="1" fill="rgba(51.3695%,69.6101%,83.0838%,1)"/>
+ <circle cx="18" cy="18" r="1" fill="rgba(26.6011%,54.1253%,74.4701%,1)"/>
+ <circle cx="19" cy="18" r="1" fill="rgba(27.5975%,54.8135%,74.9279%,1)"/>
+ <circle cx="20" cy="18" r="1" fill="rgba(52.8313%,69.6086%,82.0432%,1)"/>
+ <circle cx="21" cy="18" r="1" fill="rgba(62.4216%,63.9307%,65.5222%,1)"/>
+ <circle cx="22" cy="18" r="1" fill="rgba(49.1325%,48.4596%,48.7083%,1)"/>
+ <circle cx="23" cy="18" r="1" fill="rgba(71.4397%,71.3771%,71.7372%,1)"/>
+ <circle cx="24" cy="18" r="1" fill="rgba(73.817%,83.2609%,90.2541%,1)"/>
+ <circle cx="25" cy="18" r="1" fill="rgba(31.8822%,57.4594%,76.3638%,1)"/>
+ <circle cx="26" cy="18" r="1" fill="rgba(27.4861%,54.7143%,74.8363%,1)"/>
+ <circle cx="27" cy="18" r="1" fill="rgba(29.2241%,55.1858%,74.4182%,1)"/>
+ <circle cx="28" cy="18" r="1" fill="rgba(55.0958%,60.528%,65.4139%,1)"/>
+ <circle cx="29" cy="18" r="1" fill="rgba(64.448%,62.4613%,62.1698%,1)"/>
+ <circle cx="30" cy="18" r="1" fill="rgba(63.6118%,62.0294%,62.0294%,1)"/>
+ <circle cx="31" cy="18" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="19" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="19" r="1" fill="rgba(64.1215%,62.5635%,62.565%,1)"/>
+ <circle cx="2" cy="19" r="1" fill="rgba(63.9582%,62.3545%,62.3316%,1)"/>
+ <circle cx="3" cy="19" r="1" fill="rgba(64.4831%,62.4811%,62.179%,1)"/>
+ <circle cx="4" cy="19" r="1" fill="rgba(42.4613%,58.0468%,70.0237%,1)"/>
+ <circle cx="5" cy="19" r="1" fill="rgba(26.7903%,54.5113%,74.9798%,1)"/>
+ <circle cx="6" cy="19" r="1" fill="rgba(27.8614%,54.9142%,74.9081%,1)"/>
+ <circle cx="7" cy="19" r="1" fill="rgba(27.0756%,54.4182%,74.6288%,1)"/>
+ <circle cx="8" cy="19" r="1" fill="rgba(34.725%,59.2706%,77.4121%,1)"/>
+ <circle cx="9" cy="19" r="1" fill="rgba(56.6278%,73.0358%,85.1606%,1)"/>
+ <circle cx="10" cy="19" r="1" fill="rgba(60.2289%,74.7097%,85.4292%,1)"/>
+ <circle cx="11" cy="19" r="1" fill="rgba(43.9994%,65.182%,80.8331%,1)"/>
+ <circle cx="12" cy="19" r="1" fill="rgba(28.2094%,55.1781%,75.1095%,1)"/>
+ <circle cx="13" cy="19" r="1" fill="rgba(27.7699%,54.8547%,74.873%,1)"/>
+ <circle cx="14" cy="19" r="1" fill="rgba(27.1183%,54.4488%,74.6502%,1)"/>
+ <circle cx="15" cy="19" r="1" fill="rgba(42.9984%,64.3748%,80.174%,1)"/>
+ <circle cx="16" cy="19" r="1" fill="rgba(72.4804%,82.8%,90.428%,1)"/>
+ <circle cx="17" cy="19" r="1" fill="rgba(39.1318%,61.9577%,78.8281%,1)"/>
+ <circle cx="18" cy="19" r="1" fill="rgba(27.2145%,54.5098%,74.6838%,1)"/>
+ <circle cx="19" cy="19" r="1" fill="rgba(27.7089%,54.8135%,74.8486%,1)"/>
+ <circle cx="20" cy="19" r="1" fill="rgba(28.8792%,55.6222%,75.3872%,1)"/>
+ <circle cx="21" cy="19" r="1" fill="rgba(46.3523%,66.6056%,81.5702%,1)"/>
+ <circle cx="22" cy="19" r="1" fill="rgba(60.8972%,75.1293%,85.6657%,1)"/>
+ <circle cx="23" cy="19" r="1" fill="rgba(54.7982%,71.9402%,84.6021%,1)"/>
+ <circle cx="24" cy="19" r="1" fill="rgba(32.8054%,58.0468%,76.701%,1)"/>
+ <circle cx="25" cy="19" r="1" fill="rgba(27.1824%,54.4869%,74.6685%,1)"/>
+ <circle cx="26" cy="19" r="1" fill="rgba(27.7592%,54.8852%,74.9325%,1)"/>
+ <circle cx="27" cy="19" r="1" fill="rgba(28.7343%,54.8745%,74.2397%,1)"/>
+ <circle cx="28" cy="19" r="1" fill="rgba(55.2453%,60.4791%,65.2308%,1)"/>
+ <circle cx="29" cy="19" r="1" fill="rgba(64.6891%,62.5116%,62.0874%,1)"/>
+ <circle cx="30" cy="19" r="1" fill="rgba(63.6027%,62.0279%,62.0325%,1)"/>
+ <circle cx="31" cy="19" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="20" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="20" r="1" fill="rgba(64.1642%,62.5727%,62.5498%,1)"/>
+ <circle cx="2" cy="20" r="1" fill="rgba(63.093%,62.1225%,62.5422%,1)"/>
+ <circle cx="3" cy="20" r="1" fill="rgba(57.0809%,61.8112%,66.1784%,1)"/>
+ <circle cx="4" cy="20" r="1" fill="rgba(67.9057%,76.4706%,83.0671%,1)"/>
+ <circle cx="5" cy="20" r="1" fill="rgba(45.304%,65.9937%,81.2726%,1)"/>
+ <circle cx="6" cy="20" r="1" fill="rgba(27.2465%,54.5296%,74.6944%,1)"/>
+ <circle cx="7" cy="20" r="1" fill="rgba(32.43%,57.7691%,76.4965%,1)"/>
+ <circle cx="8" cy="20" r="1" fill="rgba(32.1859%,57.615%,76.4126%,1)"/>
+ <circle cx="9" cy="20" r="1" fill="rgba(27.4174%,54.6426%,74.7646%,1)"/>
+ <circle cx="10" cy="20" r="1" fill="rgba(25.893%,53.7118%,74.2733%,1)"/>
+ <circle cx="11" cy="20" r="1" fill="rgba(26.7903%,54.2489%,74.5434%,1)"/>
+ <circle cx="12" cy="20" r="1" fill="rgba(27.8187%,54.8867%,74.8928%,1)"/>
+ <circle cx="13" cy="20" r="1" fill="rgba(27.686%,54.8028%,74.847%,1)"/>
+ <circle cx="14" cy="20" r="1" fill="rgba(27.0603%,54.4137%,74.6304%,1)"/>
+ <circle cx="15" cy="20" r="1" fill="rgba(26.8269%,54.2672%,74.5495%,1)"/>
+ <circle cx="16" cy="20" r="1" fill="rgba(27.4266%,54.641%,74.757%,1)"/>
+ <circle cx="17" cy="20" r="1" fill="rgba(26.804%,54.2519%,74.5403%,1)"/>
+ <circle cx="18" cy="20" r="1" fill="rgba(27.129%,54.4549%,74.6532%,1)"/>
+ <circle cx="19" cy="20" r="1" fill="rgba(27.7592%,54.8501%,74.873%,1)"/>
+ <circle cx="20" cy="20" r="1" fill="rgba(27.779%,54.8608%,74.8791%,1)"/>
+ <circle cx="21" cy="20" r="1" fill="rgba(26.5782%,54.1192%,74.4732%,1)"/>
+ <circle cx="22" cy="20" r="1" fill="rgba(25.9709%,53.7606%,74.3008%,1)"/>
+ <circle cx="23" cy="20" r="1" fill="rgba(27.8767%,54.9279%,74.9218%,1)"/>
+ <circle cx="24" cy="20" r="1" fill="rgba(32.8969%,58.0606%,76.6598%,1)"/>
+ <circle cx="25" cy="20" r="1" fill="rgba(31.519%,57.2%,76.1807%,1)"/>
+ <circle cx="26" cy="20" r="1" fill="rgba(27.509%,54.7097%,74.8135%,1)"/>
+ <circle cx="27" cy="20" r="1" fill="rgba(50.8232%,69.0135%,82.4765%,1)"/>
+ <circle cx="28" cy="20" r="1" fill="rgba(64.0543%,69.2531%,73.7316%,1)"/>
+ <circle cx="29" cy="20" r="1" fill="rgba(59.7055%,61.21%,63.3661%,1)"/>
+ <circle cx="30" cy="20" r="1" fill="rgba(63.7522%,62.0584%,61.9806%,1)"/>
+ <circle cx="31" cy="20" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="21" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="21" r="1" fill="rgba(64.271%,62.594%,62.5132%,1)"/>
+ <circle cx="2" cy="21" r="1" fill="rgba(61.5045%,61.8311%,63.1556%,1)"/>
+ <circle cx="3" cy="21" r="1" fill="rgba(34.9767%,56.2493%,72.2118%,1)"/>
+ <circle cx="4" cy="21" r="1" fill="rgba(54.0078%,71.3634%,84.1764%,1)"/>
+ <circle cx="5" cy="21" r="1" fill="rgba(61.9867%,76.2509%,86.7842%,1)"/>
+ <circle cx="6" cy="21" r="1" fill="rgba(26.5736%,54.1085%,74.461%,1)"/>
+ <circle cx="7" cy="21" r="1" fill="rgba(66.6575%,79.1623%,88.4047%,1)"/>
+ <circle cx="8" cy="21" r="1" fill="rgba(74.4793%,84.0497%,91.1238%,1)"/>
+ <circle cx="9" cy="21" r="1" fill="rgba(67.6509%,79.7833%,88.7495%,1)"/>
+ <circle cx="10" cy="21" r="1" fill="rgba(58.3703%,73.9818%,85.5207%,1)"/>
+ <circle cx="11" cy="21" r="1" fill="rgba(32.6253%,57.8912%,76.5652%,1)"/>
+ <circle cx="12" cy="21" r="1" fill="rgba(27.3793%,54.612%,74.7402%,1)"/>
+ <circle cx="13" cy="21" r="1" fill="rgba(30.3532%,56.4706%,75.7748%,1)"/>
+ <circle cx="14" cy="21" r="1" fill="rgba(40.8423%,63.0259%,79.4232%,1)"/>
+ <circle cx="15" cy="21" r="1" fill="rgba(42.385%,63.9902%,79.9603%,1)"/>
+ <circle cx="16" cy="21" r="1" fill="rgba(42.1469%,63.8422%,79.8764%,1)"/>
+ <circle cx="17" cy="21" r="1" fill="rgba(42.4598%,64.0375%,79.9863%,1)"/>
+ <circle cx="18" cy="21" r="1" fill="rgba(39.7086%,62.3178%,79.0295%,1)"/>
+ <circle cx="19" cy="21" r="1" fill="rgba(29.218%,55.761%,75.3796%,1)"/>
+ <circle cx="20" cy="21" r="1" fill="rgba(27.2969%,54.5602%,74.7127%,1)"/>
+ <circle cx="21" cy="21" r="1" fill="rgba(35.761%,59.852%,77.6562%,1)"/>
+ <circle cx="22" cy="21" r="1" fill="rgba(61.0193%,75.6374%,86.4424%,1)"/>
+ <circle cx="23" cy="21" r="1" fill="rgba(68.2017%,80.1282%,88.9403%,1)"/>
+ <circle cx="24" cy="21" r="1" fill="rgba(76.3149%,85.1957%,91.7617%,1)"/>
+ <circle cx="25" cy="21" r="1" fill="rgba(59.7772%,74.8562%,86.0075%,1)"/>
+ <circle cx="26" cy="21" r="1" fill="rgba(26.5766%,54.1085%,74.4594%,1)"/>
+ <circle cx="27" cy="21" r="1" fill="rgba(68.2673%,80.1755%,88.9784%,1)"/>
+ <circle cx="28" cy="21" r="1" fill="rgba(45.6413%,65.6764%,80.5112%,1)"/>
+ <circle cx="29" cy="21" r="1" fill="rgba(47.097%,58.5321%,67.631%,1)"/>
+ <circle cx="30" cy="21" r="1" fill="rgba(64.155%,62.1424%,61.8402%,1)"/>
+ <circle cx="31" cy="21" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="22" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="22" r="1" fill="rgba(64.21%,62.5818%,62.533%,1)"/>
+ <circle cx="2" cy="22" r="1" fill="rgba(62.5422%,62.063%,62.826%,1)"/>
+ <circle cx="3" cy="22" r="1" fill="rgba(35.8831%,56.1242%,71.3771%,1)"/>
+ <circle cx="4" cy="22" r="1" fill="rgba(44.6555%,65.6519%,81.146%,1)"/>
+ <circle cx="5" cy="22" r="1" fill="rgba(75.1675%,84.48%,91.3588%,1)"/>
+ <circle cx="6" cy="22" r="1" fill="rgba(48.484%,67.8019%,82.0813%,1)"/>
+ <circle cx="7" cy="22" r="1" fill="rgba(72.578%,82.8611%,90.4646%,1)"/>
+ <circle cx="8" cy="22" r="1" fill="rgba(44.5136%,65.3193%,80.7004%,1)"/>
+ <circle cx="9" cy="22" r="1" fill="rgba(41.0224%,63.1403%,79.4858%,1)"/>
+ <circle cx="10" cy="22" r="1" fill="rgba(73.7133%,83.5752%,90.8568%,1)"/>
+ <circle cx="11" cy="22" r="1" fill="rgba(41.5625%,63.4745%,79.675%,1)"/>
+ <circle cx="12" cy="22" r="1" fill="rgba(25.2064%,53.254%,73.9849%,1)"/>
+ <circle cx="13" cy="22" r="1" fill="rgba(43.5981%,64.7486%,80.3815%,1)"/>
+ <circle cx="14" cy="22" r="1" fill="rgba(78.5977%,86.6255%,92.5551%,1)"/>
+ <circle cx="15" cy="22" r="1" fill="rgba(66.3554%,78.9731%,88.2963%,1)"/>
+ <circle cx="16" cy="22" r="1" fill="rgba(66.5187%,79.0707%,88.3558%,1)"/>
+ <circle cx="17" cy="22" r="1" fill="rgba(67.1595%,79.4766%,88.5756%,1)"/>
+ <circle cx="18" cy="22" r="1" fill="rgba(78.0682%,86.2959%,92.3705%,1)"/>
+ <circle cx="19" cy="22" r="1" fill="rgba(37.1588%,60.7263%,78.1415%,1)"/>
+ <circle cx="20" cy="22" r="1" fill="rgba(25.1759%,53.2341%,73.9742%,1)"/>
+ <circle cx="21" cy="22" r="1" fill="rgba(49.1432%,68.22%,82.3102%,1)"/>
+ <circle cx="22" cy="22" r="1" fill="rgba(69.9687%,81.2329%,89.5521%,1)"/>
+ <circle cx="23" cy="22" r="1" fill="rgba(38.5885%,61.6175%,78.6389%,1)"/>
+ <circle cx="24" cy="22" r="1" fill="rgba(50.2449%,68.8975%,82.6932%,1)"/>
+ <circle cx="25" cy="22" r="1" fill="rgba(69.4423%,80.8927%,89.3675%,1)"/>
+ <circle cx="26" cy="22" r="1" fill="rgba(50.0496%,68.7816%,82.6246%,1)"/>
+ <circle cx="27" cy="22" r="1" fill="rgba(76.3958%,85.2506%,91.7967%,1)"/>
+ <circle cx="28" cy="22" r="1" fill="rgba(38.5595%,61.6419%,78.7015%,1)"/>
+ <circle cx="29" cy="22" r="1" fill="rgba(49.2988%,59.0555%,66.978%,1)"/>
+ <circle cx="30" cy="22" r="1" fill="rgba(64.21%,62.153%,61.8219%,1)"/>
+ <circle cx="31" cy="22" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="23" r="1" fill="rgba(83.9948%,83.299%,83.299%,1)"/>
+ <circle cx="1" cy="23" r="1" fill="rgba(64.1291%,62.565%,62.562%,1)"/>
+ <circle cx="2" cy="23" r="1" fill="rgba(64.2359%,62.4125%,62.2339%,1)"/>
+ <circle cx="3" cy="23" r="1" fill="rgba(46.6758%,58.7213%,68.2338%,1)"/>
+ <circle cx="4" cy="23" r="1" fill="rgba(30.248%,56.5072%,75.9091%,1)"/>
+ <circle cx="5" cy="23" r="1" fill="rgba(47.8492%,67.4159%,81.8769%,1)"/>
+ <circle cx="6" cy="23" r="1" fill="rgba(65.1484%,78.2177%,87.8782%,1)"/>
+ <circle cx="7" cy="23" r="1" fill="rgba(74.4488%,84.0299%,91.1131%,1)"/>
+ <circle cx="8" cy="23" r="1" fill="rgba(35.2712%,59.5438%,77.4853%,1)"/>
+ <circle cx="9" cy="23" r="1" fill="rgba(26.4393%,54.0261%,74.4137%,1)"/>
+ <circle cx="10" cy="23" r="1" fill="rgba(66.9627%,79.3561%,88.5069%,1)"/>
+ <circle cx="11" cy="23" r="1" fill="rgba(59.0951%,74.432%,85.774%,1)"/>
+ <circle cx="12" cy="23" r="1" fill="rgba(40.4486%,62.7802%,79.2859%,1)"/>
+ <circle cx="13" cy="23" r="1" fill="rgba(53.5042%,70.9407%,83.827%,1)"/>
+ <circle cx="14" cy="23" r="1" fill="rgba(63.6011%,77.2549%,87.3396%,1)"/>
+ <circle cx="15" cy="23" r="1" fill="rgba(27.2862%,54.5541%,74.7082%,1)"/>
+ <circle cx="16" cy="23" r="1" fill="rgba(27.9545%,54.9706%,74.9401%,1)"/>
+ <circle cx="17" cy="23" r="1" fill="rgba(28.9006%,55.5627%,75.2682%,1)"/>
+ <circle cx="18" cy="23" r="1" fill="rgba(69.0059%,80.6332%,89.2164%,1)"/>
+ <circle cx="19" cy="23" r="1" fill="rgba(47.8874%,67.4327%,81.8723%,1)"/>
+ <circle cx="20" cy="23" r="1" fill="rgba(41.5381%,63.4607%,79.6658%,1)"/>
+ <circle cx="21" cy="23" r="1" fill="rgba(64.6494%,77.9095%,87.7043%,1)"/>
+ <circle cx="22" cy="23" r="1" fill="rgba(59.7314%,74.8333%,85.9907%,1)"/>
+ <circle cx="23" cy="23" r="1" fill="rgba(25.2415%,53.2753%,73.9971%,1)"/>
+ <circle cx="24" cy="23" r="1" fill="rgba(40.8011%,62.9984%,79.4079%,1)"/>
+ <circle cx="25" cy="23" r="1" fill="rgba(76.0235%,85.0126%,91.6594%,1)"/>
+ <circle cx="26" cy="23" r="1" fill="rgba(62.6383%,76.6476%,87.0024%,1)"/>
+ <circle cx="27" cy="23" r="1" fill="rgba(44.5518%,65.4826%,80.9415%,1)"/>
+ <circle cx="28" cy="23" r="1" fill="rgba(33.3211%,56.6079%,73.9513%,1)"/>
+ <circle cx="29" cy="23" r="1" fill="rgba(58.1231%,61.1139%,64.3%,1)"/>
+ <circle cx="30" cy="23" r="1" fill="rgba(63.9521%,62.0996%,61.912%,1)"/>
+ <circle cx="31" cy="23" r="1" fill="rgba(77.2137%,76.2234%,76.2234%,1)"/>
+ <circle cx="0" cy="24" r="1" fill="rgba(83.9872%,83.2914%,83.2914%,1)"/>
+ <circle cx="1" cy="24" r="1" fill="rgba(64.1215%,62.562%,62.562%,1)"/>
+ <circle cx="2" cy="24" r="1" fill="rgba(64.1566%,62.3957%,62.2614%,1)"/>
+ <circle cx="3" cy="24" r="1" fill="rgba(60.2472%,61.5991%,63.6393%,1)"/>
+ <circle cx="4" cy="24" r="1" fill="rgba(36.0327%,56.5194%,71.9295%,1)"/>
+ <circle cx="5" cy="24" r="1" fill="rgba(26.215%,54.1253%,74.7341%,1)"/>
+ <circle cx="6" cy="24" r="1" fill="rgba(27.7485%,54.8486%,74.8791%,1)"/>
+ <circle cx="7" cy="24" r="1" fill="rgba(30.9468%,56.8414%,75.9808%,1)"/>
+ <circle cx="8" cy="24" r="1" fill="rgba(28.3513%,55.2193%,75.079%,1)"/>
+ <circle cx="9" cy="24" r="1" fill="rgba(27.5288%,54.7066%,74.7936%,1)"/>
+ <circle cx="10" cy="24" r="1" fill="rgba(44.3702%,65.2323%,80.65%,1)"/>
+ <circle cx="11" cy="24" r="1" fill="rgba(62.4582%,76.5362%,86.9413%,1)"/>
+ <circle cx="12" cy="24" r="1" fill="rgba(66.9718%,79.3576%,88.513%,1)"/>
+ <circle cx="13" cy="24" r="1" fill="rgba(74.2168%,83.8849%,91.0323%,1)"/>
+ <circle cx="14" cy="24" r="1" fill="rgba(56.2234%,72.6421%,84.7745%,1)"/>
+ <circle cx="15" cy="24" r="1" fill="rgba(27.1443%,54.4656%,74.6593%,1)"/>
+ <circle cx="16" cy="24" r="1" fill="rgba(27.8035%,54.8775%,74.8882%,1)"/>
+ <circle cx="17" cy="24" r="1" fill="rgba(28.1498%,55.0942%,75.0088%,1)"/>
+ <circle cx="18" cy="24" r="1" fill="rgba(62.649%,76.6583%,87.0069%,1)"/>
+ <circle cx="19" cy="24" r="1" fill="rgba(72.7901%,82.9953%,90.5348%,1)"/>
+ <circle cx="20" cy="24" r="1" fill="rgba(66.4179%,79.0112%,88.3192%,1)"/>
+ <circle cx="21" cy="24" r="1" fill="rgba(61.2802%,75.8007%,86.5324%,1)"/>
+ <circle cx="22" cy="24" r="1" fill="rgba(40.3021%,62.6886%,79.2355%,1)"/>
+ <circle cx="23" cy="24" r="1" fill="rgba(27.2923%,54.5586%,74.7112%,1)"/>
+ <circle cx="24" cy="24" r="1" fill="rgba(28.7663%,55.4788%,75.2224%,1)"/>
+ <circle cx="25" cy="24" r="1" fill="rgba(30.7973%,56.7468%,75.9258%,1)"/>
+ <circle cx="26" cy="24" r="1" fill="rgba(27.1748%,54.5556%,74.789%,1)"/>
+ <circle cx="27" cy="24" r="1" fill="rgba(27.3259%,54.3984%,74.4213%,1)"/>
+ <circle cx="28" cy="24" r="1" fill="rgba(47.2236%,58.8647%,68.0949%,1)"/>
+ <circle cx="29" cy="24" r="1" fill="rgba(63.946%,62.3606%,62.3499%,1)"/>
+ <circle cx="30" cy="24" r="1" fill="rgba(63.6316%,62.034%,62.0218%,1)"/>
+ <circle cx="31" cy="24" r="1" fill="rgba(77.2045%,76.2142%,76.2142%,1)"/>
+ <circle cx="0" cy="25" r="1" fill="rgba(84.0635%,83.3707%,83.3707%,1)"/>
+ <circle cx="1" cy="25" r="1" fill="rgba(64.1276%,62.5681%,62.5681%,1)"/>
+ <circle cx="2" cy="25" r="1" fill="rgba(63.9094%,62.3453%,62.3484%,1)"/>
+ <circle cx="3" cy="25" r="1" fill="rgba(64.2802%,62.4262%,62.2278%,1)"/>
+ <circle cx="4" cy="25" r="1" fill="rgba(57.2259%,60.9705%,64.6799%,1)"/>
+ <circle cx="5" cy="25" r="1" fill="rgba(35.6832%,56.5209%,72.1752%,1)"/>
+ <circle cx="6" cy="25" r="1" fill="rgba(27.3869%,54.7967%,75.0423%,1)"/>
+ <circle cx="7" cy="25" r="1" fill="rgba(27.4846%,54.7509%,74.8974%,1)"/>
+ <circle cx="8" cy="25" r="1" fill="rgba(27.8141%,54.8821%,74.8898%,1)"/>
+ <circle cx="9" cy="25" r="1" fill="rgba(27.8508%,54.9065%,74.905%,1)"/>
+ <circle cx="10" cy="25" r="1" fill="rgba(27.1275%,54.4549%,74.6532%,1)"/>
+ <circle cx="11" cy="25" r="1" fill="rgba(26.978%,54.3618%,74.6014%,1)"/>
+ <circle cx="12" cy="25" r="1" fill="rgba(28.2536%,55.1583%,75.0439%,1)"/>
+ <circle cx="13" cy="25" r="1" fill="rgba(30.5257%,56.5789%,75.8358%,1)"/>
+ <circle cx="14" cy="25" r="1" fill="rgba(29.4621%,55.9136%,75.465%,1)"/>
+ <circle cx="15" cy="25" r="1" fill="rgba(27.7806%,54.8638%,74.8806%,1)"/>
+ <circle cx="16" cy="25" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="17" cy="25" r="1" fill="rgba(27.8141%,54.8836%,74.8913%,1)"/>
+ <circle cx="18" cy="25" r="1" fill="rgba(29.9138%,56.1959%,75.6222%,1)"/>
+ <circle cx="19" cy="25" r="1" fill="rgba(30.2266%,56.3912%,75.7305%,1)"/>
+ <circle cx="20" cy="25" r="1" fill="rgba(27.9973%,54.9981%,74.9554%,1)"/>
+ <circle cx="21" cy="25" r="1" fill="rgba(26.8833%,54.3023%,74.5678%,1)"/>
+ <circle cx="22" cy="25" r="1" fill="rgba(27.2801%,54.5495%,74.7066%,1)"/>
+ <circle cx="23" cy="25" r="1" fill="rgba(27.8676%,54.9172%,74.9096%,1)"/>
+ <circle cx="24" cy="25" r="1" fill="rgba(27.7668%,54.8623%,74.8882%,1)"/>
+ <circle cx="25" cy="25" r="1" fill="rgba(27.248%,54.7066%,74.9874%,1)"/>
+ <circle cx="26" cy="25" r="1" fill="rgba(28.8746%,55.111%,74.5357%,1)"/>
+ <circle cx="27" cy="25" r="1" fill="rgba(44.7517%,58.3932%,69.0196%,1)"/>
+ <circle cx="28" cy="25" r="1" fill="rgba(62.6108%,62.0829%,62.8092%,1)"/>
+ <circle cx="29" cy="25" r="1" fill="rgba(64.0589%,62.3819%,62.3056%,1)"/>
+ <circle cx="30" cy="25" r="1" fill="rgba(63.6088%,62.0279%,62.0294%,1)"/>
+ <circle cx="31" cy="25" r="1" fill="rgba(77.2839%,76.2951%,76.2951%,1)"/>
+ <circle cx="0" cy="26" r="1" fill="rgba(86.4393%,85.8503%,85.8503%,1)"/>
+ <circle cx="1" cy="26" r="1" fill="rgba(64.5747%,63.035%,63.035%,1)"/>
+ <circle cx="2" cy="26" r="1" fill="rgba(63.8941%,62.3239%,62.3239%,1)"/>
+ <circle cx="3" cy="26" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="4" cy="26" r="1" fill="rgba(64.2969%,62.4308%,62.2232%,1)"/>
+ <circle cx="5" cy="26" r="1" fill="rgba(59.4583%,61.4313%,63.9048%,1)"/>
+ <circle cx="6" cy="26" r="1" fill="rgba(42.5086%,57.9309%,69.8024%,1)"/>
+ <circle cx="7" cy="26" r="1" fill="rgba(30.0191%,55.3521%,74.1451%,1)"/>
+ <circle cx="8" cy="26" r="1" fill="rgba(27.2862%,54.7875%,75.0958%,1)"/>
+ <circle cx="9" cy="26" r="1" fill="rgba(27.5425%,54.8394%,75.0057%,1)"/>
+ <circle cx="10" cy="26" r="1" fill="rgba(27.805%,54.8943%,74.9157%,1)"/>
+ <circle cx="11" cy="26" r="1" fill="rgba(27.8447%,54.902%,74.902%,1)"/>
+ <circle cx="12" cy="26" r="1" fill="rgba(27.8187%,54.8867%,74.8928%,1)"/>
+ <circle cx="13" cy="26" r="1" fill="rgba(27.7058%,54.8165%,74.8547%,1)"/>
+ <circle cx="14" cy="26" r="1" fill="rgba(27.744%,54.8394%,74.8669%,1)"/>
+ <circle cx="15" cy="26" r="1" fill="rgba(27.8462%,54.905%,74.9035%,1)"/>
+ <circle cx="16" cy="26" r="1" fill="rgba(71,140,191,1)"/>
+ <circle cx="17" cy="26" r="1" fill="rgba(27.8447%,54.9035%,74.902%,1)"/>
+ <circle cx="18" cy="26" r="1" fill="rgba(27.7195%,54.8241%,74.8592%,1)"/>
+ <circle cx="19" cy="26" r="1" fill="rgba(27.7256%,54.8287%,74.8608%,1)"/>
+ <circle cx="20" cy="26" r="1" fill="rgba(27.8264%,54.8913%,74.8959%,1)"/>
+ <circle cx="21" cy="26" r="1" fill="rgba(27.8401%,54.902%,74.9035%,1)"/>
+ <circle cx="22" cy="26" r="1" fill="rgba(27.7287%,54.8791%,74.9416%,1)"/>
+ <circle cx="23" cy="26" r="1" fill="rgba(27.3655%,54.8028%,75.0683%,1)"/>
+ <circle cx="24" cy="26" r="1" fill="rgba(27.7195%,54.876%,74.9447%,1)"/>
+ <circle cx="25" cy="26" r="1" fill="rgba(33.9117%,56.1547%,72.7916%,1)"/>
+ <circle cx="26" cy="26" r="1" fill="rgba(50.4295%,59.5666%,67.0466%,1)"/>
+ <circle cx="27" cy="26" r="1" fill="rgba(63.1159%,62.1866%,62.6337%,1)"/>
+ <circle cx="28" cy="26" r="1" fill="rgba(64.1016%,62.3896%,62.2904%,1)"/>
+ <circle cx="29" cy="26" r="1" fill="rgba(63.917%,62.3529%,62.356%,1)"/>
+ <circle cx="30" cy="26" r="1" fill="rgba(63.7232%,62.1469%,62.1469%,1)"/>
+ <circle cx="31" cy="26" r="1" fill="rgba(79.8306%,78.9532%,78.9532%,1)"/>
+ <circle cx="0" cy="27" r="1" fill="rgba(93.1426%,92.845%,92.845%,1)"/>
+ <circle cx="1" cy="27" r="1" fill="rgba(67.5502%,66.1402%,66.1402%,1)"/>
+ <circle cx="2" cy="27" r="1" fill="rgba(63.682%,62.1027%,62.1027%,1)"/>
+ <circle cx="3" cy="27" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="4" cy="27" r="1" fill="rgba(63.917%,62.3514%,62.3545%,1)"/>
+ <circle cx="5" cy="27" r="1" fill="rgba(64.2283%,62.4155%,62.2461%,1)"/>
+ <circle cx="6" cy="27" r="1" fill="rgba(63.3555%,62.237%,62.5498%,1)"/>
+ <circle cx="7" cy="27" r="1" fill="rgba(55.0591%,60.5234%,65.4368%,1)"/>
+ <circle cx="8" cy="27" r="1" fill="rgba(41.9715%,57.8195%,69.9886%,1)"/>
+ <circle cx="9" cy="27" r="1" fill="rgba(32.4514%,55.8541%,73.2998%,1)"/>
+ <circle cx="10" cy="27" r="1" fill="rgba(28.3421%,55.0057%,74.7295%,1)"/>
+ <circle cx="11" cy="27" r="1" fill="rgba(27.3014%,54.7906%,75.0896%,1)"/>
+ <circle cx="12" cy="27" r="1" fill="rgba(27.2587%,54.7814%,75.1049%,1)"/>
+ <circle cx="13" cy="27" r="1" fill="rgba(27.4083%,54.8119%,75.053%,1)"/>
+ <circle cx="14" cy="27" r="1" fill="rgba(27.5349%,54.8379%,75.0088%,1)"/>
+ <circle cx="15" cy="27" r="1" fill="rgba(27.6066%,54.8531%,74.9844%,1)"/>
+ <circle cx="16" cy="27" r="1" fill="rgba(27.6219%,54.8562%,74.9783%,1)"/>
+ <circle cx="17" cy="27" r="1" fill="rgba(27.5822%,54.8486%,74.992%,1)"/>
+ <circle cx="18" cy="27" r="1" fill="rgba(27.4876%,54.8287%,75.0256%,1)"/>
+ <circle cx="19" cy="27" r="1" fill="rgba(27.3411%,54.7982%,75.0759%,1)"/>
+ <circle cx="20" cy="27" r="1" fill="rgba(27.2297%,54.7753%,75.1156%,1)"/>
+ <circle cx="21" cy="27" r="1" fill="rgba(27.5364%,54.8379%,75.0088%,1)"/>
+ <circle cx="22" cy="27" r="1" fill="rgba(29.5689%,55.259%,74.3023%,1)"/>
+ <circle cx="23" cy="27" r="1" fill="rgba(35.8053%,56.5454%,72.1309%,1)"/>
+ <circle cx="24" cy="27" r="1" fill="rgba(47.5334%,58.9685%,68.0522%,1)"/>
+ <circle cx="25" cy="27" r="1" fill="rgba(59.6811%,61.4771%,63.827%,1)"/>
+ <circle cx="26" cy="27" r="1" fill="rgba(64.2832%,62.4277%,62.2278%,1)"/>
+ <circle cx="27" cy="27" r="1" fill="rgba(64.0162%,62.3728%,62.3209%,1)"/>
+ <circle cx="28" cy="27" r="1" fill="rgba(63.917%,62.3514%,62.3545%,1)"/>
+ <circle cx="29" cy="27" r="1" fill="rgba(63.8437%,62.2721%,62.2721%,1)"/>
+ <circle cx="30" cy="27" r="1" fill="rgba(65.1453%,63.6301%,63.6301%,1)"/>
+ <circle cx="31" cy="27" r="1" fill="rgba(87.8477%,87.3198%,87.3198%,1)"/>
+ <circle cx="0" cy="28" r="1" fill="rgba(99.3515%,99.324%,99.324%,1)"/>
+ <circle cx="1" cy="28" r="1" fill="rgba(78.4466%,77.5082%,77.5082%,1)"/>
+ <circle cx="2" cy="28" r="1" fill="rgba(63.386%,61.7929%,61.7929%,1)"/>
+ <circle cx="3" cy="28" r="1" fill="rgba(63.9063%,62.3377%,62.3377%,1)"/>
+ <circle cx="4" cy="28" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="5" cy="28" r="1" fill="rgba(63.9185%,62.3529%,62.3545%,1)"/>
+ <circle cx="6" cy="28" r="1" fill="rgba(63.9811%,62.3651%,62.3331%,1)"/>
+ <circle cx="7" cy="28" r="1" fill="rgba(64.3931%,62.4506%,62.1881%,1)"/>
+ <circle cx="8" cy="28" r="1" fill="rgba(63.682%,62.3041%,62.4369%,1)"/>
+ <circle cx="9" cy="28" r="1" fill="rgba(59.2889%,61.3977%,63.9658%,1)"/>
+ <circle cx="10" cy="28" r="1" fill="rgba(51.9249%,59.8764%,66.5263%,1)"/>
+ <circle cx="11" cy="28" r="1" fill="rgba(44.4251%,58.3276%,69.1341%,1)"/>
+ <circle cx="12" cy="28" r="1" fill="rgba(38.584%,57.1191%,71.1666%,1)"/>
+ <circle cx="13" cy="28" r="1" fill="rgba(34.7936%,56.3363%,72.4849%,1)"/>
+ <circle cx="14" cy="28" r="1" fill="rgba(32.6085%,55.8862%,73.2448%,1)"/>
+ <circle cx="15" cy="28" r="1" fill="rgba(31.5084%,55.6588%,73.6263%,1)"/>
+ <circle cx="16" cy="28" r="1" fill="rgba(31.2734%,55.6115%,73.7072%,1)"/>
+ <circle cx="17" cy="28" r="1" fill="rgba(31.8685%,55.7336%,73.5027%,1)"/>
+ <circle cx="18" cy="28" r="1" fill="rgba(33.3806%,56.0449%,72.9763%,1)"/>
+ <circle cx="19" cy="28" r="1" fill="rgba(36.1852%,56.6247%,72.0012%,1)"/>
+ <circle cx="20" cy="28" r="1" fill="rgba(40.8255%,57.583%,70.3868%,1)"/>
+ <circle cx="21" cy="28" r="1" fill="rgba(47.5044%,58.9624%,68.0644%,1)"/>
+ <circle cx="22" cy="28" r="1" fill="rgba(55.259%,60.5646%,65.3666%,1)"/>
+ <circle cx="23" cy="28" r="1" fill="rgba(61.6739%,61.8891%,63.1342%,1)"/>
+ <circle cx="24" cy="28" r="1" fill="rgba(64.3229%,62.4353%,62.2126%,1)"/>
+ <circle cx="25" cy="28" r="1" fill="rgba(64.1978%,62.4094%,62.2568%,1)"/>
+ <circle cx="26" cy="28" r="1" fill="rgba(63.9231%,62.3529%,62.3529%,1)"/>
+ <circle cx="27" cy="28" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="28" cy="28" r="1" fill="rgba(63.9261%,62.3575%,62.3575%,1)"/>
+ <circle cx="29" cy="28" r="1" fill="rgba(63.3204%,61.7258%,61.7258%,1)"/>
+ <circle cx="30" cy="28" r="1" fill="rgba(73.4371%,72.282%,72.282%,1)"/>
+ <circle cx="31" cy="28" r="1" fill="rgba(97.3617%,97.2473%,97.2473%,1)"/>
+ <circle cx="0" cy="29" r="1" fill="white"/>
+ <circle cx="1" cy="29" r="1" fill="rgba(95.0423%,94.8272%,94.8272%,1)"/>
+ <circle cx="2" cy="29" r="1" fill="rgba(71.9661%,70.7469%,70.7469%,1)"/>
+ <circle cx="3" cy="29" r="1" fill="rgba(63.3356%,61.7426%,61.7426%,1)"/>
+ <circle cx="4" cy="29" r="1" fill="rgba(63.772%,62.1958%,62.1958%,1)"/>
+ <circle cx="5" cy="29" r="1" fill="rgba(63.92%,62.3514%,62.3514%,1)"/>
+ <circle cx="6" cy="29" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="7" cy="29" r="1" fill="rgba(63.92%,62.3529%,62.3529%,1)"/>
+ <circle cx="8" cy="29" r="1" fill="rgba(63.9521%,62.359%,62.3423%,1)"/>
+ <circle cx="9" cy="29" r="1" fill="rgba(64.2145%,62.414%,62.2507%,1)"/>
+ <circle cx="10" cy="29" r="1" fill="rgba(64.5045%,62.4735%,62.15%,1)"/>
+ <circle cx="11" cy="29" r="1" fill="rgba(64.2451%,62.4201%,62.24%,1)"/>
+ <circle cx="12" cy="29" r="1" fill="rgba(63.1647%,62.1973%,62.6169%,1)"/>
+ <circle cx="13" cy="29" r="1" fill="rgba(61.5335%,61.8601%,63.183%,1)"/>
+ <circle cx="14" cy="29" r="1" fill="rgba(59.9359%,61.529%,63.74%,1)"/>
+ <circle cx="15" cy="29" r="1" fill="rgba(58.8159%,61.2985%,64.1291%,1)"/>
+ <circle cx="16" cy="29" r="1" fill="rgba(58.5397%,61.2421%,64.2237%,1)"/>
+ <circle cx="17" cy="29" r="1" fill="rgba(59.2111%,61.3794%,63.9918%,1)"/>
+ <circle cx="18" cy="29" r="1" fill="rgba(60.5798%,61.6632%,63.5157%,1)"/>
+ <circle cx="19" cy="29" r="1" fill="rgba(62.2614%,62.0096%,62.9313%,1)"/>
+ <circle cx="20" cy="29" r="1" fill="rgba(63.7232%,62.3117%,62.4216%,1)"/>
+ <circle cx="21" cy="29" r="1" fill="rgba(64.4526%,62.4628%,62.1683%,1)"/>
+ <circle cx="22" cy="29" r="1" fill="rgba(64.416%,62.4552%,62.1805%,1)"/>
+ <circle cx="23" cy="29" r="1" fill="rgba(64.0696%,62.3835%,62.3011%,1)"/>
+ <circle cx="24" cy="29" r="1" fill="rgba(63.9231%,62.3529%,62.3529%,1)"/>
+ <circle cx="25" cy="29" r="1" fill="rgba(163,159,159,1)"/>
+ <circle cx="26" cy="29" r="1" fill="rgba(63.9231%,62.3545%,62.3545%,1)"/>
+ <circle cx="27" cy="29" r="1" fill="rgba(63.8315%,62.2599%,62.2599%,1)"/>
+ <circle cx="28" cy="29" r="1" fill="rgba(63.3158%,61.7197%,61.7197%,1)"/>
+ <circle cx="29" cy="29" r="1" fill="rgba(68.6366%,67.274%,67.274%,1)"/>
+ <circle cx="30" cy="29" r="1" fill="rgba(91.5679%,91.2016%,91.2016%,1)"/>
+ <circle cx="31" cy="29" r="1" fill="white"/>
+ <circle cx="0" cy="30" r="1" fill="white"/>
+ <circle cx="1" cy="30" r="1" fill="white"/>
+ <circle cx="2" cy="30" r="1" fill="rgba(94.5739%,94.3374%,94.3374%,1)"/>
+ <circle cx="3" cy="30" r="1" fill="rgba(76.7437%,75.7321%,75.7321%,1)"/>
+ <circle cx="4" cy="30" r="1" fill="rgba(66.1479%,64.6769%,64.6769%,1)"/>
+ <circle cx="5" cy="30" r="1" fill="rgba(63.8911%,62.3209%,62.3209%,1)"/>
+ <circle cx="6" cy="30" r="1" fill="rgba(63.653%,62.0722%,62.0722%,1)"/>
+ <circle cx="7" cy="30" r="1" fill="rgba(63.65%,62.0676%,62.0676%,1)"/>
+ <circle cx="8" cy="30" r="1" fill="rgba(63.65%,62.0691%,62.0691%,1)"/>
+ <circle cx="9" cy="30" r="1" fill="rgba(63.65%,62.0691%,62.0691%,1)"/>
+ <circle cx="10" cy="30" r="1" fill="rgba(63.65%,62.0691%,62.0691%,1)"/>
+ <circle cx="11" cy="30" r="1" fill="rgba(63.653%,62.0691%,62.0676%,1)"/>
+ <circle cx="12" cy="30" r="1" fill="rgba(63.6973%,62.0798%,62.0523%,1)"/>
+ <circle cx="13" cy="30" r="1" fill="rgba(63.7995%,62.0996%,62.0172%,1)"/>
+ <circle cx="14" cy="30" r="1" fill="rgba(63.9048%,62.1225%,61.9806%,1)"/>
+ <circle cx="15" cy="30" r="1" fill="rgba(63.9765%,62.1363%,61.9562%,1)"/>
+ <circle cx="16" cy="30" r="1" fill="rgba(63.9933%,62.1408%,61.9501%,1)"/>
+ <circle cx="17" cy="30" r="1" fill="rgba(63.9521%,62.1317%,61.9638%,1)"/>
+ <circle cx="18" cy="30" r="1" fill="rgba(63.8621%,62.1134%,61.9944%,1)"/>
+ <circle cx="19" cy="30" r="1" fill="rgba(63.7522%,62.0905%,62.034%,1)"/>
+ <circle cx="20" cy="30" r="1" fill="rgba(63.6698%,62.0737%,62.0615%,1)"/>
+ <circle cx="21" cy="30" r="1" fill="rgba(63.65%,62.0691%,62.0691%,1)"/>
+ <circle cx="22" cy="30" r="1" fill="rgba(63.65%,62.0691%,62.0691%,1)"/>
+ <circle cx="23" cy="30" r="1" fill="rgba(63.65%,62.0691%,62.0691%,1)"/>
+ <circle cx="24" cy="30" r="1" fill="rgba(63.65%,62.0691%,62.0691%,1)"/>
+ <circle cx="25" cy="30" r="1" fill="rgba(63.6484%,62.0676%,62.0676%,1)"/>
+ <circle cx="26" cy="30" r="1" fill="rgba(63.7903%,62.2156%,62.2156%,1)"/>
+ <circle cx="27" cy="30" r="1" fill="rgba(65.3529%,63.8453%,63.8453%,1)"/>
+ <circle cx="28" cy="30" r="1" fill="rgba(73.7987%,72.6604%,72.6604%,1)"/>
+ <circle cx="29" cy="30" r="1" fill="rgba(91.7433%,91.3848%,91.3848%,1)"/>
+ <circle cx="30" cy="30" r="1" fill="white"/>
+ <circle cx="31" cy="30" r="1" fill="white"/>
+ <circle cx="0" cy="31" r="1" fill="white"/>
+ <circle cx="1" cy="31" r="1" fill="white"/>
+ <circle cx="2" cy="31" r="1" fill="white"/>
+ <circle cx="3" cy="31" r="1" fill="rgba(98.5611%,98.5%,98.5%,1)"/>
+ <circle cx="4" cy="31" r="1" fill="rgba(90.4448%,90.0298%,90.0298%,1)"/>
+ <circle cx="5" cy="31" r="1" fill="rgba(81.854%,81.0651%,81.0651%,1)"/>
+ <circle cx="6" cy="31" r="1" fill="rgba(78.5306%,77.5967%,77.5967%,1)"/>
+ <circle cx="7" cy="31" r="1" fill="rgba(78.3322%,77.3907%,77.3907%,1)"/>
+ <circle cx="8" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="9" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="10" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="11" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="12" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="13" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="14" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="15" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="16" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="17" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="18" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="19" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="20" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="21" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="22" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="23" cy="31" r="1" fill="rgba(78.3474%,77.406%,77.406%,1)"/>
+ <circle cx="24" cy="31" r="1" fill="rgba(78.3413%,77.3983%,77.3983%,1)"/>
+ <circle cx="25" cy="31" r="1" fill="rgba(78.3948%,77.4548%,77.4548%,1)"/>
+ <circle cx="26" cy="31" r="1" fill="rgba(80.8118%,79.9771%,79.9771%,1)"/>
+ <circle cx="27" cy="31" r="1" fill="rgba(88.5771%,88.0797%,88.0797%,1)"/>
+ <circle cx="28" cy="31" r="1" fill="rgba(97.5509%,97.4456%,97.4456%,1)"/>
+ <circle cx="29" cy="31" r="1" fill="white"/>
+ <circle cx="30" cy="31" r="1" fill="white"/>
+ <circle cx="31" cy="31" r="1" fill="white"/>
+</svg>
diff --git a/tools/steam/icon32.ico b/tools/steam/icon32.ico
new file mode 100644
index 0000000000..17637c6784
--- /dev/null
+++ b/tools/steam/icon32.ico
Binary files differ
diff --git a/tools/steam/icons.zip b/tools/steam/icons.zip
new file mode 100644
index 0000000000..eaeee02298
--- /dev/null
+++ b/tools/steam/icons.zip
Binary files differ
diff --git a/tools/steam/large_capsule.png b/tools/steam/large_capsule.png
new file mode 100644
index 0000000000..14c8ff86d7
--- /dev/null
+++ b/tools/steam/large_capsule.png
Binary files differ
diff --git a/tools/steam/main_capsule.png b/tools/steam/main_capsule.png
new file mode 100644
index 0000000000..5af9406d11
--- /dev/null
+++ b/tools/steam/main_capsule.png
Binary files differ
diff --git a/tools/steam/make_icons.sh b/tools/steam/make_icons.sh
new file mode 100644
index 0000000000..111d7bec2c
--- /dev/null
+++ b/tools/steam/make_icons.sh
@@ -0,0 +1,7 @@
+convert -resize 32x32 ../../godot_icon.svg icon32.ico
+convert -resize 32x32 ../../godot_icon.svg icon32.icns
+for s in 16 24 32 64 96 128 256; do convert -resize ${s}x$s ../../godot_icon.svg icon$s.png; done
+zip icons.zip icon*.png
+rm icon*.png
+
+
diff --git a/tools/steam/small_capsule.png b/tools/steam/small_capsule.png
new file mode 100644
index 0000000000..991896728d
--- /dev/null
+++ b/tools/steam/small_capsule.png
Binary files differ
diff --git a/version.py b/version.py
index 0fa26cfc16..86e28ec51d 100644
--- a/version.py
+++ b/version.py
@@ -2,7 +2,7 @@ short_name="godot"
name="Godot Engine"
major=2
minor=0
-status="rc1"
+status="stable"