diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/third_party/skia/tools | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-chromium-85-based.tar.gz |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/third_party/skia/tools')
81 files changed, 7248 insertions, 895 deletions
diff --git a/chromium/third_party/skia/tools/DDLPromiseImageHelper.cpp b/chromium/third_party/skia/tools/DDLPromiseImageHelper.cpp index 89dca3c80f7..2dba0b9f8cb 100644 --- a/chromium/third_party/skia/tools/DDLPromiseImageHelper.cpp +++ b/chromium/third_party/skia/tools/DDLPromiseImageHelper.cpp @@ -128,6 +128,7 @@ static GrBackendTexture create_yuva_texture(GrContext* context, const SkPixmap& auto beTex = context->createBackendTexture(&pm, 1, GrRenderable::kNo, GrProtected::kNo, markFinished, &finishedBECreate); if (beTex.isValid()) { + context->submit(); while (!finishedBECreate) { context->checkAsyncWorkCompletion(); } @@ -175,6 +176,7 @@ void DDLPromiseImageHelper::CreateBETexturesForPromiseImage(GrContext* context, GrRenderable::kNo, GrProtected::kNo, markFinished, &finishedBECreate); SkASSERT(backendTex.isValid()); + context->submit(); while (!finishedBECreate) { context->checkAsyncWorkCompletion(); } diff --git a/chromium/third_party/skia/tools/DDLTileHelper.cpp b/chromium/third_party/skia/tools/DDLTileHelper.cpp index 7771a6ec961..6333ded6219 100644 --- a/chromium/third_party/skia/tools/DDLTileHelper.cpp +++ b/chromium/third_party/skia/tools/DDLTileHelper.cpp @@ -109,6 +109,7 @@ void DDLTileHelper::createComposeDDL() { } fComposeDDL = recorder.detach(); + SkASSERT(fComposeDDL); } void DDLTileHelper::TileData::precompile(GrContext* context) { @@ -287,6 +288,11 @@ static void do_gpu_stuff(GrContext* context, DDLTileHelper::TileData* tile) { tile->precompile(context); tile->draw(context); + + // TODO: remove this flush once DDLs are reffed by the drawing manager + context->flushAndSubmit(); + + tile->dropDDL(); } // We expect to have more than one recording thread but just one gpu thread @@ -315,6 +321,7 @@ void DDLTileHelper::kickOffThreadedWork(SkTaskGroup* recordingTaskGroup, recordingTaskGroup->add([this] { this->createComposeDDL(); }); } +// Only called from ViaDDL void DDLTileHelper::precompileAndDrawAllTiles(GrContext* context) { for (int i = 0; i < this->numTiles(); ++i) { fTiles[i].precompile(context); @@ -322,6 +329,7 @@ void DDLTileHelper::precompileAndDrawAllTiles(GrContext* context) { } } +// Only called from skpbench void DDLTileHelper::interleaveDDLCreationAndDraw(GrContext* context) { for (int i = 0; i < this->numTiles(); ++i) { fTiles[i].createDDL(); @@ -329,6 +337,7 @@ void DDLTileHelper::interleaveDDLCreationAndDraw(GrContext* context) { } } +// Only called from skpbench void DDLTileHelper::drawAllTilesDirectly(GrContext* context) { for (int i = 0; i < this->numTiles(); ++i) { fTiles[i].drawSKPDirectly(context); diff --git a/chromium/third_party/skia/tools/DDLTileHelper.h b/chromium/third_party/skia/tools/DDLTileHelper.h index 4430b52ee6f..bd9112acef3 100644 --- a/chromium/third_party/skia/tools/DDLTileHelper.h +++ b/chromium/third_party/skia/tools/DDLTileHelper.h @@ -44,6 +44,8 @@ public: // Create the DDL for this tile (i.e., fill in 'fDisplayList'). void createDDL(); + void dropDDL() { fDisplayList.reset(); } + // Precompile all the programs required to draw this tile's DDL void precompile(GrContext*); @@ -98,11 +100,11 @@ public: const SkIRect& viewport, int numDivisions); - void createSKPPerTile(SkData* compressedPictureData, const DDLPromiseImageHelper& helper); + void createSKPPerTile(SkData* compressedPictureData, const DDLPromiseImageHelper&); void kickOffThreadedWork(SkTaskGroup* recordingTaskGroup, SkTaskGroup* gpuTaskGroup, - GrContext* gpuThreadContext); + GrContext*); void createDDLsInParallel(); diff --git a/chromium/third_party/skia/tools/convert-to-nia.cpp b/chromium/third_party/skia/tools/convert-to-nia.cpp new file mode 100644 index 00000000000..58f9a67360f --- /dev/null +++ b/chromium/third_party/skia/tools/convert-to-nia.cpp @@ -0,0 +1,227 @@ +/* + * Copyright 2020 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +// This program converts an image from stdin (e.g. a JPEG, PNG, etc.) to stdout +// (in the NIA/NIE format, a trivial image file format). +// +// The NIA/NIE file format specification is at: +// https://github.com/google/wuffs/blob/master/doc/spec/nie-spec.md +// +// Pass "-1" or "-first-frame-only" as a command line flag to output NIE (a +// still image) instead of NIA (an animated image). The output format (NIA or +// NIE) depends only on this flag's absence or presence, not on the stdin +// image's format. +// +// There are multiple codec implementations of any given image format. For +// example, as of May 2020, Chromium, Skia and Wuffs each have their own BMP +// decoder implementation. There is no standard "libbmp" that they all share. +// Comparing this program's output (or hashed output) to similar programs in +// other repositories can identify image inputs for which these decoders (or +// different versions of the same decoder) produce different output (pixels). +// +// An equivalent program (using the Chromium image codecs) is at: +// https://crrev.com/c/2210331 +// +// An equivalent program (using the Wuffs image codecs) is at: +// https://github.com/google/wuffs/blob/master/example/convert-to-nia/convert-to-nia.c + +#include <stdio.h> +#include <string.h> + +#include "include/codec/SkCodec.h" +#include "include/core/SkBitmap.h" +#include "include/core/SkData.h" +#include "src/core/SkAutoMalloc.h" + +static inline void set_u32le(uint8_t* ptr, uint32_t val) { + ptr[0] = val >> 0; + ptr[1] = val >> 8; + ptr[2] = val >> 16; + ptr[3] = val >> 24; +} + +static inline void set_u64le(uint8_t* ptr, uint64_t val) { + ptr[0] = val >> 0; + ptr[1] = val >> 8; + ptr[2] = val >> 16; + ptr[3] = val >> 24; + ptr[4] = val >> 32; + ptr[5] = val >> 40; + ptr[6] = val >> 48; + ptr[7] = val >> 56; +} + +static void write_nix_header(uint32_t magicU32le, uint32_t width, uint32_t height) { + uint8_t data[16]; + set_u32le(data + 0, magicU32le); + set_u32le(data + 4, 0x346E62FF); // 4 bytes per pixel non-premul BGRA. + set_u32le(data + 8, width); + set_u32le(data + 12, height); + fwrite(data, 1, 16, stdout); +} + +static bool write_nia_duration(uint64_t totalDurationMillis) { + // Flicks are NIA's unit of time. One flick (frame-tick) is 1 / 705_600_000 + // of a second. See https://github.com/OculusVR/Flicks + static constexpr uint64_t flicksPerMilli = 705600; + if (totalDurationMillis > (INT64_MAX / flicksPerMilli)) { + // Converting from millis to flicks would overflow. + return false; + } + + uint8_t data[8]; + set_u64le(data + 0, totalDurationMillis * flicksPerMilli); + fwrite(data, 1, 8, stdout); + return true; +} + +static void write_nie_pixels(uint32_t width, uint32_t height, const SkBitmap& bm) { + static constexpr size_t kBufferSize = 4096; + uint8_t buf[kBufferSize]; + size_t n = 0; + for (uint32_t y = 0; y < height; y++) { + for (uint32_t x = 0; x < width; x++) { + SkColor c = bm.getColor(x, y); + buf[n++] = SkColorGetB(c); + buf[n++] = SkColorGetG(c); + buf[n++] = SkColorGetR(c); + buf[n++] = SkColorGetA(c); + if (n == kBufferSize) { + fwrite(buf, 1, n, stdout); + n = 0; + } + } + } + if (n > 0) { + fwrite(buf, 1, n, stdout); + } +} + +static void write_nia_padding(uint32_t width, uint32_t height) { + // 4 bytes of padding when the width and height are both odd. + if (width & height & 1) { + uint8_t data[4]; + set_u32le(data + 0, 0); + fwrite(data, 1, 4, stdout); + } +} + +static void write_nia_footer(int repetitionCount, bool stillImage) { + uint8_t data[8]; + if (stillImage || (repetitionCount == SkCodec::kRepetitionCountInfinite)) { + set_u32le(data + 0, 0); + } else { + // NIA's loop count and Skia's repetition count differ by one. See + // https://github.com/google/wuffs/blob/master/doc/spec/nie-spec.md#nii-footer + set_u32le(data + 0, 1 + repetitionCount); + } + set_u32le(data + 4, 0x80000000); + fwrite(data, 1, 8, stdout); +} + +int main(int argc, char** argv) { + bool firstFrameOnly = false; + for (int a = 1; a < argc; a++) { + if ((strcmp(argv[a], "-1") == 0) || (strcmp(argv[a], "-first-frame-only") == 0)) { + firstFrameOnly = true; + break; + } + } + + std::unique_ptr<SkCodec> codec(SkCodec::MakeFromData(SkData::MakeFromFILE(stdin))); + if (!codec) { + SkDebugf("Decode failed.\n"); + return 1; + } + codec->getInfo().makeColorSpace(nullptr); + SkBitmap bm; + bm.allocPixels(codec->getInfo()); + size_t bmByteSize = bm.computeByteSize(); + + // Cache a frame that future frames may depend on. + int cachedFrame = SkCodec::kNoFrame; + SkAutoMalloc cachedFramePixels; + + uint64_t totalDurationMillis = 0; + const int frameCount = codec->getFrameCount(); + if (frameCount == 0) { + SkDebugf("No frames.\n"); + return 1; + } + // The SkCodec::getFrameInfo comment says that this vector will be empty + // for still (not animated) images, even though frameCount should be 1. + std::vector<SkCodec::FrameInfo> frameInfos = codec->getFrameInfo(); + bool stillImage = frameInfos.empty(); + + for (int i = 0; i < frameCount; i++) { + SkCodec::Options opts; + opts.fFrameIndex = i; + + if (!stillImage) { + int durationMillis = frameInfos[i].fDuration; + if (durationMillis < 0) { + SkDebugf("Negative animation duration.\n"); + return 1; + } + totalDurationMillis += static_cast<uint64_t>(durationMillis); + if (totalDurationMillis > INT64_MAX) { + SkDebugf("Unsupported animation duration.\n"); + return 1; + } + + if ((cachedFrame != SkCodec::kNoFrame) && + (cachedFrame == frameInfos[i].fRequiredFrame) && cachedFramePixels.get()) { + opts.fPriorFrame = cachedFrame; + memcpy(bm.getPixels(), cachedFramePixels.get(), bmByteSize); + } + } + + if (!firstFrameOnly) { + if (i == 0) { + write_nix_header(0x41AFC36E, // "nïA" magic string as a u32le. + bm.width(), bm.height()); + } + + if (!write_nia_duration(totalDurationMillis)) { + SkDebugf("Unsupported animation duration.\n"); + return 1; + } + } + + const SkCodec::Result result = + codec->getPixels(codec->getInfo(), bm.getPixels(), bm.rowBytes(), &opts); + if ((result != SkCodec::kSuccess) && (result != SkCodec::kIncompleteInput)) { + SkDebugf("Decode frame pixels #%d failed.\n", i); + return 1; + } + + // If the next frame depends on this one, store it in cachedFrame. It + // is possible that we may discard a frame that future frames depend + // on, but the codec will simply redecode the discarded frame. + if ((static_cast<size_t>(i + 1) < frameInfos.size()) && + (frameInfos[i + 1].fRequiredFrame == i)) { + cachedFrame = i; + memcpy(cachedFramePixels.reset(bmByteSize), bm.getPixels(), bmByteSize); + } + + int width = bm.width(); + int height = bm.height(); + write_nix_header(0x45AFC36E, // "nïE" magic string as a u32le. + width, height); + write_nie_pixels(width, height, bm); + if (result == SkCodec::kIncompleteInput) { + SkDebugf("Incomplete input.\n"); + return 1; + } + if (firstFrameOnly) { + return 0; + } + write_nia_padding(width, height); + } + write_nia_footer(codec->getRepetitionCount(), stillImage); + return 0; +} diff --git a/chromium/third_party/skia/tools/debugger/DebugCanvas.cpp b/chromium/third_party/skia/tools/debugger/DebugCanvas.cpp index 11b76085241..95d2e06e0cf 100644 --- a/chromium/third_party/skia/tools/debugger/DebugCanvas.cpp +++ b/chromium/third_party/skia/tools/debugger/DebugCanvas.cpp @@ -328,11 +328,11 @@ void DebugCanvas::didConcat44(const SkM44& m) { } void DebugCanvas::didScale(SkScalar x, SkScalar y) { - this->didConcat(SkMatrix::MakeScale(x, y)); + this->didConcat(SkMatrix::Scale(x, y)); } void DebugCanvas::didTranslate(SkScalar x, SkScalar y) { - this->didConcat(SkMatrix::MakeTrans(x, y)); + this->didConcat(SkMatrix::Translate(x, y)); } void DebugCanvas::didConcat(const SkMatrix& matrix) { diff --git a/chromium/third_party/skia/tools/fiddle/all_examples.cpp b/chromium/third_party/skia/tools/fiddle/all_examples.cpp index 9046fee7f6c..3850ee0a22c 100644 --- a/chromium/third_party/skia/tools/fiddle/all_examples.cpp +++ b/chromium/third_party/skia/tools/fiddle/all_examples.cpp @@ -261,7 +261,6 @@ #include "../../docs/examples/Difference.cpp" #include "../../docs/examples/Dither_a.cpp" #include "../../docs/examples/Dither_b.cpp" -#include "../../docs/examples/Draw_Looper_Methods.cpp" #include "../../docs/examples/Dst.cpp" #include "../../docs/examples/Dst_Atop.cpp" #include "../../docs/examples/Dst_In.cpp" @@ -538,7 +537,6 @@ #include "../../docs/examples/Paint_getColor.cpp" #include "../../docs/examples/Paint_getColor4f.cpp" #include "../../docs/examples/Paint_getColorFilter.cpp" -#include "../../docs/examples/Paint_getDrawLooper.cpp" #include "../../docs/examples/Paint_getFillPath.cpp" #include "../../docs/examples/Paint_getFillPath_2.cpp" #include "../../docs/examples/Paint_getFilterQuality.cpp" @@ -579,7 +577,6 @@ #include "../../docs/examples/Paint_notequal_operator.cpp" #include "../../docs/examples/Paint_nothingToDraw.cpp" #include "../../docs/examples/Paint_refColorFilter.cpp" -#include "../../docs/examples/Paint_refDrawLooper.cpp" #include "../../docs/examples/Paint_refImageFilter.cpp" #include "../../docs/examples/Paint_refMaskFilter.cpp" #include "../../docs/examples/Paint_refPathEffect.cpp" @@ -595,7 +592,6 @@ #include "../../docs/examples/Paint_setColor4f.cpp" #include "../../docs/examples/Paint_setColorFilter.cpp" #include "../../docs/examples/Paint_setDither.cpp" -#include "../../docs/examples/Paint_setDrawLooper.cpp" #include "../../docs/examples/Paint_setEmbeddedBitmapText.cpp" #include "../../docs/examples/Paint_setFakeBoldText.cpp" #include "../../docs/examples/Paint_setFilterQuality.cpp" @@ -1043,7 +1039,6 @@ #include "../../docs/examples/State_Stack_b.cpp" #include "../../docs/examples/Stroke_Width.cpp" #include "../../docs/examples/Surface_MakeFromBackendTexture.cpp" -#include "../../docs/examples/Surface_MakeFromBackendTextureAsRenderTarget.cpp" #include "../../docs/examples/Surface_MakeNull.cpp" #include "../../docs/examples/Surface_MakeRaster.cpp" #include "../../docs/examples/Surface_MakeRasterDirect.cpp" diff --git a/chromium/third_party/skia/tools/fiddle/disabled_examples.txt b/chromium/third_party/skia/tools/fiddle/disabled_examples.txt index 3970425b03e..1c568526b76 100644 --- a/chromium/third_party/skia/tools/fiddle/disabled_examples.txt +++ b/chromium/third_party/skia/tools/fiddle/disabled_examples.txt @@ -174,7 +174,6 @@ docs/examples/Region_op_6.cpp docs/examples/Region_setPath.cpp docs/examples/Region_writeToMemory.cpp docs/examples/Surface_MakeFromBackendTexture.cpp -docs/examples/Surface_MakeFromBackendTextureAsRenderTarget.cpp docs/examples/Surface_MakeRenderTarget.cpp docs/examples/Surface_MakeRenderTarget_2.cpp docs/examples/Surface_MakeRenderTarget_3.cpp diff --git a/chromium/third_party/skia/tools/fiddle/documumentation_examples_map.txt b/chromium/third_party/skia/tools/fiddle/documumentation_examples_map.txt index 2a98cc07111..46ef1c5b400 100644 --- a/chromium/third_party/skia/tools/fiddle/documumentation_examples_map.txt +++ b/chromium/third_party/skia/tools/fiddle/documumentation_examples_map.txt @@ -2022,10 +2022,6 @@ SkColor4f getColor4f() const; SkPaint SkColorFilter* getColorFilter() const; -[Paint_getDrawLooper] -SkPaint -SkDrawLooper* getDrawLooper() const; - [Paint_getFillPath_2] [Shader_Methods_a] [Shader_Methods_b] @@ -2196,10 +2192,6 @@ bool operator==(const SkPaint& a, const SkPaint& b); SkPaint sk_sp<SkColorFilter> refColorFilter() const; -[Paint_refDrawLooper] -SkPaint -sk_sp<SkDrawLooper> refDrawLooper() const; - [Paint_refImageFilter] SkPaint sk_sp<SkImageFilter> refImageFilter() const; @@ -2266,11 +2258,6 @@ void setColorFilter(sk_sp<SkColorFilter> colorFilter); SkPaint void setDither(bool dither); -[Paint_setDrawLooper] -[Text_Size] -SkPaint -void setDrawLooper(sk_sp<SkDrawLooper> drawLooper); - [Paint_setEmbeddedBitmapText] SkPaint void setEmbeddedBitmapText(bool useEmbeddedBitmapText); @@ -2294,11 +2281,6 @@ void setFlags(uint32_t flags); SkPaint void setHinting(SkFontHinting hintingLevel); -[Draw_Looper_Methods] -[Paint_setImageFilter] -SkPaint -void setImageFilter(sk_sp<SkImageFilter> imageFilter); - [Paint_setLCDRenderText] SkPaint void setLCDRenderText(bool lcdText); @@ -3924,10 +3906,6 @@ SkRegion SkSurface static sk_sp<SkSurface> MakeFromBackendTexture(GrContext* context, const GrBackendTexture& backendTexture, GrSurfaceOrigin origin, int sampleCnt, SkColorType colorType, sk_sp<SkColorSpace> colorSpace, const SkSurfaceProps* surfaceProps); -[Surface_MakeFromBackendTextureAsRenderTarget] -SkSurface -static sk_sp<SkSurface> MakeFromBackendTextureAsRenderTarget(GrContext* context, const GrBackendTexture& backendTexture, GrSurfaceOrigin origin, int sampleCnt, SkColorType colorType, sk_sp<SkColorSpace> colorSpace, const SkSurfaceProps* surfaceProps); - [Surface_MakeNull] SkSurface static sk_sp<SkSurface> MakeNull(int width, int height); diff --git a/chromium/third_party/skia/tools/flags/CommonFlagsConfig.cpp b/chromium/third_party/skia/tools/flags/CommonFlagsConfig.cpp index fa0c414363e..0dc0a52d470 100644 --- a/chromium/third_party/skia/tools/flags/CommonFlagsConfig.cpp +++ b/chromium/third_party/skia/tools/flags/CommonFlagsConfig.cpp @@ -72,6 +72,7 @@ static const struct { { "gltestprecompile", "gpu", "api=gl,testPrecompile=true" }, { "glestestprecompile", "gpu", "api=gles,testPrecompile=true" }, { "glddl", "gpu", "api=gl,useDDLSink=true" }, + { "glooprddl", "gpu", "api=gl,OOPRish=true" }, { "angle_d3d11_es2", "gpu", "api=angle_d3d11_es2" }, { "angle_d3d11_es3", "gpu", "api=angle_d3d11_es3" }, { "angle_d3d9_es2", "gpu", "api=angle_d3d9_es2" }, @@ -103,6 +104,7 @@ static const struct { { "vkbert", "gpu", "api=vulkan,surf=bert" }, { "vktestpersistentcache", "gpu", "api=vulkan,testPersistentCache=1" }, { "vkddl", "gpu", "api=vulkan,useDDLSink=true" }, + { "vkooprddl", "gpu", "api=vulkan,OOPRish=true" }, #endif #ifdef SK_METAL { "mtl", "gpu", "api=metal" }, @@ -110,6 +112,7 @@ static const struct { { "mtlmsaa4", "gpu", "api=metal,samples=4" }, { "mtlmsaa8", "gpu", "api=metal,samples=8" }, { "mtlddl", "gpu", "api=metal,useDDLSink=true" }, + { "mtlooprddl", "gpu", "api=metal,OOPRish=true" }, #endif #ifdef SK_DIRECT3D { "d3d", "gpu", "api=direct3d" }, @@ -459,6 +462,7 @@ SkCommandLineConfigGpu::SkCommandLineConfigGpu(const SkString& tag, int testPersistentCache, bool testPrecompile, bool useDDLSink, + bool OOPRish, SurfType surfType) : SkCommandLineConfig(tag, SkString("gpu"), viaParts) , fContextType(contextType) @@ -472,6 +476,7 @@ SkCommandLineConfigGpu::SkCommandLineConfigGpu(const SkString& tag, , fTestPersistentCache(testPersistentCache) , fTestPrecompile(testPrecompile) , fUseDDLSink(useDDLSink) + , fOOPRish(OOPRish) , fSurfType(surfType) { if (!useStencilBuffers) { fContextOverrides |= ContextOverrides::kAvoidStencilBuffers; @@ -493,6 +498,7 @@ SkCommandLineConfigGpu* parse_command_line_config_gpu(const SkString& int testPersistentCache = 0; bool testPrecompile = false; bool useDDLs = false; + bool ooprish = false; SkCommandLineConfigGpu::SurfType surfType = SkCommandLineConfigGpu::SurfType::kDefault; bool parseSucceeded = false; @@ -511,6 +517,7 @@ SkCommandLineConfigGpu* parse_command_line_config_gpu(const SkString& extendedOptions.get_option_int("testPersistentCache", &testPersistentCache) && extendedOptions.get_option_bool("testPrecompile", &testPrecompile) && extendedOptions.get_option_bool("useDDLSink", &useDDLs) && + extendedOptions.get_option_bool("OOPRish", &ooprish) && extendedOptions.get_option_gpu_surf_type("surf", &surfType); // testing threading and the persistent cache are mutually exclusive. @@ -531,6 +538,7 @@ SkCommandLineConfigGpu* parse_command_line_config_gpu(const SkString& testPersistentCache, testPrecompile, useDDLs, + ooprish, surfType); } diff --git a/chromium/third_party/skia/tools/flags/CommonFlagsConfig.h b/chromium/third_party/skia/tools/flags/CommonFlagsConfig.h index f4ae2949ea1..02bd8569a41 100644 --- a/chromium/third_party/skia/tools/flags/CommonFlagsConfig.h +++ b/chromium/third_party/skia/tools/flags/CommonFlagsConfig.h @@ -64,6 +64,7 @@ public: int testPersistentCache, bool testPrecompile, bool useDDLSink, + bool OOPRish, SurfType); const SkCommandLineConfigGpu* asConfigGpu() const override { return this; } @@ -78,6 +79,7 @@ public: int getTestPersistentCache() const { return fTestPersistentCache; } bool getTestPrecompile() const { return fTestPrecompile; } bool getUseDDLSink() const { return fUseDDLSink; } + bool getOOPRish() const { return fOOPRish; } SurfType getSurfType() const { return fSurfType; } private: @@ -92,6 +94,7 @@ private: int fTestPersistentCache; bool fTestPrecompile; bool fUseDDLSink; + bool fOOPRish; SurfType fSurfType; }; diff --git a/chromium/third_party/skia/tools/flags/CommonFlagsGpu.cpp b/chromium/third_party/skia/tools/flags/CommonFlagsGpu.cpp index b00bf8892d8..4f15944e750 100644 --- a/chromium/third_party/skia/tools/flags/CommonFlagsGpu.cpp +++ b/chromium/third_party/skia/tools/flags/CommonFlagsGpu.cpp @@ -60,7 +60,7 @@ static GpuPathRenderers get_named_pathrenderers_flags(const char* name) { } else if (!strcmp(name, "default")) { return GpuPathRenderers::kDefault; } - SK_ABORT(SkStringPrintf("error: unknown named path renderer \"%s\"\n", name).c_str()); + SK_ABORT("error: unknown named path renderer \"%s\"\n", name); } static GpuPathRenderers collect_gpu_path_renderers_from_flags() { diff --git a/chromium/third_party/skia/tools/fm/fm.cpp b/chromium/third_party/skia/tools/fm/fm.cpp index 75f1389eaa8..b9909133140 100644 --- a/chromium/third_party/skia/tools/fm/fm.cpp +++ b/chromium/third_party/skia/tools/fm/fm.cpp @@ -132,6 +132,12 @@ static void init(Source* source, std::shared_ptr<skiagm::GM> gm) { source->tweak = [gm](GrContextOptions* options) { gm->modifyGrContextOptions(options); }; source->draw = [gm](SkCanvas* canvas) { SkString err; + switch (gm->gpuSetup(canvas->getGrContext(), &err)) { + case skiagm::DrawResult::kOk : break; + case skiagm::DrawResult::kSkip: return skip; + case skiagm::DrawResult::kFail: return fail(err.c_str()); + } + switch (gm->draw(canvas, &err)) { case skiagm::DrawResult::kOk: break; case skiagm::DrawResult::kSkip: return skip; @@ -573,7 +579,7 @@ int main(int argc, char** argv) { case Result::Ok: break; case Result::Skip: return false; case Result::Fail: - SK_ABORT(result.failure.c_str()); + SK_ABORT("%s", result.failure.c_str()); } return true; }; diff --git a/chromium/third_party/skia/tools/fonts/TestSVGTypeface.cpp b/chromium/third_party/skia/tools/fonts/TestSVGTypeface.cpp index 1bba3a608e0..c10bb2185d7 100644 --- a/chromium/third_party/skia/tools/fonts/TestSVGTypeface.cpp +++ b/chromium/third_party/skia/tools/fonts/TestSVGTypeface.cpp @@ -772,7 +772,7 @@ void TestSVGTypeface::exportTtxCbdt(SkWStream* out, SkSpan<unsigned> strikeSizes -bounds.fTop, font, paint); - surface->flush(); + surface->flushAndSubmit(); sk_sp<SkImage> image = surface->makeImageSnapshot(); sk_sp<SkData> data = image->encodeToData(SkEncodedImageFormat::kPNG, 100); @@ -994,7 +994,7 @@ void TestSVGTypeface::exportTtxSbix(SkWStream* out, SkSpan<unsigned> strikeSizes -bounds.fTop, font, paint); - surface->flush(); + surface->flushAndSubmit(); sk_sp<SkImage> image = surface->makeImageSnapshot(); sk_sp<SkData> data = image->encodeToData(SkEncodedImageFormat::kPNG, 100); diff --git a/chromium/third_party/skia/tools/fonts/TestTypeface.cpp b/chromium/third_party/skia/tools/fonts/TestTypeface.cpp index 7f30f01c1d2..f32f77aa03f 100644 --- a/chromium/third_party/skia/tools/fonts/TestTypeface.cpp +++ b/chromium/third_party/skia/tools/fonts/TestTypeface.cpp @@ -132,7 +132,7 @@ void TestTypeface::onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) co *isLocal = false; } -void TestTypeface::onCharsToGlyphs(const SkUnichar uni[], int count, SkGlyphID glyphs[]) const { +void TestTypeface::onCharsToGlyphs(const SkUnichar* uni, int count, SkGlyphID glyphs[]) const { for (int i = 0; i < count; ++i) { glyphs[i] = fTestFont->glyphForUnichar(uni[i]); } diff --git a/chromium/third_party/skia/tools/gpu/GrContextFactory.cpp b/chromium/third_party/skia/tools/gpu/GrContextFactory.cpp index 13cc9792050..f7356f57fb8 100644 --- a/chromium/third_party/skia/tools/gpu/GrContextFactory.cpp +++ b/chromium/third_party/skia/tools/gpu/GrContextFactory.cpp @@ -90,7 +90,8 @@ void GrContextFactory::abandonContexts() { auto restore = context.fTestContext->makeCurrentAndAutoRestore(); context.fTestContext->testAbandon(); } - bool requiresEarlyAbandon = (context.fGrContext->backend() == GrBackendApi::kVulkan); + GrBackendApi api = context.fGrContext->backend(); + bool requiresEarlyAbandon = api == GrBackendApi::kVulkan || api == GrBackendApi::kDawn; if (requiresEarlyAbandon) { context.fGrContext->abandonContext(); } diff --git a/chromium/third_party/skia/tools/gpu/GrTest.cpp b/chromium/third_party/skia/tools/gpu/GrTest.cpp index 2a030d43eb0..d6286674e72 100644 --- a/chromium/third_party/skia/tools/gpu/GrTest.cpp +++ b/chromium/third_party/skia/tools/gpu/GrTest.cpp @@ -54,20 +54,18 @@ int GrResourceCache::countUniqueKeysWithTag(const char* tag) const { /////////////////////////////////////////////////////////////////////////////// -#define ASSERT_SINGLE_OWNER \ - SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fRenderTargetContext->singleOwner());) - +#define ASSERT_SINGLE_OWNER GR_ASSERT_SINGLE_OWNER(fRenderTargetContext->singleOwner()) uint32_t GrRenderTargetContextPriv::testingOnly_getOpsTaskID() { return fRenderTargetContext->getOpsTask()->uniqueID(); } void GrRenderTargetContextPriv::testingOnly_addDrawOp(std::unique_ptr<GrDrawOp> op) { - this->testingOnly_addDrawOp(GrNoClip(), std::move(op)); + this->testingOnly_addDrawOp(nullptr, std::move(op), {}); } void GrRenderTargetContextPriv::testingOnly_addDrawOp( - const GrClip& clip, + const GrClip* clip, std::unique_ptr<GrDrawOp> op, const std::function<GrRenderTargetContext::WillAddOpFn>& willAddFn) { ASSERT_SINGLE_OWNER diff --git a/chromium/third_party/skia/tools/gpu/MemoryCache.cpp b/chromium/third_party/skia/tools/gpu/MemoryCache.cpp index d8fdaf71578..93ef2b14a47 100644 --- a/chromium/third_party/skia/tools/gpu/MemoryCache.cpp +++ b/chromium/third_party/skia/tools/gpu/MemoryCache.cpp @@ -57,6 +57,7 @@ void MemoryCache::store(const SkData& key, const SkData& data) { SkDebugf("Store Key: %s\n\tData: %s\n\n", data_to_str(key).c_str(), data_to_str(data).c_str()); } + ++fCacheStoreCnt; fMap[Key(key)] = Value(data); } @@ -96,7 +97,7 @@ void MemoryCache::writeShadersToDisk(const char* path, GrBackendApi api) { // Even with the SPIR-V switches, it seems like we must use .spv, or malisc tries to // run glslang on the input. const char* ext = GrBackendApi::kOpenGL == api ? "frag" : "spv"; - SkReader32 reader(data->data(), data->size()); + SkReadBuffer reader(data->data(), data->size()); GrPersistentCacheUtils::GetType(&reader); // Shader type tag GrPersistentCacheUtils::UnpackCachedShaders(&reader, shaders, inputsIgnored, kGrShaderTypeCount); diff --git a/chromium/third_party/skia/tools/gpu/MemoryCache.h b/chromium/third_party/skia/tools/gpu/MemoryCache.h index 22911a5413b..f70cf1388e8 100644 --- a/chromium/third_party/skia/tools/gpu/MemoryCache.h +++ b/chromium/third_party/skia/tools/gpu/MemoryCache.h @@ -28,14 +28,18 @@ public: MemoryCache(const MemoryCache&) = delete; MemoryCache& operator=(const MemoryCache&) = delete; void reset() { - fCacheMissCnt = 0; + this->resetCacheStats(); fMap.clear(); } sk_sp<SkData> load(const SkData& key) override; void store(const SkData& key, const SkData& data) override; int numCacheMisses() const { return fCacheMissCnt; } - void resetNumCacheMisses() { fCacheMissCnt = 0; } + int numCacheStores() const { return fCacheStoreCnt; } + void resetCacheStats() { + fCacheMissCnt = 0; + fCacheStoreCnt = 0; + } void writeShadersToDisk(const char* path, GrBackendApi backend); @@ -80,6 +84,7 @@ private: }; int fCacheMissCnt = 0; + int fCacheStoreCnt = 0; std::unordered_map<Key, Value, Hash> fMap; }; diff --git a/chromium/third_party/skia/tools/gpu/TestContext.cpp b/chromium/third_party/skia/tools/gpu/TestContext.cpp index cdd86c4fc4b..9b9e5dcbb9d 100644 --- a/chromium/third_party/skia/tools/gpu/TestContext.cpp +++ b/chromium/third_party/skia/tools/gpu/TestContext.cpp @@ -54,6 +54,7 @@ void TestContext::flushAndWaitOnSync(GrContext* context) { flushInfo.fFinishedContext = fFinishTrackers[fCurrentFlushIdx].get(); context->flush(flushInfo); + context->submit(); fCurrentFlushIdx = (fCurrentFlushIdx + 1) % SK_ARRAY_COUNT(fFinishTrackers); } diff --git a/chromium/third_party/skia/tools/gpu/TestOps.cpp b/chromium/third_party/skia/tools/gpu/TestOps.cpp index ff5201a2c98..1ef7420d74c 100644 --- a/chromium/third_party/skia/tools/gpu/TestOps.cpp +++ b/chromium/third_party/skia/tools/gpu/TestOps.cpp @@ -32,26 +32,29 @@ public: const char* name() const override { return "TestRectOp::GP"; } - GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps& caps) const override; + GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps& caps) const override { + return new GLSLGP(); + } - void getGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {} + void getGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder* b) const override { + GLSLGP::GenKey(*this, b); + } bool wideColor() const { return fInColor.cpuType() != kUByte4_norm_GrVertexAttribType; } private: - Attribute fInPosition = {"inPosition", kFloat2_GrVertexAttribType, kFloat2_GrSLType}; - Attribute fInLocalCoords = {"inLocalCoords", kFloat2_GrVertexAttribType, kFloat2_GrSLType}; - Attribute fInColor; - SkMatrix fLocalMatrix; -}; - -GrGLSLPrimitiveProcessor* GP::createGLSLInstance(const GrShaderCaps& caps) const { class GLSLGP : public GrGLSLGeometryProcessor { + public: void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& pp, const CoordTransformRange& transformRange) override { const auto& gp = pp.cast<GP>(); - this->setTransformDataHelper(gp.fLocalMatrix, pdman, transformRange); + this->setTransformDataHelper(pdman, transformRange); + this->setTransform(pdman, fLocalMatrixUni, gp.fLocalMatrix); + } + + static void GenKey(const GP& gp, GrProcessorKeyBuilder* b) { + b->add32(ComputeMatrixKey(gp.fLocalMatrix)); } private: @@ -65,13 +68,19 @@ GrGLSLPrimitiveProcessor* GP::createGLSLInstance(const GrShaderCaps& caps) const args.fFragBuilder->codeAppendf("%s = %s;", args.fOutputColor, colorVarying.fsIn()); args.fFragBuilder->codeAppendf("%s = half4(1);", args.fOutputCoverage); this->writeOutputPosition(args.fVertBuilder, gpArgs, gp.fInPosition.name()); - this->emitTransforms(args.fVertBuilder, args.fVaryingHandler, args.fUniformHandler, - gp.fInLocalCoords.asShaderVar(), gp.fLocalMatrix, - args.fFPCoordTransformHandler); + this->writeLocalCoord(args.fVertBuilder, args.fUniformHandler, gpArgs, + gp.fInLocalCoords.asShaderVar(), gp.fLocalMatrix, + &fLocalMatrixUni); } + + UniformHandle fLocalMatrixUni; }; - return new GLSLGP(); -} + + Attribute fInPosition = {"inPosition", kFloat2_GrVertexAttribType, kFloat2_GrSLType}; + Attribute fInLocalCoords = {"inLocalCoords", kFloat2_GrVertexAttribType, kFloat2_GrSLType}; + Attribute fInColor; + SkMatrix fLocalMatrix; +}; class TestRectOp final : public GrMeshDrawOp { public: diff --git a/chromium/third_party/skia/tools/gpu/YUVUtils.cpp b/chromium/third_party/skia/tools/gpu/YUVUtils.cpp index eb4ca2c3d12..5b941358e3f 100644 --- a/chromium/third_party/skia/tools/gpu/YUVUtils.cpp +++ b/chromium/third_party/skia/tools/gpu/YUVUtils.cpp @@ -85,4 +85,29 @@ bool LazyYUVImage::ensureYUVImage(GrContext* context) { return fYUVImage != nullptr; } +/////////////////////////////////////////////////////////////////////////////////////////////////// +void YUVABackendReleaseContext::Unwind(GrContext* context, YUVABackendReleaseContext* beContext) { + // Some backends (e.g., Vulkan) require that all work associated w/ texture + // creation be completed before deleting the textures. + GrFlushInfo flushInfoSyncCpu; + flushInfoSyncCpu.fFlags = kSyncCpu_GrFlushFlag; + context->flush(flushInfoSyncCpu); + context->submit(true); + + delete beContext; +} + +YUVABackendReleaseContext::YUVABackendReleaseContext(GrContext* context) : fContext(context) { + SkASSERT(context->priv().getGpu()); + SkASSERT(context->priv().asDirectContext()); +} + +YUVABackendReleaseContext::~YUVABackendReleaseContext() { + for (int i = 0; i < 4; ++i) { + if (fBETextures[i].isValid()) { + fContext->deleteBackendTexture(fBETextures[i]); + } + } +} + } // namespace sk_gpu_test diff --git a/chromium/third_party/skia/tools/gpu/YUVUtils.h b/chromium/third_party/skia/tools/gpu/YUVUtils.h index f6097b9476d..bfca6f41fe3 100644 --- a/chromium/third_party/skia/tools/gpu/YUVUtils.h +++ b/chromium/third_party/skia/tools/gpu/YUVUtils.h @@ -11,6 +11,7 @@ #include "include/core/SkImage.h" #include "include/core/SkYUVAIndex.h" #include "include/core/SkYUVASizeInfo.h" +#include "include/gpu/GrBackendSurface.h" #include "src/core/SkAutoMalloc.h" class SkData; @@ -49,6 +50,45 @@ private: bool ensureYUVImage(GrContext* context); }; +// A helper for managing the lifetime of backend textures for YUVA images. +class YUVABackendReleaseContext { +public: + // A stock 'TextureReleaseProc' to use with this class + static void Release(void* releaseContext) { + auto beContext = reinterpret_cast<YUVABackendReleaseContext*>(releaseContext); + + delete beContext; + } + + // Given how and when backend textures are created, just deleting this object often + // isn't enough. This helper encapsulates the extra work needed. + static void Unwind(GrContext* context, YUVABackendReleaseContext* beContext); + + YUVABackendReleaseContext(GrContext* context); + ~YUVABackendReleaseContext(); + + void set(int index, const GrBackendTexture& beTex) { + SkASSERT(index >= 0 && index < 4); + SkASSERT(!fBETextures[index].isValid()); + SkASSERT(beTex.isValid()); + + fBETextures[index] = beTex; + } + + const GrBackendTexture* beTextures() const { return fBETextures; } + + const GrBackendTexture& beTexture(int index) { + SkASSERT(index >= 0 && index < 4); + SkASSERT(fBETextures[index].isValid()); + return fBETextures[index]; + } + +private: + GrContext* fContext; + GrBackendTexture fBETextures[4]; +}; + + } // namespace sk_gpu_test #endif // YUVUtils_DEFINED diff --git a/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.cpp b/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.cpp deleted file mode 100644 index c8dc0540fce..00000000000 --- a/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.cpp +++ /dev/null @@ -1,483 +0,0 @@ -/* - * Copyright 2017 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "include/core/SkBitmap.h" -#include "src/gpu/gl/GrGLDefines.h" -#include "src/gpu/gl/GrGLUtil.h" -#include "tools/gpu/atlastext/GLTestAtlasTextRenderer.h" -#include "tools/gpu/atlastext/TestAtlasTextRenderer.h" -#include "tools/gpu/gl/GLTestContext.h" - -using sk_gpu_test::GLTestContext; - -namespace { - -class GLTestAtlasTextRenderer : public sk_gpu_test::TestAtlasTextRenderer { -public: - GLTestAtlasTextRenderer(std::unique_ptr<GLTestContext>); - - void* createTexture(AtlasFormat, int width, int height) override; - - void deleteTexture(void* textureHandle) override; - - void setTextureData(void* textureHandle, const void* data, int x, int y, int width, int height, - size_t rowBytes) override; - - void drawSDFGlyphs(void* targetHandle, void* textureHandle, const SDFVertex vertices[], - int quadCnt) override; - - void* makeTargetHandle(int width, int height) override; - - void targetDeleted(void* targetHandle) override; - - SkBitmap readTargetHandle(void* targetHandle) override; - - void clearTarget(void* targetHandle, uint32_t color) override; - - bool initialized() const { return 0 != fProgram; } - -private: - struct AtlasTexture { - GrGLuint fID; - AtlasFormat fFormat; - int fWidth; - int fHeight; - }; - - struct Target { - GrGLuint fFBOID; - GrGLuint fRBID; - int fWidth; - int fHeight; - }; - - std::unique_ptr<GLTestContext> fContext; - GrGLuint fProgram = 0; - GrGLint fDstScaleAndTranslateLocation = 0; - GrGLint fAtlasInvSizeLocation = 0; - GrGLint fSamplerLocation = 0; -}; - -#define callgl(NAME, ...) fContext->gl()->fFunctions.f##NAME(__VA_ARGS__) -#define checkgl() \ - do { \ - static constexpr auto line = __LINE__; \ - auto error = fContext->gl()->fFunctions.fGetError(); \ - if (error != GR_GL_NO_ERROR) { \ - SkDebugf("GL ERROR: 0x%x, line %d\n", error, line); \ - } \ - } while (false) - -GLTestAtlasTextRenderer::GLTestAtlasTextRenderer(std::unique_ptr<GLTestContext> context) - : fContext(std::move(context)) { - auto restore = fContext->makeCurrentAndAutoRestore(); - - // First check whether the GL is supported so we can avoid spammy failures on systems - // where the GL simply doesn't work with this class. - const char* versionStr = reinterpret_cast<const char*>(callgl(GetString, GR_GL_VERSION)); - auto version = GrGLGetVersionFromString(versionStr); - auto standard = GrGLGetStandardInUseFromString(versionStr); - switch (standard) { - case kWebGL_GrGLStandard: - case kNone_GrGLStandard: - return; - case kGLES_GrGLStandard: - if (version < GR_GL_VER(3, 0)) { - return; - } - break; - case kGL_GrGLStandard: { - if (version < GR_GL_VER(4, 3)) { - return; - } - GrGLint profileMask; - callgl(GetIntegerv, GR_GL_CONTEXT_PROFILE_MASK, &profileMask); - if (profileMask & GR_GL_CONTEXT_CORE_PROFILE_BIT) { - return; - } - } - } - - auto vs = callgl(CreateShader, GR_GL_VERTEX_SHADER); - static constexpr char kGLVersionString[] = "#version 430 compatibility"; - static constexpr char kGLESVersionString[] = "#version 300 es"; - GrGLint lengths[2]; - const GrGLchar* strings[2]; - switch (fContext->gl()->fStandard) { - case kGL_GrGLStandard: - strings[0] = kGLVersionString; - lengths[0] = static_cast<GrGLint>(SK_ARRAY_COUNT(kGLVersionString)) - 1; - break; - case kGLES_GrGLStandard: - strings[0] = kGLESVersionString; - lengths[0] = static_cast<GrGLint>(SK_ARRAY_COUNT(kGLESVersionString)) - 1; - break; - default: - strings[0] = nullptr; - lengths[0] = 0; - break; - } - - static constexpr const char kVS[] = R"( - uniform vec4 uDstScaleAndTranslate; - uniform vec2 uAtlasInvSize; - - layout (location = 0) in vec3 inPosition; - layout (location = 1) in vec4 inColor; - layout (location = 2) in uvec2 inTextureCoords; - - out vec2 vTexCoord; - out vec4 vColor; - out vec2 vIntTexCoord; - - void main() { - vec2 intCoords; - // floor(vec2) doesn't seem to work on some ES devices. - intCoords.x = floor(float(inTextureCoords.x)); - intCoords.y = floor(float(inTextureCoords.y)); - vTexCoord = intCoords * uAtlasInvSize; - vIntTexCoord = intCoords; - vColor = inColor; - gl_Position = vec4(inPosition.x * uDstScaleAndTranslate.x + uDstScaleAndTranslate.y, - inPosition.y * uDstScaleAndTranslate.z + uDstScaleAndTranslate.w, - 0.0, inPosition.z); - } - )"; - strings[1] = kVS; - lengths[1] = SK_ARRAY_COUNT(kVS) - 1; - callgl(ShaderSource, vs, 2, strings, lengths); - callgl(CompileShader, vs); - GrGLint compileStatus; - callgl(GetShaderiv, vs, GR_GL_COMPILE_STATUS, &compileStatus); - if (compileStatus == GR_GL_FALSE) { - GrGLint logLength; - callgl(GetShaderiv, vs, GR_GL_INFO_LOG_LENGTH, &logLength); - std::unique_ptr<GrGLchar[]> log(new GrGLchar[logLength + 1]); - log[logLength] = '\0'; - callgl(GetShaderInfoLog, vs, logLength, &logLength, log.get()); - SkDebugf("Vertex Shader failed to compile\n%s", log.get()); - callgl(DeleteShader, vs); - return; - } - - auto fs = callgl(CreateShader, GR_GL_FRAGMENT_SHADER); - static constexpr const char kFS[] = R"( - uniform sampler2D uSampler; - - in vec2 vTexCoord; - in vec4 vColor; - in vec2 vIntTexCoord; - - layout (location = 0) out vec4 outColor; - - void main() { - float sdfValue = texture(uSampler, vTexCoord).r; - float distance = 7.96875 * (sdfValue - 0.50196078431000002); - vec2 dist_grad = vec2(dFdx(distance), dFdy(distance)); - vec2 Jdx = dFdx(vIntTexCoord); - vec2 Jdy = dFdy(vIntTexCoord); - float dg_len2 = dot(dist_grad, dist_grad); - if (dg_len2 < 0.0001) { - dist_grad = vec2(0.7071, 0.7071); - } else { - dist_grad = dist_grad * inversesqrt(dg_len2); - } - vec2 grad = vec2(dist_grad.x * Jdx.x + dist_grad.y * Jdy.x, - dist_grad.x * Jdx.y + dist_grad.y * Jdy.y); - float afwidth = abs(0.65000000000000002 * length(grad)); - float value = smoothstep(-afwidth, afwidth, distance); - outColor = value * vec4(vColor.rgb * vColor.a, vColor.a); - } - )"; - strings[1] = kFS; - lengths[1] = SK_ARRAY_COUNT(kFS) - 1; - callgl(ShaderSource, fs, 2, strings, lengths); - callgl(CompileShader, fs); - callgl(GetShaderiv, fs, GR_GL_COMPILE_STATUS, &compileStatus); - if (compileStatus == GR_GL_FALSE) { - GrGLint logLength; - callgl(GetShaderiv, fs, GR_GL_INFO_LOG_LENGTH, &logLength); - std::unique_ptr<GrGLchar[]> log(new GrGLchar[logLength + 1]); - log[logLength] = '\0'; - callgl(GetShaderInfoLog, fs, logLength, &logLength, log.get()); - SkDebugf("Fragment Shader failed to compile\n%s", log.get()); - callgl(DeleteShader, vs); - callgl(DeleteShader, fs); - return; - } - - fProgram = callgl(CreateProgram); - if (!fProgram) { - callgl(DeleteShader, vs); - callgl(DeleteShader, fs); - return; - } - - callgl(AttachShader, fProgram, vs); - callgl(AttachShader, fProgram, fs); - callgl(LinkProgram, fProgram); - GrGLint linkStatus; - callgl(GetProgramiv, fProgram, GR_GL_LINK_STATUS, &linkStatus); - if (linkStatus == GR_GL_FALSE) { - GrGLint logLength = 0; - callgl(GetProgramiv, vs, GR_GL_INFO_LOG_LENGTH, &logLength); - std::unique_ptr<GrGLchar[]> log(new GrGLchar[logLength + 1]); - log[logLength] = '\0'; - callgl(GetProgramInfoLog, vs, logLength, &logLength, log.get()); - SkDebugf("Program failed to link\n%s", log.get()); - callgl(DeleteShader, vs); - callgl(DeleteShader, fs); - callgl(DeleteProgram, fProgram); - fProgram = 0; - return; - } - fDstScaleAndTranslateLocation = callgl(GetUniformLocation, fProgram, "uDstScaleAndTranslate"); - fAtlasInvSizeLocation = callgl(GetUniformLocation, fProgram, "uAtlasInvSize"); - fSamplerLocation = callgl(GetUniformLocation, fProgram, "uSampler"); - if (fDstScaleAndTranslateLocation < 0 || fAtlasInvSizeLocation < 0 || fSamplerLocation < 0) { - callgl(DeleteShader, vs); - callgl(DeleteShader, fs); - callgl(DeleteProgram, fProgram); - fProgram = 0; - } - - checkgl(); -} - -inline bool atlas_format_to_gl_types(SkAtlasTextRenderer::AtlasFormat format, - GrGLenum* internalFormat, GrGLenum* externalFormat, - GrGLenum* type) { - switch (format) { - case SkAtlasTextRenderer::AtlasFormat::kA8: - *internalFormat = GR_GL_R8; - *externalFormat = GR_GL_RED; - *type = GR_GL_UNSIGNED_BYTE; - return true; - } - return false; -} - -inline int atlas_format_bytes_per_pixel(SkAtlasTextRenderer::AtlasFormat format) { - switch (format) { - case SkAtlasTextRenderer::AtlasFormat::kA8: - return 1; - } - return 0; -} - -void* GLTestAtlasTextRenderer::createTexture(AtlasFormat format, int width, int height) { - GrGLenum internalFormat; - GrGLenum externalFormat; - GrGLenum type; - if (!atlas_format_to_gl_types(format, &internalFormat, &externalFormat, &type)) { - return nullptr; - } - auto restore = fContext->makeCurrentAndAutoRestore(); - - GrGLuint id; - callgl(GenTextures, 1, &id); - if (!id) { - return nullptr; - } - - callgl(BindTexture, GR_GL_TEXTURE_2D, id); - callgl(TexImage2D, GR_GL_TEXTURE_2D, 0, internalFormat, width, height, 0, externalFormat, type, - nullptr); - checkgl(); - - AtlasTexture* atlas = new AtlasTexture; - atlas->fID = id; - atlas->fFormat = format; - atlas->fWidth = width; - atlas->fHeight = height; - return atlas; -} - -void GLTestAtlasTextRenderer::deleteTexture(void* textureHandle) { - auto restore = fContext->makeCurrentAndAutoRestore(); - - auto* atlasTexture = reinterpret_cast<const AtlasTexture*>(textureHandle); - - callgl(DeleteTextures, 1, &atlasTexture->fID); - checkgl(); - - delete atlasTexture; -} - -void GLTestAtlasTextRenderer::setTextureData(void* textureHandle, const void* data, int x, int y, - int width, int height, size_t rowBytes) { - auto restore = fContext->makeCurrentAndAutoRestore(); - - auto atlasTexture = reinterpret_cast<const AtlasTexture*>(textureHandle); - - GrGLenum internalFormat; - GrGLenum externalFormat; - GrGLenum type; - if (!atlas_format_to_gl_types(atlasTexture->fFormat, &internalFormat, &externalFormat, &type)) { - return; - } - int bpp = atlas_format_bytes_per_pixel(atlasTexture->fFormat); - GrGLint rowLength = static_cast<GrGLint>(rowBytes / bpp); - if (static_cast<size_t>(rowLength * bpp) != rowBytes) { - return; - } - callgl(PixelStorei, GR_GL_UNPACK_ALIGNMENT, 1); - callgl(PixelStorei, GR_GL_UNPACK_ROW_LENGTH, rowLength); - callgl(BindTexture, GR_GL_TEXTURE_2D, atlasTexture->fID); - callgl(TexSubImage2D, GR_GL_TEXTURE_2D, 0, x, y, width, height, externalFormat, type, data); - checkgl(); -} - -void GLTestAtlasTextRenderer::drawSDFGlyphs(void* targetHandle, void* textureHandle, - const SDFVertex vertices[], int quadCnt) { - auto restore = fContext->makeCurrentAndAutoRestore(); - - auto target = reinterpret_cast<const Target*>(targetHandle); - auto atlas = reinterpret_cast<const AtlasTexture*>(textureHandle); - - callgl(UseProgram, fProgram); - - callgl(ActiveTexture, GR_GL_TEXTURE0); - callgl(BindTexture, GR_GL_TEXTURE_2D, atlas->fID); - callgl(TexParameteri, GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MAG_FILTER, GR_GL_LINEAR); - callgl(TexParameteri, GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MIN_FILTER, GR_GL_LINEAR); - - float uniformScaleAndTranslate[4] = {2.f / target->fWidth, -1.f, 2.f / target->fHeight, -1.f}; - callgl(Uniform4fv, fDstScaleAndTranslateLocation, 1, uniformScaleAndTranslate); - callgl(Uniform2f, fAtlasInvSizeLocation, 1.f / atlas->fWidth, 1.f / atlas->fHeight); - callgl(Uniform1i, fSamplerLocation, 0); - - callgl(BindFramebuffer, GR_GL_FRAMEBUFFER, target->fFBOID); - callgl(Viewport, 0, 0, target->fWidth, target->fHeight); - - callgl(Enable, GR_GL_BLEND); - callgl(BlendFunc, GR_GL_ONE, GR_GL_ONE_MINUS_SRC_ALPHA); - callgl(Disable, GR_GL_DEPTH_TEST); - - callgl(BindVertexArray, 0); - callgl(BindBuffer, GR_GL_ARRAY_BUFFER, 0); - callgl(BindBuffer, GR_GL_ELEMENT_ARRAY_BUFFER, 0); - callgl(VertexAttribPointer, 0, 3, GR_GL_FLOAT, GR_GL_FALSE, sizeof(SDFVertex), vertices); - size_t colorOffset = 3 * sizeof(float); - callgl(VertexAttribPointer, 1, 4, GR_GL_UNSIGNED_BYTE, GR_GL_TRUE, sizeof(SDFVertex), - reinterpret_cast<const char*>(vertices) + colorOffset); - size_t texOffset = colorOffset + sizeof(uint32_t); - callgl(VertexAttribIPointer, 2, 2, GR_GL_UNSIGNED_SHORT, sizeof(SDFVertex), - reinterpret_cast<const char*>(vertices) + texOffset); - callgl(EnableVertexAttribArray, 0); - callgl(EnableVertexAttribArray, 1); - callgl(EnableVertexAttribArray, 2); - - std::unique_ptr<uint16_t[]> indices(new uint16_t[quadCnt * 6]); - for (int q = 0; q < quadCnt; ++q) { - indices[q * 6 + 0] = 0 + 4 * q; - indices[q * 6 + 1] = 1 + 4 * q; - indices[q * 6 + 2] = 2 + 4 * q; - indices[q * 6 + 3] = 2 + 4 * q; - indices[q * 6 + 4] = 1 + 4 * q; - indices[q * 6 + 5] = 3 + 4 * q; - } - callgl(DrawElements, GR_GL_TRIANGLES, 6 * quadCnt, GR_GL_UNSIGNED_SHORT, indices.get()); - checkgl(); -} - -void* GLTestAtlasTextRenderer::makeTargetHandle(int width, int height) { - auto restore = fContext->makeCurrentAndAutoRestore(); - - GrGLuint fbo; - callgl(GenFramebuffers, 1, &fbo); - if (!fbo) { - return nullptr; - } - GrGLuint rb; - callgl(GenRenderbuffers, 1, &rb); - if (!rb) { - callgl(DeleteFramebuffers, 1, &fbo); - return nullptr; - } - callgl(BindFramebuffer, GR_GL_FRAMEBUFFER, fbo); - callgl(BindRenderbuffer, GR_GL_RENDERBUFFER, rb); - callgl(RenderbufferStorage, GR_GL_RENDERBUFFER, GR_GL_RGBA8, width, height); - callgl(FramebufferRenderbuffer, GR_GL_FRAMEBUFFER, GR_GL_COLOR_ATTACHMENT0, GR_GL_RENDERBUFFER, - rb); - GrGLenum status = callgl(CheckFramebufferStatus, GR_GL_FRAMEBUFFER); - if (GR_GL_FRAMEBUFFER_COMPLETE != status) { - callgl(DeleteFramebuffers, 1, &fbo); - callgl(DeleteRenderbuffers, 1, &rb); - return nullptr; - } - callgl(Disable, GR_GL_SCISSOR_TEST); - callgl(ClearColor, 0, 0, 0, 0.0); - callgl(Clear, GR_GL_COLOR_BUFFER_BIT); - checkgl(); - Target* target = new Target; - target->fFBOID = fbo; - target->fRBID = rb; - target->fWidth = width; - target->fHeight = height; - return target; -} - -void GLTestAtlasTextRenderer::targetDeleted(void* targetHandle) { - auto restore = fContext->makeCurrentAndAutoRestore(); - - Target* target = reinterpret_cast<Target*>(targetHandle); - callgl(DeleteFramebuffers, 1, &target->fFBOID); - callgl(DeleteRenderbuffers, 1, &target->fRBID); - delete target; -} - -SkBitmap GLTestAtlasTextRenderer::readTargetHandle(void* targetHandle) { - auto restore = fContext->makeCurrentAndAutoRestore(); - - Target* target = reinterpret_cast<Target*>(targetHandle); - - auto info = - SkImageInfo::Make(target->fWidth, target->fHeight, kRGBA_8888_SkColorType, kPremul_SkAlphaType); - SkBitmap bmp; - bmp.setInfo(info, sizeof(uint32_t) * target->fWidth); - bmp.allocPixels(); - - callgl(BindFramebuffer, GR_GL_FRAMEBUFFER, target->fFBOID); - callgl(ReadPixels, 0, 0, target->fWidth, target->fHeight, GR_GL_RGBA, GR_GL_UNSIGNED_BYTE, - bmp.getPixels()); - checkgl(); - return bmp; -} - -void GLTestAtlasTextRenderer::clearTarget(void* targetHandle, uint32_t color) { - auto restore = fContext->makeCurrentAndAutoRestore(); - - Target* target = reinterpret_cast<Target*>(targetHandle); - callgl(BindFramebuffer, GR_GL_FRAMEBUFFER, target->fFBOID); - callgl(Disable, GR_GL_SCISSOR_TEST); - float r = ((color >> 0) & 0xff) / 255.f; - float g = ((color >> 8) & 0xff) / 255.f; - float b = ((color >> 16) & 0xff) / 255.f; - float a = ((color >> 24) & 0xff) / 255.f; - callgl(ClearColor, r, g, b, a); - callgl(Clear, GR_GL_COLOR_BUFFER_BIT); -} - -} // anonymous namespace - -namespace sk_gpu_test { - -sk_sp<TestAtlasTextRenderer> MakeGLTestAtlasTextRenderer() { - std::unique_ptr<GLTestContext> context(CreatePlatformGLTestContext(kGL_GrGLStandard)); - if (!context) { - context.reset(CreatePlatformGLTestContext(kGLES_GrGLStandard)); - } - if (!context) { - return nullptr; - } - auto restorer = context->makeCurrentAndAutoRestore(); - auto renderer = sk_make_sp<GLTestAtlasTextRenderer>(std::move(context)); - return renderer->initialized() ? std::move(renderer) : nullptr; -} - -} // namespace sk_gpu_test diff --git a/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.h b/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.h deleted file mode 100644 index d1536d303c6..00000000000 --- a/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2017 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#ifndef GLTestAtlasTextRenderer_DEFINED -#define GLTestAtlasTextRenderer_DEFINED - -#include "include/core/SkRefCnt.h" - -namespace sk_gpu_test { - -class TestAtlasTextRenderer; - -/** - * Creates a TestAtlasTextRenderer that uses its own OpenGL context to implement - * SkAtlasTextRenderer. - */ -sk_sp<TestAtlasTextRenderer> MakeGLTestAtlasTextRenderer(); - -} // namespace sk_gpu_test - -#endif diff --git a/chromium/third_party/skia/tools/gpu/atlastext/TestAtlasTextRenderer.h b/chromium/third_party/skia/tools/gpu/atlastext/TestAtlasTextRenderer.h deleted file mode 100644 index e928e76402b..00000000000 --- a/chromium/third_party/skia/tools/gpu/atlastext/TestAtlasTextRenderer.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2017 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#ifndef TestAtlasTextRenderer_DEFINED -#define TestAtlasTextRenderer_DEFINED - -#include "include/atlastext/SkAtlasTextRenderer.h" -#include "include/core/SkBitmap.h" - -namespace sk_gpu_test { - -class TestContext; - -/** - * Base class for implementations of SkAtlasTextRenderer in order to test the SkAtlasText APIs. - * Adds a helper for creating SkAtlasTextTargets and to read back the contents of a target as a - * bitmap. - */ -class TestAtlasTextRenderer : public SkAtlasTextRenderer { -public: - /** Returns a handle that can be used to construct a SkAtlasTextTarget instance. */ - virtual void* makeTargetHandle(int width, int height) = 0; - - /** Makes a SkBitmap of the target handle's contents. */ - virtual SkBitmap readTargetHandle(void* targetHandle) = 0; - - /** Clears the target to the specified color, encoded as RGBA (low to high byte order) */ - virtual void clearTarget(void* targetHandle, uint32_t color) = 0; -}; - -} // namespace sk_gpu_test - -#endif diff --git a/chromium/third_party/skia/tools/gpu/d3d/D3DTestContext.cpp b/chromium/third_party/skia/tools/gpu/d3d/D3DTestContext.cpp index ba00a36cd5c..fff7ca127ff 100644 --- a/chromium/third_party/skia/tools/gpu/d3d/D3DTestContext.cpp +++ b/chromium/third_party/skia/tools/gpu/d3d/D3DTestContext.cpp @@ -55,6 +55,7 @@ protected: private: D3DTestContextImpl(const GrD3DBackendContext& backendContext, bool ownsContext) : D3DTestContext(backendContext, ownsContext) { + fFenceSupport = true; } void onPlatformMakeNotCurrent() const override {} diff --git a/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.cpp b/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.cpp index c23669709f7..58d755ea5c1 100644 --- a/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.cpp +++ b/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.cpp @@ -6,7 +6,6 @@ */ #include "dawn/webgpu_cpp.h" -#include "dawn_native/DawnNative.h" #include "tools/gpu/dawn/DawnTestContext.h" #ifdef SK_BUILD_FOR_UNIX @@ -78,6 +77,10 @@ private: ProcGetter* ProcGetter::fInstance; #endif +static void PrintDeviceError(WGPUErrorType, const char* message, void*) { + SkDebugf("Device error: %s\n", message); +} + class DawnTestContextImpl : public sk_gpu_test::DawnTestContext { public: static wgpu::Device createDevice(const dawn_native::Instance& instance, @@ -88,7 +91,7 @@ public: std::vector<dawn_native::Adapter> adapters = instance.GetAdapters(); for (dawn_native::Adapter adapter : adapters) { if (adapter.GetBackendType() == type) { - return adapter.CreateDevice(); + return wgpu::Device::Acquire(adapter.CreateDevice()); } } return nullptr; @@ -125,6 +128,7 @@ public: #endif #endif device = createDevice(*instance, type); + device.SetUncapturedErrorCallback(PrintDeviceError, 0); } if (!device) { return nullptr; @@ -150,15 +154,13 @@ protected: private: DawnTestContextImpl(std::unique_ptr<dawn_native::Instance> instance, const wgpu::Device& device) - : DawnTestContext(device) - , fInstance(std::move(instance)) { + : DawnTestContext(std::move(instance), device) { fFenceSupport = true; } void onPlatformMakeNotCurrent() const override {} void onPlatformMakeCurrent() const override {} std::function<void()> onPlatformGetAutoContextRestore() const override { return nullptr; } - std::unique_ptr<dawn_native::Instance> fInstance; typedef sk_gpu_test::DawnTestContext INHERITED; }; diff --git a/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.h b/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.h index 63f35f6f261..73b4e5df260 100644 --- a/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.h +++ b/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.h @@ -9,6 +9,7 @@ #define DawnTestContext_DEFINED #include "tools/gpu/TestContext.h" +#include <dawn_native/DawnNative.h> #ifdef SK_DAWN @@ -22,8 +23,10 @@ public: } protected: - DawnTestContext(const wgpu::Device& device) : fDevice(device) {} + DawnTestContext(std::unique_ptr<dawn_native::Instance> instance, const wgpu::Device& device) + : fInstance(std::move(instance)), fDevice(device) {} + std::unique_ptr<dawn_native::Instance> fInstance; wgpu::Device fDevice; private: diff --git a/chromium/third_party/skia/tools/gpu/gl/GLTestContext.cpp b/chromium/third_party/skia/tools/gpu/gl/GLTestContext.cpp index 75c1fee8fd5..f40657c9388 100644 --- a/chromium/third_party/skia/tools/gpu/gl/GLTestContext.cpp +++ b/chromium/third_party/skia/tools/gpu/gl/GLTestContext.cpp @@ -222,41 +222,6 @@ void GLTestContext::finish() { #endif } -GrGLuint GLTestContext::createTextureRectangle(int width, int height, GrGLenum internalFormat, - GrGLenum externalFormat, GrGLenum externalType, - GrGLvoid* data) { -#ifdef SK_GL - // Should match GrGLCaps check for fRectangleTextureSupport. - if (kGL_GrGLStandard != fGL->fStandard || - (GrGLGetVersion(fGL.get()) < GR_GL_VER(3, 1) && - !fGL->fExtensions.has("GL_ARB_texture_rectangle") && - !fGL->fExtensions.has("GL_ANGLE_texture_rectangle"))) { - return 0; - } - - if (GrGLGetGLSLVersion(fGL.get()) < GR_GLSL_VER(1, 40)) { - return 0; - } - - GrGLuint id; - GR_GL_CALL(fGL.get(), GenTextures(1, &id)); - GR_GL_CALL(fGL.get(), BindTexture(GR_GL_TEXTURE_RECTANGLE, id)); - GR_GL_CALL(fGL.get(), TexParameteri(GR_GL_TEXTURE_RECTANGLE, GR_GL_TEXTURE_MAG_FILTER, - GR_GL_NEAREST)); - GR_GL_CALL(fGL.get(), TexParameteri(GR_GL_TEXTURE_RECTANGLE, GR_GL_TEXTURE_MIN_FILTER, - GR_GL_NEAREST)); - GR_GL_CALL(fGL.get(), TexParameteri(GR_GL_TEXTURE_RECTANGLE, GR_GL_TEXTURE_WRAP_S, - GR_GL_CLAMP_TO_EDGE)); - GR_GL_CALL(fGL.get(), TexParameteri(GR_GL_TEXTURE_RECTANGLE, GR_GL_TEXTURE_WRAP_T, - GR_GL_CLAMP_TO_EDGE)); - GR_GL_CALL(fGL.get(), TexImage2D(GR_GL_TEXTURE_RECTANGLE, 0, internalFormat, width, height, 0, - externalFormat, externalType, data)); - return id; -#else - return 0; -#endif -} - sk_sp<GrContext> GLTestContext::makeGrContext(const GrContextOptions& options) { #ifdef SK_GL return GrContext::MakeGL(fGL, options); diff --git a/chromium/third_party/skia/tools/gpu/gl/GLTestContext.h b/chromium/third_party/skia/tools/gpu/gl/GLTestContext.h index 601c3b9f18c..54b47492504 100644 --- a/chromium/third_party/skia/tools/gpu/gl/GLTestContext.h +++ b/chromium/third_party/skia/tools/gpu/gl/GLTestContext.h @@ -33,10 +33,6 @@ public: virtual void destroyEGLImage(GrEGLImage) const { } - /** Used for testing GL_TEXTURE_RECTANGLE integration. */ - GrGLuint createTextureRectangle(int width, int height, GrGLenum internalFormat, - GrGLenum externalFormat, GrGLenum externalType, GrGLvoid* data); - /** * Used for testing EGLImage integration. Takes a EGLImage and wraps it in a * GL_TEXTURE_EXTERNAL_OES. diff --git a/chromium/third_party/skia/tools/gpu/gl/angle/GLTestContext_angle.cpp b/chromium/third_party/skia/tools/gpu/gl/angle/GLTestContext_angle.cpp index 57d39e00fad..24eeb2f0441 100644 --- a/chromium/third_party/skia/tools/gpu/gl/angle/GLTestContext_angle.cpp +++ b/chromium/third_party/skia/tools/gpu/gl/angle/GLTestContext_angle.cpp @@ -25,6 +25,8 @@ #define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208 #define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x320D +#define EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE 0x3483 + using sk_gpu_test::ANGLEBackend; using sk_gpu_test::ANGLEContextVersion; @@ -281,12 +283,20 @@ ANGLEGLContext::ANGLEGLContext(ANGLEBackend type, ANGLEContextVersion version, } int versionNum = ANGLEContextVersion::kES2 == version ? 2 : 3; - const EGLint contextAttribs[] = { + std::vector<EGLint> contextAttribs = { EGL_CONTEXT_CLIENT_VERSION, versionNum, - EGL_NONE }; + + const char* extensions = eglQueryString(fDisplay, EGL_EXTENSIONS); + if (strstr(extensions, "EGL_ANGLE_create_context_backwards_compatible")) { + contextAttribs.push_back(EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE); + contextAttribs.push_back(EGL_FALSE); + } + + contextAttribs.push_back(EGL_NONE); + EGLContext eglShareContext = shareContext ? shareContext->fContext : nullptr; - fContext = eglCreateContext(fDisplay, surfaceConfig, eglShareContext, contextAttribs); + fContext = eglCreateContext(fDisplay, surfaceConfig, eglShareContext, contextAttribs.data()); if (EGL_NO_CONTEXT == fContext) { SkDebugf("Could not create context!"); this->destroyGLContext(); @@ -337,7 +347,6 @@ ANGLEGLContext::ANGLEGLContext(ANGLEBackend type, ANGLEContextVersion version, break; } #endif - const char* extensions = eglQueryString(fDisplay, EGL_EXTENSIONS); if (strstr(extensions, "EGL_KHR_image")) { fCreateImage = (PFNEGLCREATEIMAGEKHRPROC)eglGetProcAddress("eglCreateImageKHR"); fDestroyImage = (PFNEGLDESTROYIMAGEKHRPROC)eglGetProcAddress("eglDestroyImageKHR"); @@ -366,7 +375,7 @@ GrEGLImage ANGLEGLContext::texture2DToEGLImage(GrGLuint texID) const { void ANGLEGLContext::destroyEGLImage(GrEGLImage image) const { fDestroyImage(fDisplay, image); } GrGLuint ANGLEGLContext::eglImageToExternalTexture(GrEGLImage image) const { - GrGLClearErr(this->gl()); + while (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) {} if (!this->gl()->hasExtension("GL_OES_EGL_image_external")) { return 0; } @@ -382,12 +391,12 @@ GrGLuint ANGLEGLContext::eglImageToExternalTexture(GrEGLImage image) const { return 0; } GR_GL_CALL(this->gl(), BindTexture(GR_GL_TEXTURE_EXTERNAL, texID)); - if (GR_GL_GET_ERROR(this->gl()) != GR_GL_NO_ERROR) { + if (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) { GR_GL_CALL(this->gl(), DeleteTextures(1, &texID)); return 0; } glEGLImageTargetTexture2D(GR_GL_TEXTURE_EXTERNAL, image); - if (GR_GL_GET_ERROR(this->gl()) != GR_GL_NO_ERROR) { + if (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) { GR_GL_CALL(this->gl(), DeleteTextures(1, &texID)); return 0; } diff --git a/chromium/third_party/skia/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp b/chromium/third_party/skia/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp index e3228a4e787..325e034a07e 100644 --- a/chromium/third_party/skia/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp +++ b/chromium/third_party/skia/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp @@ -375,7 +375,7 @@ void EGLGLTestContext::destroyEGLImage(GrEGLImage image) const { GrGLuint EGLGLTestContext::eglImageToExternalTexture(GrEGLImage image) const { #ifdef SK_GL - GrGLClearErr(this->gl()); + while (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) {} if (!this->gl()->hasExtension("GL_OES_EGL_image_external")) { return 0; } @@ -392,12 +392,12 @@ GrGLuint EGLGLTestContext::eglImageToExternalTexture(GrEGLImage image) const { return 0; } GR_GL_CALL_NOERRCHECK(this->gl(), BindTexture(GR_GL_TEXTURE_EXTERNAL, texID)); - if (GR_GL_GET_ERROR(this->gl()) != GR_GL_NO_ERROR) { + if (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) { GR_GL_CALL(this->gl(), DeleteTextures(1, &texID)); return 0; } glEGLImageTargetTexture2D(GR_GL_TEXTURE_EXTERNAL, image); - if (GR_GL_GET_ERROR(this->gl()) != GR_GL_NO_ERROR) { + if (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) { GR_GL_CALL(this->gl(), DeleteTextures(1, &texID)); return 0; } diff --git a/chromium/third_party/skia/tools/gpu/gl/interface/templates.go b/chromium/third_party/skia/tools/gpu/gl/interface/templates.go index ebed908c67d..5f3e3918bce 100644 --- a/chromium/third_party/skia/tools/gpu/gl/interface/templates.go +++ b/chromium/third_party/skia/tools/gpu/gl/interface/templates.go @@ -234,6 +234,54 @@ GrGLInterface::GrGLInterface() { fStandard = kNone_GrGLStandard; } +#if GR_GL_CHECK_ERROR +static const char* get_error_string(GrGLenum err) { + switch (err) { + case GR_GL_NO_ERROR: + return ""; + case GR_GL_INVALID_ENUM: + return "Invalid Enum"; + case GR_GL_INVALID_VALUE: + return "Invalid Value"; + case GR_GL_INVALID_OPERATION: + return "Invalid Operation"; + case GR_GL_OUT_OF_MEMORY: + return "Out of Memory"; + case GR_GL_CONTEXT_LOST: + return "Context Lost"; + } + return "Unknown"; +} + +GrGLenum GrGLInterface::checkError(const char* location, const char* call) const { + GrGLenum error = fFunctions.fGetError(); + if (error != GR_GL_NO_ERROR && !fSuppressErrorLogging) { + SkDebugf("---- glGetError 0x%x(%s)", error, get_error_string(error)); + if (location) { + SkDebugf(" at\n\t%s", location); + } + if (call) { + SkDebugf("\n\t\t%s", call); + } + SkDebugf("\n"); + if (error == GR_GL_OUT_OF_MEMORY) { + fOOMed = true; + } + } + return error; +} + +bool GrGLInterface::checkAndResetOOMed() const { + if (fOOMed) { + fOOMed = false; + return true; + } + return false; +} + +void GrGLInterface::suppressErrorLogging() { fSuppressErrorLogging = true; } +#endif + #define RETURN_FALSE_INTERFACE \ SkDEBUGF("%s:%d GrGLInterface::validate() failed.\n", __FILE__, __LINE__); \ return false diff --git a/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.cpp b/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.cpp new file mode 100644 index 00000000000..f1a02a495fb --- /dev/null +++ b/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.cpp @@ -0,0 +1,109 @@ +/* + * Copyright 2020 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "tools/gpu/vk/VkTestHelper.h" + +#ifdef SK_VULKAN + +#include "include/core/SkSurface.h" +#include "include/gpu/GrContext.h" +#include "tools/gpu/vk/VkTestUtils.h" + +#define ACQUIRE_INST_VK_PROC(name) \ + fVk##name = reinterpret_cast<PFN_vk##name>(getProc("vk" #name, fBackendContext.fInstance,\ + VK_NULL_HANDLE)); \ + if (fVk##name == nullptr) { \ + SkDebugf("Function ptr for vk%s could not be acquired\n", #name); \ + return false; \ + } + +#define ACQUIRE_DEVICE_VK_PROC(name) \ + fVk##name = reinterpret_cast<PFN_vk##name>(getProc("vk" #name, VK_NULL_HANDLE, fDevice)); \ + if (fVk##name == nullptr) { \ + SkDebugf("Function ptr for vk%s could not be acquired\n", #name); \ + return false; \ + } + +bool VkTestHelper::init() { + PFN_vkGetInstanceProcAddr instProc; + PFN_vkGetDeviceProcAddr devProc; + if (!sk_gpu_test::LoadVkLibraryAndGetProcAddrFuncs(&instProc, &devProc)) { + return false; + } + auto getProc = [&instProc, &devProc](const char* proc_name, + VkInstance instance, VkDevice device) { + if (device != VK_NULL_HANDLE) { + return devProc(device, proc_name); + } + return instProc(instance, proc_name); + }; + + fFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; + fFeatures.pNext = nullptr; + + fBackendContext.fInstance = VK_NULL_HANDLE; + fBackendContext.fDevice = VK_NULL_HANDLE; + + if (!sk_gpu_test::CreateVkBackendContext(getProc, &fBackendContext, &fExtensions, + &fFeatures, &fDebugCallback, nullptr, + sk_gpu_test::CanPresentFn(), fIsProtected)) { + return false; + } + fDevice = fBackendContext.fDevice; + + if (fDebugCallback != VK_NULL_HANDLE) { + fDestroyDebugCallback = reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>( + instProc(fBackendContext.fInstance, "vkDestroyDebugReportCallbackEXT")); + } + ACQUIRE_INST_VK_PROC(DestroyInstance) + ACQUIRE_INST_VK_PROC(DeviceWaitIdle) + ACQUIRE_INST_VK_PROC(DestroyDevice) + + ACQUIRE_INST_VK_PROC(GetPhysicalDeviceFormatProperties) + ACQUIRE_INST_VK_PROC(GetPhysicalDeviceMemoryProperties) + + ACQUIRE_DEVICE_VK_PROC(CreateImage) + ACQUIRE_DEVICE_VK_PROC(DestroyImage) + ACQUIRE_DEVICE_VK_PROC(GetImageMemoryRequirements) + ACQUIRE_DEVICE_VK_PROC(AllocateMemory) + ACQUIRE_DEVICE_VK_PROC(FreeMemory) + ACQUIRE_DEVICE_VK_PROC(BindImageMemory) + ACQUIRE_DEVICE_VK_PROC(MapMemory) + ACQUIRE_DEVICE_VK_PROC(UnmapMemory) + ACQUIRE_DEVICE_VK_PROC(FlushMappedMemoryRanges) + ACQUIRE_DEVICE_VK_PROC(GetImageSubresourceLayout) + + fGrContext = GrContext::MakeVulkan(fBackendContext); + if (!fGrContext) { + return false; + } + + return true; +} + +void VkTestHelper::cleanup() { + fGrContext.reset(); + + fBackendContext.fMemoryAllocator.reset(); + if (fDevice != VK_NULL_HANDLE) { + fVkDeviceWaitIdle(fDevice); + fVkDestroyDevice(fDevice, nullptr); + fDevice = VK_NULL_HANDLE; + } + if (fDebugCallback != VK_NULL_HANDLE) { + fDestroyDebugCallback(fBackendContext.fInstance, fDebugCallback, nullptr); + } + + if (fBackendContext.fInstance != VK_NULL_HANDLE) { + fVkDestroyInstance(fBackendContext.fInstance, nullptr); + fBackendContext.fInstance = VK_NULL_HANDLE; + } + + sk_gpu_test::FreeVulkanFeaturesStructs(&fFeatures); +} + +#endif // SK_VULKAN diff --git a/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.h b/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.h new file mode 100644 index 00000000000..965885a1599 --- /dev/null +++ b/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.h @@ -0,0 +1,71 @@ +/* + * Copyright 2020 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef VkTestHelper_DEFINED +#define VkTestHelper_DEFINED + +#include "include/core/SkTypes.h" + +#ifdef SK_VULKAN + +#include "include/core/SkRefCnt.h" +#include "include/gpu/vk/GrVkBackendContext.h" +#include "include/gpu/vk/GrVkExtensions.h" + +class GrContext; +class SkSurface; + +#define DECLARE_VK_PROC(name) PFN_vk##name fVk##name + +class VkTestHelper { +public: + VkTestHelper(bool isProtected) : fIsProtected(isProtected) {} + + ~VkTestHelper() { + this->cleanup(); + } + + bool init(); + + GrContext* grContext() { return fGrContext.get(); } + +private: + void cleanup(); + + DECLARE_VK_PROC(DestroyInstance); + DECLARE_VK_PROC(DeviceWaitIdle); + DECLARE_VK_PROC(DestroyDevice); + + DECLARE_VK_PROC(GetPhysicalDeviceFormatProperties); + DECLARE_VK_PROC(GetPhysicalDeviceMemoryProperties); + + DECLARE_VK_PROC(CreateImage); + DECLARE_VK_PROC(DestroyImage); + DECLARE_VK_PROC(GetImageMemoryRequirements); + DECLARE_VK_PROC(AllocateMemory); + DECLARE_VK_PROC(FreeMemory); + DECLARE_VK_PROC(BindImageMemory); + DECLARE_VK_PROC(MapMemory); + DECLARE_VK_PROC(UnmapMemory); + DECLARE_VK_PROC(FlushMappedMemoryRanges); + DECLARE_VK_PROC(GetImageSubresourceLayout); + + bool fIsProtected = false; + VkDevice fDevice = VK_NULL_HANDLE; + + GrVkExtensions fExtensions; + VkPhysicalDeviceFeatures2 fFeatures = {}; + VkDebugReportCallbackEXT fDebugCallback = VK_NULL_HANDLE; + PFN_vkDestroyDebugReportCallbackEXT fDestroyDebugCallback = nullptr; + GrVkBackendContext fBackendContext; + sk_sp<GrContext> fGrContext; +}; + +#undef DECLARE_VK_PROC + +#endif // SK_VULKAN +#endif // VkTestHelper_DEFINED diff --git a/chromium/third_party/skia/tools/gpu/vk/VkTestUtils.cpp b/chromium/third_party/skia/tools/gpu/vk/VkTestUtils.cpp index a6026af739b..86084cf7935 100644 --- a/chromium/third_party/skia/tools/gpu/vk/VkTestUtils.cpp +++ b/chromium/third_party/skia/tools/gpu/vk/VkTestUtils.cpp @@ -110,6 +110,11 @@ VKAPI_ATTR VkBool32 VKAPI_CALL DebugReportCallback( const char* pMessage, void* pUserData) { if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { + // See https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/1887 + if (strstr(pMessage, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521") || + strstr(pMessage, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522")) { + return VK_FALSE; + } SkDebugf("Vulkan error [%s]: code: %d: %s\n", pLayerPrefix, messageCode, pMessage); print_backtrace(); SkDEBUGFAIL("Vulkan debug layer error"); diff --git a/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.cpp b/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.cpp new file mode 100644 index 00000000000..6e464a1c8a9 --- /dev/null +++ b/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.cpp @@ -0,0 +1,196 @@ +/* + * Copyright 2020 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "tools/gpu/vk/VkYcbcrSamplerHelper.h" + +#ifdef SK_VULKAN + +#include "include/gpu/GrContext.h" +#include "src/gpu/GrContextPriv.h" +#include "src/gpu/vk/GrVkGpu.h" +#include "src/gpu/vk/GrVkUtil.h" + +int VkYcbcrSamplerHelper::GetExpectedY(int x, int y, int width, int height) { + return 16 + (x + y) * 219 / (width + height - 2); +} + +std::pair<int, int> VkYcbcrSamplerHelper::GetExpectedUV(int x, int y, int width, int height) { + return { 16 + x * 224 / (width - 1), 16 + y * 224 / (height - 1) }; +} + +GrVkGpu* VkYcbcrSamplerHelper::vkGpu() { + return (GrVkGpu*) fContext->priv().getGpu(); +} + +VkYcbcrSamplerHelper::VkYcbcrSamplerHelper(GrContext* context) : fContext(context) { + SkASSERT_RELEASE(context->backend() == GrBackendApi::kVulkan); +} + +VkYcbcrSamplerHelper::~VkYcbcrSamplerHelper() { + GrVkGpu* vkGpu = this->vkGpu(); + + if (fImage != VK_NULL_HANDLE) { + GR_VK_CALL(vkGpu->vkInterface(), DestroyImage(vkGpu->device(), fImage, nullptr)); + fImage = VK_NULL_HANDLE; + } + if (fImageMemory != VK_NULL_HANDLE) { + GR_VK_CALL(vkGpu->vkInterface(), FreeMemory(vkGpu->device(), fImageMemory, nullptr)); + fImageMemory = VK_NULL_HANDLE; + } +} + +bool VkYcbcrSamplerHelper::isYCbCrSupported() { + GrVkGpu* vkGpu = this->vkGpu(); + + return vkGpu->vkCaps().supportsYcbcrConversion(); +} + +bool VkYcbcrSamplerHelper::createBackendTexture(uint32_t width, uint32_t height) { + GrVkGpu* vkGpu = this->vkGpu(); + VkResult result; + + // Verify that the image format is supported. + VkFormatProperties formatProperties; + GR_VK_CALL(vkGpu->vkInterface(), + GetPhysicalDeviceFormatProperties(vkGpu->physicalDevice(), + VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, + &formatProperties)); + if (!(formatProperties.linearTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) { + // VK_FORMAT_G8_B8R8_2PLANE_420_UNORM is not supported + return false; + } + + // Create YCbCr image. + VkImageCreateInfo vkImageInfo = {}; + vkImageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + vkImageInfo.imageType = VK_IMAGE_TYPE_2D; + vkImageInfo.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM; + vkImageInfo.extent = VkExtent3D{width, height, 1}; + vkImageInfo.mipLevels = 1; + vkImageInfo.arrayLayers = 1; + vkImageInfo.samples = VK_SAMPLE_COUNT_1_BIT; + vkImageInfo.tiling = VK_IMAGE_TILING_LINEAR; + vkImageInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT; + vkImageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + vkImageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + + SkASSERT(fImage == VK_NULL_HANDLE); + GR_VK_CALL_RESULT(vkGpu, result, CreateImage(vkGpu->device(), &vkImageInfo, nullptr, &fImage)); + if (result != VK_SUCCESS) { + return false; + } + + VkMemoryRequirements requirements; + GR_VK_CALL(vkGpu->vkInterface(), GetImageMemoryRequirements(vkGpu->device(), + fImage, + &requirements)); + + uint32_t memoryTypeIndex = 0; + bool foundHeap = false; + VkPhysicalDeviceMemoryProperties phyDevMemProps; + GR_VK_CALL(vkGpu->vkInterface(), GetPhysicalDeviceMemoryProperties(vkGpu->physicalDevice(), + &phyDevMemProps)); + for (uint32_t i = 0; i < phyDevMemProps.memoryTypeCount && !foundHeap; ++i) { + if (requirements.memoryTypeBits & (1 << i)) { + // Map host-visible memory. + if (phyDevMemProps.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { + memoryTypeIndex = i; + foundHeap = true; + } + } + } + if (!foundHeap) { + return false; + } + + VkMemoryAllocateInfo allocInfo = {}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = requirements.size; + allocInfo.memoryTypeIndex = memoryTypeIndex; + + SkASSERT(fImageMemory == VK_NULL_HANDLE); + GR_VK_CALL_RESULT(vkGpu, result, AllocateMemory(vkGpu->device(), &allocInfo, + nullptr, &fImageMemory)); + if (result != VK_SUCCESS) { + return false; + } + + void* mappedBuffer; + GR_VK_CALL_RESULT(vkGpu, result, MapMemory(vkGpu->device(), fImageMemory, 0u, + requirements.size, 0u, &mappedBuffer)); + if (result != VK_SUCCESS) { + return false; + } + + // Write Y channel. + VkImageSubresource subresource; + subresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT; + subresource.mipLevel = 0; + subresource.arrayLayer = 0; + + VkSubresourceLayout yLayout; + GR_VK_CALL(vkGpu->vkInterface(), GetImageSubresourceLayout(vkGpu->device(), fImage, + &subresource, &yLayout)); + uint8_t* bufferData = reinterpret_cast<uint8_t*>(mappedBuffer) + yLayout.offset; + for (size_t y = 0; y < height; ++y) { + for (size_t x = 0; x < width; ++x) { + bufferData[y * yLayout.rowPitch + x] = GetExpectedY(x, y, width, height); + } + } + + // Write UV channels. + subresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT; + VkSubresourceLayout uvLayout; + GR_VK_CALL(vkGpu->vkInterface(), GetImageSubresourceLayout(vkGpu->device(), fImage, + &subresource, &uvLayout)); + bufferData = reinterpret_cast<uint8_t*>(mappedBuffer) + uvLayout.offset; + for (size_t y = 0; y < height / 2; ++y) { + for (size_t x = 0; x < width / 2; ++x) { + auto [u, v] = GetExpectedUV(2*x, 2*y, width, height); + bufferData[y * uvLayout.rowPitch + x * 2] = u; + bufferData[y * uvLayout.rowPitch + x * 2 + 1] = v; + } + } + + VkMappedMemoryRange flushRange; + flushRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; + flushRange.pNext = nullptr; + flushRange.memory = fImageMemory; + flushRange.offset = 0; + flushRange.size = VK_WHOLE_SIZE; + GR_VK_CALL_RESULT(vkGpu, result, FlushMappedMemoryRanges(vkGpu->device(), 1, &flushRange)); + if (result != VK_SUCCESS) { + return false; + } + GR_VK_CALL(vkGpu->vkInterface(), UnmapMemory(vkGpu->device(), fImageMemory)); + + // Bind image memory. + GR_VK_CALL_RESULT(vkGpu, result, BindImageMemory(vkGpu->device(), fImage, fImageMemory, 0u)); + if (result != VK_SUCCESS) { + return false; + } + + // Wrap the image into SkImage. + GrVkYcbcrConversionInfo ycbcrInfo(vkImageInfo.format, + /*externalFormat=*/0, + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709, + VK_SAMPLER_YCBCR_RANGE_ITU_NARROW, + VK_CHROMA_LOCATION_COSITED_EVEN, + VK_CHROMA_LOCATION_COSITED_EVEN, + VK_FILTER_LINEAR, + false, + formatProperties.linearTilingFeatures); + GrVkAlloc alloc(fImageMemory, 0 /* offset */, requirements.size, 0 /* flags */); + GrVkImageInfo imageInfo(fImage, alloc, VK_IMAGE_TILING_LINEAR, VK_IMAGE_LAYOUT_UNDEFINED, + vkImageInfo.format, 1 /* levelCount */, VK_QUEUE_FAMILY_IGNORED, + GrProtected::kNo, ycbcrInfo); + + fTexture = GrBackendTexture(width, height, imageInfo); + return true; +} + +#endif // SK_VULKAN diff --git a/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.h b/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.h new file mode 100644 index 00000000000..929f4c94e87 --- /dev/null +++ b/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.h @@ -0,0 +1,48 @@ +/* + * Copyright 2020 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef VkYcbcrSamplerHelper_DEFINED +#define VkYcbcrSamplerHelper_DEFINED + +#include "include/core/SkTypes.h" + +#ifdef SK_VULKAN + +#include "include/gpu/GrBackendSurface.h" + +class GrContext; +class GrVkGpu; + +// This helper will create and hold data for a Vulkan YCbCr backend texture. This format is +// particularly interesting because its sampler is immutable. +class VkYcbcrSamplerHelper { +public: + VkYcbcrSamplerHelper(GrContext*); + ~VkYcbcrSamplerHelper(); + + bool isYCbCrSupported(); + + bool createBackendTexture(uint32_t width, uint32_t height); + + const GrBackendTexture& backendTexture() const { return fTexture; } + + static int GetExpectedY(int x, int y, int width, int height); + static std::pair<int, int> GetExpectedUV(int x, int y, int width, int height); + +private: + GrVkGpu* vkGpu(); + + GrContext* fContext; + + VkImage fImage = VK_NULL_HANDLE; + VkDeviceMemory fImageMemory = VK_NULL_HANDLE; + GrBackendTexture fTexture; +}; + +#endif // SK_VULKAN + +#endif // VkYcbcrSamplerHelper_DEFINED diff --git a/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-canvas-perf.html b/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-canvas-perf.html index 746c0bcfed7..1cab30faad0 100644 --- a/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-canvas-perf.html +++ b/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-canvas-perf.html @@ -1,17 +1,17 @@ <!DOCTYPE html> <html> <head> - <title>Lottie-Web Perf</title> - <meta charset="utf-8" /> - <meta http-equiv="X-UA-Compatible" content="IE=egde,chrome=1"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <script src="/res/lottie.js" type="text/javascript" charset="utf-8"></script> - <style type="text/css" media="screen"> - body { - margin: 0; - padding: 0; - } - </style> + <title>Lottie-Web Perf</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <script src="/res/lottie.js" type="text/javascript" charset="utf-8"></script> + <style type="text/css" media="screen"> + body { + margin: 0; + padding: 0; + } + </style> </head> <body> <main> diff --git a/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-perf.html b/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-perf.html index 88cc992fa6f..9fc499b7c5c 100644 --- a/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-perf.html +++ b/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-perf.html @@ -1,17 +1,17 @@ <!DOCTYPE html> <html> <head> - <title>Lottie-Web Perf</title> - <meta charset="utf-8" /> - <meta http-equiv="X-UA-Compatible" content="IE=egde,chrome=1"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <script src="/res/lottie.js" type="text/javascript" charset="utf-8"></script> - <style type="text/css" media="screen"> - body { - margin: 0; - padding: 0; - } - </style> + <title>Lottie-Web Perf</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <script src="/res/lottie.js" type="text/javascript" charset="utf-8"></script> + <style type="text/css" media="screen"> + body { + margin: 0; + padding: 0; + } + </style> </head> <body> <main> diff --git a/chromium/third_party/skia/tools/lottiecap/driver.html b/chromium/third_party/skia/tools/lottiecap/driver.html index 2b6dc94049c..0811441c645 100644 --- a/chromium/third_party/skia/tools/lottiecap/driver.html +++ b/chromium/third_party/skia/tools/lottiecap/driver.html @@ -1,26 +1,26 @@ <!DOCTYPE html> <html> <head> - <title>Lottie Filmstrip Capture</title> - <meta charset="utf-8" /> - <meta http-equiv="X-UA-Compatible" content="IE=egde,chrome=1"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <script src="/lottie.js" type="text/javascript" charset="utf-8"></script> - <style type="text/css" media="screen"> - body, - main, - .anim { - margin: 0; - padding: 0; - } + <title>Lottie Filmstrip Capture</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <script src="/lottie.js" type="text/javascript" charset="utf-8"></script> + <style type="text/css" media="screen"> + body, + main, + .anim { + margin: 0; + padding: 0; + } - main { - display: flex; - width: 1000px; - height: 1000px; - flex-flow: row wrap; - } - </style> + main { + display: flex; + width: 1000px; + height: 1000px; + flex-flow: row wrap; + } + </style> </head> <body> <main> diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/Makefile b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/Makefile index 1aad3a80185..3e6aece221d 100644 --- a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/Makefile +++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/Makefile @@ -4,3 +4,23 @@ frames_load_lego_with_local: --canvaskit_wasm ../../out/canvaskit_wasm/canvaskit.wasm --use_gpu \ --input_lottie ../../modules/canvaskit/perf/assets/lego_loader.json \ --bench_html skottie-frames.html + +test_path_transform_without_snap: + node perf-canvaskit-with-puppeteer.js --canvaskit_js --canvaskit_js ../../out/canvaskit_wasm/canvaskit.js \ + --canvaskit_wasm ../../out/canvaskit_wasm/canvaskit.wasm --use_gpu \ + --assets path_translate_assets \ + --bench_html path-transform.html \ + --query_params translate opacity + +test_path_transform_with_snap: + node perf-canvaskit-with-puppeteer.js --canvaskit_js --canvaskit_js ../../out/canvaskit_wasm/canvaskit.js \ + --canvaskit_wasm ../../out/canvaskit_wasm/canvaskit.wasm --use_gpu \ + --assets path_translate_assets \ + --bench_html path-transform.html \ + --query_params translate opacity snap + +skp_with_local: + node perf-canvaskit-with-puppeteer.js --canvaskit_js ../../out/canvaskit_wasm/canvaskit.js \ + --canvaskit_wasm ../../out/canvaskit_wasm/canvaskit.wasm --use_gpu \ + --input_skp ${HOME}/skps/desk_nytimes.skp \ + --bench_html render-skp.html
\ No newline at end of file diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package-lock.json b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package-lock.json index f6f194a4616..2d6e0388481 100644 --- a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package-lock.json +++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package-lock.json @@ -4,15 +4,10 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/mime-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", - "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=" - }, "@types/node": { - "version": "13.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", - "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", + "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==", "optional": true }, "@types/yauzl": { @@ -536,9 +531,9 @@ } }, "mkdirp-classic": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.2.tgz", - "integrity": "sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g==" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "ms": { "version": "2.0.0", @@ -615,16 +610,14 @@ } }, "puppeteer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.0.1.tgz", - "integrity": "sha512-DxNnI9n4grVHC+9irUfNK2T6YFuRECJnvG7VzdVolxpVwWC5DQqI5ho9Z0af48K5MQW4sJY5cq3qQ5g6NkAjvw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.1.0.tgz", + "integrity": "sha512-jLa9sqdVx0tPnr2FcwAq+8DSjGhSM4YpkwOf3JE22Ycyqm71SW7B5uGfTyMGFoLCmbCozbLZclCjasPb0flTRw==", "requires": { - "@types/mime-types": "^2.1.0", "debug": "^4.1.0", "extract-zip": "^2.0.0", "https-proxy-agent": "^4.0.0", "mime": "^2.0.3", - "mime-types": "^2.1.25", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", "rimraf": "^3.0.2", @@ -642,9 +635,9 @@ } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", + "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==" }, "ms": { "version": "2.1.2", @@ -764,9 +757,9 @@ }, "dependencies": { "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -806,9 +799,9 @@ } }, "tar-fs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", - "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -903,9 +896,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", - "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==" + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==" }, "yauzl": { "version": "2.10.0", diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package.json b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package.json index ca96fc13b03..f2efa67d912 100644 --- a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package.json +++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package.json @@ -7,7 +7,7 @@ "command-line-args": "^5.0.2", "command-line-usage": "^5.0.3", "express": "^4.16.3", - "puppeteer": "^3.0.0" + "puppeteer": "^3.0.4" }, "devDependencies": {}, "scripts": { diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path-transform.html b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path-transform.html new file mode 100644 index 00000000000..66a293bd255 --- /dev/null +++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path-transform.html @@ -0,0 +1,189 @@ +<!-- This benchmark aims to measure performance degredation related to +moving a complex path. May be related to caching an alpha mask of the path at +subpixel coordinates i.e. (25.234, 43.119) instead of (25, 43). +As a consequence the cache may get full very quickly. Effect of paint opacity +and rotation transformations on performance can also be tested using the query param options. + +Available query param options: + - snap: Round all path translations to the nearest integer. This means subpixel coordinate. + translations will not be used. Only has an effect when the translating option is used. + - opacity: Use a transparent color to fill the path. If this option is + not included then opaque black is used. + - translate: The path will be randomly translated every frame. + - rotate: The path will be randomly rotated every frame. +--> +<!DOCTYPE html> +<html> +<head> + <title>Complex Path translation Perf</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <script src="/static/canvaskit.js" type="text/javascript" charset="utf-8"></script> + <style type="text/css" media="screen"> + body { + margin: 0; + padding: 0; + } + #test-svg { + height: 0; + width: 0; + } + #complex-path { + height: 1000px; + width: 1000px; + } + </style> +</head> +<body> + <!-- Arbitrary svg for testing. Source: https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/gallardo.svg--> + <object type="image/svg+xml" data="/static/assets/car.svg" id="test-svg"> + Car image + </object> + + <main> + <button id="start_bench">Start Benchmark</button> + <br> + <canvas id=complex-path width=1000 height=1000></canvas> + </main> + <script type="text/javascript" charset="utf-8"> + const urlSearchParams = new URLSearchParams(window.location.search); + + // We sample MAX_FRAMES or until MAX_SAMPLE_SECONDS has elapsed. + const MAX_FRAMES = 60 * 30; // ~30s at 60fps + const MAX_SAMPLE_MS = 30 * 1000; // in case something takes a while, stop after 30 seconds. + const TRANSPARENT_PINK = new Float32Array([1,0,1,0.1]); + + const svgObjectElement = document.getElementById('test-svg'); + svgObjectElement.addEventListener('load', () => { + CanvasKitInit({ + locateFile: (file) => '/static/' + file, + }).then(run); + }); + + function run(CanvasKit) { + + const surface = getSurface(CanvasKit); + if (!surface) { + console.error('Could not make surface', window._error); + return; + } + const skcanvas = surface.getCanvas(); + const grContext = surface.grContext; + + document.getElementById('start_bench').addEventListener('click', () => { + // Initialize drawing related objects + const svgElement = svgObjectElement.contentDocument; + const svgPathAndFillColorPairs = svgToPathAndFillColorPairs(svgElement, CanvasKit); + + const paint = new CanvasKit.SkPaint(); + paint.setAntiAlias(true); + paint.setStyle(CanvasKit.PaintStyle.Fill); + let paintColor = CanvasKit.BLACK; + + // Path is large, scale canvas so entire path is visible + skcanvas.scale(0.5, 0.5); + + // Initialize perf data + let currentFrameNumber = 0; + const frameTimesMs = new Float32Array(MAX_FRAMES); + let startTimeMs = performance.now(); + let previousFrameTimeMs = performance.now(); + + const resourceCacheUsageBytes = new Float32Array(MAX_FRAMES); + const usedJSHeapSizesBytes = new Float32Array(MAX_FRAMES); + + function drawFrame() { + // Draw complex path with random translations and rotations. + let randomHorizontalTranslation = 0; + let randomVerticalTranslation = 0; + let randomRotation = 0; + + if (urlSearchParams.has('translate')) { + randomHorizontalTranslation = Math.random() * 50 - 25; + randomVerticalTranslation = Math.random() * 50 - 25; + } + if (urlSearchParams.has('snap')) { + randomHorizontalTranslation = Math.round(randomHorizontalTranslation); + randomVerticalTranslation = Math.round(randomVerticalTranslation); + } + if (urlSearchParams.has('opacity')) { + paintColor = TRANSPARENT_PINK; + } + if (urlSearchParams.has('rotate')) { + randomRotation = (Math.random() - 0.5) / 20; + } + + skcanvas.clear(CanvasKit.WHITE); + for (const [path, color] of svgPathAndFillColorPairs) { + path.transform([Math.cos(randomRotation), -Math.sin(randomRotation), randomHorizontalTranslation, + Math.sin(randomRotation), Math.cos(randomRotation), randomVerticalTranslation, + 0, 0, 1 ]); + paint.setColor(paintColor); + skcanvas.drawPath(path, paint); + } + surface.flush(); + + // Record perf data: measure frame times, memory usage + const currentFrameTimeMs = performance.now(); + frameTimesMs[currentFrameNumber] = currentFrameTimeMs - previousFrameTimeMs; + previousFrameTimeMs = currentFrameTimeMs; + + resourceCacheUsageBytes[currentFrameNumber] = grContext.getResourceCacheUsageBytes(); + usedJSHeapSizesBytes[currentFrameNumber] = window.performance.memory.totalJSHeapSize; + currentFrameNumber++; + + const timeSinceStart = performance.now() - startTimeMs; + if (currentFrameNumber >= MAX_FRAMES || timeSinceStart >= MAX_SAMPLE_MS) { + window._perfData = { + frames_ms: Array.from(frameTimesMs).slice(0, currentFrameNumber), + resourceCacheUsage_bytes: Array.from(resourceCacheUsageBytes).slice(0, currentFrameNumber), + usedJSHeapSizes_bytes: Array.from(usedJSHeapSizesBytes).slice(0, currentFrameNumber), + }; + window._perfDone = true; + return; + } + window.requestAnimationFrame(drawFrame); + } + window.requestAnimationFrame(drawFrame); + }); + + console.log('Perf is ready'); + window._perfReady = true; + } + + function svgToPathAndFillColorPairs(svgElement, CanvasKit) { + const pathElements = Array.from(svgElement.getElementsByTagName('path')); + return pathElements.map((path) => [ + CanvasKit.MakePathFromSVGString(path.getAttribute("d")), + CanvasKit.parseColorString(path.getAttribute("fill")??'#000000') + ]); + } + + function getSurface(CanvasKit) { + let surface; + if (window.location.hash.indexOf('gpu') !== -1) { + surface = CanvasKit.MakeWebGLCanvasSurface('complex-path'); + if (!surface) { + window._error = 'Could not make GPU surface'; + return null; + } + let c = document.getElementById('complex-path'); + // If CanvasKit was unable to instantiate a WebGL context, it will fallback + // to CPU and add a ck-replaced class to the canvas element. + if (c.classList.contains('ck-replaced')) { + window._error = 'fell back to CPU'; + return null; + } + } else { + surface = CanvasKit.MakeSWCanvasSurface('complex-path'); + if (!surface) { + window._error = 'Could not make CPU surface'; + return null; + } + } + return surface; + } + </script> +</body> +</html>
\ No newline at end of file diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path_translate_assets/car.svg b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path_translate_assets/car.svg new file mode 100644 index 00000000000..8fb17a713bf --- /dev/null +++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path_translate_assets/car.svg @@ -0,0 +1,5155 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="1901" + height="1018" + viewBox="0 0 1901 1018" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.44+devel" + version="1.0" + sodipodi:docbase="/home/d/ink/inkscape/share/examples" + sodipodi:docname="gallardo.svgz" + inkscape:export-filename="C:\Documents and Settings\MichaelG\My Documents\My Pictures\gallardo.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + inkscape:output_extension="org.inkscape.output.svgz.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <linearGradient + id="linearGradient3931"> + <stop + style="stop-color:#ebf3ff;stop-opacity:1;" + offset="0" + id="stop3933" /> + <stop + id="stop3935" + offset="0.5" + style="stop-color:#cfeefe;stop-opacity:1;" /> + <stop + style="stop-color:#8face1;stop-opacity:1;" + offset="0.75" + id="stop3937" /> + <stop + style="stop-color:#9caedc;stop-opacity:1" + offset="1" + id="stop3940" /> + </linearGradient> + <linearGradient + id="linearGradient6405"> + <stop + id="stop6407" + offset="0" + style="stop-color:#434343;stop-opacity:1" /> + <stop + style="stop-color:#69606d;stop-opacity:0;" + offset="0.78571427" + id="stop6409" /> + <stop + id="stop6411" + offset="1" + style="stop-color:#705f78;stop-opacity:0" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4263"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop4265" /> + <stop + style="stop-color:black;stop-opacity:0.26160339" + offset="1" + id="stop4267" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3838"> + <stop + style="stop-color:#212152;stop-opacity:1" + offset="0" + id="stop3840" /> + <stop + style="stop-color:#272768;stop-opacity:0;" + offset="1" + id="stop3842" /> + </linearGradient> + <linearGradient + id="linearGradient3877"> + <stop + id="stop3879" + offset="0" + style="stop-color:#5b75ac;stop-opacity:1" /> + <stop + id="stop3881" + offset="1" + style="stop-color:#829acf;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5016"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop5018" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop5020" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5002"> + <stop + style="stop-color:#99bcfa;stop-opacity:1;" + offset="0" + id="stop5004" /> + <stop + style="stop-color:#20376c;stop-opacity:1" + offset="1" + id="stop5006" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4970"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop4972" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop4974" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2980"> + <stop + style="stop-color:#19274c;stop-opacity:1" + offset="0" + id="stop2982" /> + <stop + style="stop-color:#7b92af;stop-opacity:1" + offset="1" + id="stop2984" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3747"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop3749" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop3751" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2954" + id="linearGradient4332" + gradientUnits="userSpaceOnUse" + x1="814.44556" + y1="742.2583" + x2="814.44556" + y2="699.93915" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3937" + id="linearGradient4330" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.367696,0.367696)" + x1="809.74945" + y1="715.75433" + x2="822.82684" + y2="711.34198" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3771" + id="linearGradient4328" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,-0.357143,0.821429,258.463,86.94653)" + x1="815.54865" + y1="721.63739" + x2="812.54578" + y2="701.04614" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2957" + id="linearGradient4326" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.945605,-0.217581,0.40526,0.47818,-220.401,581.0172)" + x1="815.54865" + y1="721.63739" + x2="810.40088" + y2="701.04645" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3771" + id="linearGradient4324" + gradientUnits="userSpaceOnUse" + x1="815.54865" + y1="721.63739" + x2="810.40088" + y2="701.04645" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3937" + id="linearGradient4322" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-11.76626,14.70782)" + x1="812.69104" + y1="719.43127" + x2="822.82684" + y2="711.34198" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4316" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="793.18713" + y2="793.88776" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3771" + id="radialGradient4314" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.76434,-2.35869e-2,0.426816,1.801459,-928.0471,-507.7961)" + cx="819.57001" + cy="681.40497" + fx="819.57001" + fy="681.40497" + r="89.050735" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3146" + id="linearGradient4312" + gradientUnits="userSpaceOnUse" + x1="823.68597" + y1="611.11115" + x2="806.85175" + y2="711.99713" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3463" + id="radialGradient4310" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.402597,0,-270.1008)" + cx="828.16028" + cy="706.72321" + fx="828.16028" + fy="706.72321" + r="84.93766" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3422" + id="linearGradient4308" + gradientUnits="userSpaceOnUse" + x1="837.68555" + y1="796.52527" + x2="780.84125" + y2="572.90417" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3422" + id="linearGradient4306" + gradientUnits="userSpaceOnUse" + x1="799.76501" + y1="597.83502" + x2="814.95313" + y2="814.15497" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4286" + gradientUnits="userSpaceOnUse" + x1="823.10938" + y1="833.45209" + x2="823.10938" + y2="858.61041" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4284" + gradientUnits="userSpaceOnUse" + x1="912.13434" + y1="738.04584" + x2="892.15674" + y2="785.84998" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4282" + gradientUnits="userSpaceOnUse" + x1="751.09253" + y1="735" + x2="732.11664" + y2="745.52069" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4280" + gradientUnits="userSpaceOnUse" + x1="867.10388" + y1="601.625" + x2="850.70032" + y2="613.44067" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4278" + gradientUnits="userSpaceOnUse" + x1="743.77771" + y1="577.80316" + x2="760.22034" + y2="597.8407" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4276" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="771.66034" + y2="777.76068" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4274" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="771.66034" + y2="777.76068" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4272" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="771.66034" + y2="777.76068" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4270" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="771.66034" + y2="777.76068" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4268" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="771.66034" + y2="777.76068" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient4266" + gradientUnits="userSpaceOnUse" + x1="782.83337" + y1="799.42517" + x2="864.77716" + y2="577.03143" /> + <linearGradient + inkscape:collect="always" + id="linearGradient3937"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop3939" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop3941" /> + </linearGradient> + <linearGradient + id="linearGradient3771"> + <stop + style="stop-color:#808aa5;stop-opacity:1;" + offset="0" + id="stop3773" /> + <stop + style="stop-color:#363c4d;stop-opacity:1;" + offset="1" + id="stop3775" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3463"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop3465" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop3467" /> + </linearGradient> + <linearGradient + id="linearGradient3422"> + <stop + style="stop-color:#959db8;stop-opacity:1;" + offset="0" + id="stop3424" /> + <stop + id="stop3432" + offset="0.25" + style="stop-color:#d3d7e2;stop-opacity:1;" /> + <stop + id="stop3430" + offset="0.5" + style="stop-color:#566081;stop-opacity:1;" /> + <stop + style="stop-color:#bdc2d3;stop-opacity:1;" + offset="0.75" + id="stop3434" /> + <stop + id="stop3436" + offset="0.875" + style="stop-color:#959db8;stop-opacity:1;" /> + <stop + style="stop-color:#586284;stop-opacity:1;" + offset="1" + id="stop3426" /> + </linearGradient> + <linearGradient + id="linearGradient4018"> + <stop + style="stop-color:#272b3a;stop-opacity:1;" + offset="0" + id="stop4020" /> + <stop + id="stop4044" + offset="0.5" + style="stop-color:#8b97a4;stop-opacity:1;" /> + <stop + style="stop-color:white;stop-opacity:1;" + offset="1" + id="stop4022" /> + </linearGradient> + <linearGradient + id="linearGradient3611"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop3613" /> + <stop + id="stop3619" + offset="0.5" + style="stop-color:#7f7f7f;stop-opacity:0;" /> + <stop + style="stop-color:white;stop-opacity:1;" + offset="1" + id="stop3615" /> + </linearGradient> + <linearGradient + id="linearGradient3599"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop3601" /> + <stop + style="stop-color:#474747;stop-opacity:1;" + offset="1" + id="stop3603" /> + </linearGradient> + <linearGradient + id="linearGradient3347"> + <stop + style="stop-color:#434343;stop-opacity:0;" + offset="0" + id="stop3349" /> + <stop + id="stop3357" + offset="0.78571427" + style="stop-color:#69606d;stop-opacity:0;" /> + <stop + style="stop-color:#705f78;stop-opacity:1;" + offset="1" + id="stop3351" /> + </linearGradient> + <linearGradient + id="linearGradient3337"> + <stop + style="stop-color:#1d1d1d;stop-opacity:1;" + offset="0" + id="stop3339" /> + <stop + style="stop-color:#483030;stop-opacity:1;" + offset="1" + id="stop3342" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3660"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop3662" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop3664" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3651"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop3653" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop3655" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3602"> + <stop + style="stop-color:#485276;stop-opacity:1;" + offset="0" + id="stop3604" /> + <stop + style="stop-color:#485276;stop-opacity:0;" + offset="1" + id="stop3606" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3592"> + <stop + style="stop-color:#141921;stop-opacity:1;" + offset="0" + id="stop3594" /> + <stop + style="stop-color:#141921;stop-opacity:0;" + offset="1" + id="stop3596" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3582"> + <stop + style="stop-color:#aaa4b9;stop-opacity:1;" + offset="0" + id="stop3584" /> + <stop + style="stop-color:#aaa4b9;stop-opacity:0;" + offset="1" + id="stop3586" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3556"> + <stop + style="stop-color:#506485;stop-opacity:1;" + offset="0" + id="stop3558" /> + <stop + style="stop-color:#506485;stop-opacity:0;" + offset="1" + id="stop3560" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3535"> + <stop + style="stop-color:#393e68;stop-opacity:1;" + offset="0" + id="stop3537" /> + <stop + style="stop-color:#393e68;stop-opacity:0;" + offset="1" + id="stop3539" /> + </linearGradient> + <linearGradient + id="linearGradient3512"> + <stop + id="stop3514" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + style="stop-color:#d8e6fd;stop-opacity:1;" + offset="0.5" + id="stop3518" /> + <stop + id="stop3516" + offset="1" + style="stop-color:#9dc1f9;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3495"> + <stop + style="stop-color:#181e34;stop-opacity:1;" + offset="0" + id="stop3497" /> + <stop + style="stop-color:#181e34;stop-opacity:0;" + offset="1" + id="stop3499" /> + </linearGradient> + <linearGradient + id="linearGradient3483"> + <stop + style="stop-color:#7b7ecb;stop-opacity:1;" + offset="0" + id="stop3485" /> + <stop + style="stop-color:#969eba;stop-opacity:1;" + offset="1" + id="stop3487" /> + </linearGradient> + <linearGradient + id="linearGradient3475"> + <stop + style="stop-color:#eef0f7;stop-opacity:1;" + offset="0" + id="stop3477" /> + <stop + style="stop-color:#bec0f8;stop-opacity:1;" + offset="1" + id="stop3479" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3452"> + <stop + style="stop-color:#6072b2;stop-opacity:1;" + offset="0" + id="stop3454" /> + <stop + style="stop-color:#6072b2;stop-opacity:0;" + offset="1" + id="stop3456" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3419"> + <stop + style="stop-color:#b8bce6;stop-opacity:1;" + offset="0" + id="stop3421" /> + <stop + style="stop-color:#b8bce6;stop-opacity:0;" + offset="1" + id="stop3423" /> + </linearGradient> + <linearGradient + id="linearGradient3371"> + <stop + id="stop3373" + offset="0" + style="stop-color:#1d44a6;stop-opacity:1;" /> + <stop + id="stop3375" + offset="1" + style="stop-color:#2d82df;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3361"> + <stop + style="stop-color:#818181;stop-opacity:1;" + offset="0" + id="stop3363" /> + <stop + style="stop-color:#b6b6b6;stop-opacity:1;" + offset="1" + id="stop3365" /> + </linearGradient> + <linearGradient + id="linearGradient3293"> + <stop + style="stop-color:#7987b8;stop-opacity:1;" + offset="0" + id="stop3295" /> + <stop + style="stop-color:#2a324f;stop-opacity:1;" + offset="1" + id="stop3297" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3276"> + <stop + style="stop-color:#000b17;stop-opacity:1;" + offset="0" + id="stop3278" /> + <stop + style="stop-color:#000b17;stop-opacity:0;" + offset="1" + id="stop3280" /> + </linearGradient> + <linearGradient + id="linearGradient3232"> + <stop + style="stop-color:#a7d0fe;stop-opacity:1;" + offset="0" + id="stop3235" /> + <stop + style="stop-color:#7987b8;stop-opacity:1;" + offset="1" + id="stop3237" /> + </linearGradient> + <linearGradient + id="linearGradient3221"> + <stop + style="stop-color:#5b78a4;stop-opacity:1;" + offset="0" + id="stop3224" /> + <stop + style="stop-color:#4b5587;stop-opacity:1;" + offset="1" + id="stop3226" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3208"> + <stop + style="stop-color:#7b90c5;stop-opacity:1;" + offset="0" + id="stop3210" /> + <stop + style="stop-color:#7b90c5;stop-opacity:0;" + offset="1" + id="stop3212" /> + </linearGradient> + <linearGradient + id="linearGradient3314"> + <stop + style="stop-color:#464e64;stop-opacity:1;" + offset="0" + id="stop3316" /> + <stop + style="stop-color:#273251;stop-opacity:1;" + offset="1" + id="stop3318" /> + </linearGradient> + <linearGradient + id="linearGradient3254"> + <stop + style="stop-color:#0e0d13;stop-opacity:1;" + offset="0" + id="stop3257" /> + <stop + style="stop-color:#45405e;stop-opacity:1;" + offset="1" + id="stop3259" /> + </linearGradient> + <linearGradient + id="linearGradient3197"> + <stop + style="stop-color:#6b83ac;stop-opacity:1;" + offset="0" + id="stop3199" /> + <stop + style="stop-color:#899cbd;stop-opacity:1;" + offset="1" + id="stop3201" /> + </linearGradient> + <linearGradient + id="linearGradient3172"> + <stop + style="stop-color:#556c95;stop-opacity:1;" + offset="0" + id="stop3174" /> + <stop + style="stop-color:#242e3f;stop-opacity:1;" + offset="1" + id="stop3176" /> + </linearGradient> + <linearGradient + id="linearGradient3725"> + <stop + style="stop-color:#312e43;stop-opacity:1;" + offset="0" + id="stop3727" /> + <stop + style="stop-color:#1d1b28;stop-opacity:1;" + offset="1" + id="stop3729" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3715"> + <stop + style="stop-color:#6f7790;stop-opacity:1;" + offset="0" + id="stop3717" /> + <stop + style="stop-color:#6f7790;stop-opacity:0;" + offset="1" + id="stop3719" /> + </linearGradient> + <linearGradient + id="linearGradient3688"> + <stop + style="stop-color:#b3d2fe;stop-opacity:1;" + offset="0" + id="stop3690" /> + <stop + id="stop3696" + offset="0.5" + style="stop-color:#e0edff;stop-opacity:1;" /> + <stop + style="stop-color:#cbeafa;stop-opacity:1;" + offset="1" + id="stop3692" /> + </linearGradient> + <linearGradient + id="linearGradient3674"> + <stop + style="stop-color:#9ea9cd;stop-opacity:1;" + offset="0" + id="stop3676" /> + <stop + style="stop-color:#b3d2fe;stop-opacity:1;" + offset="1" + id="stop3678" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3664"> + <stop + style="stop-color:#6681c4;stop-opacity:1;" + offset="0" + id="stop3666" /> + <stop + style="stop-color:#6681c4;stop-opacity:0;" + offset="1" + id="stop3668" /> + </linearGradient> + <linearGradient + id="linearGradient2747"> + <stop + style="stop-color:#c0faff;stop-opacity:1;" + offset="0" + id="stop2749" /> + <stop + style="stop-color:#f9ffff;stop-opacity:1;" + offset="1" + id="stop2751" /> + </linearGradient> + <linearGradient + id="linearGradient3261"> + <stop + style="stop-color:#8b9fdc;stop-opacity:1;" + offset="0" + id="stop3263" /> + <stop + style="stop-color:#354572;stop-opacity:1;" + offset="1" + id="stop3265" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3241"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop3243" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop3245" /> + </linearGradient> + <linearGradient + id="linearGradient3229"> + <stop + style="stop-color:#8390d3;stop-opacity:1;" + offset="0" + id="stop3231" /> + <stop + style="stop-color:#253068;stop-opacity:1;" + offset="1" + id="stop3233" /> + </linearGradient> + <linearGradient + id="linearGradient3209"> + <stop + style="stop-color:#ebf1ff;stop-opacity:1;" + offset="0" + id="stop3211" /> + <stop + id="stop3269" + offset="0.2109797" + style="stop-color:#99bbd2;stop-opacity:1;" /> + <stop + style="stop-color:#506d8e;stop-opacity:1;" + offset="0.64264262" + id="stop4996" /> + <stop + id="stop4998" + offset="0.78125" + style="stop-color:#4f6586;stop-opacity:1;" /> + <stop + style="stop-color:#20376c;stop-opacity:1;" + offset="1" + id="stop3213" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3190"> + <stop + style="stop-color:#a6bee0;stop-opacity:1;" + offset="0" + id="stop3192" /> + <stop + style="stop-color:#a6bee0;stop-opacity:0;" + offset="1" + id="stop3194" /> + </linearGradient> + <linearGradient + id="linearGradient3157"> + <stop + style="stop-color:#214673;stop-opacity:1;" + offset="0" + id="stop3159" /> + <stop + style="stop-color:#7e8cbe;stop-opacity:1;" + offset="1" + id="stop3161" /> + </linearGradient> + <linearGradient + id="linearGradient3059"> + <stop + style="stop-color:#a5c1ff;stop-opacity:1;" + offset="0" + id="stop3061" /> + <stop + id="stop3071" + offset="0.34999999" + style="stop-color:#8bbbff;stop-opacity:1;" /> + <stop + id="stop3069" + offset="0.56" + style="stop-color:#96d5ff;stop-opacity:1;" /> + <stop + style="stop-color:#f0f5ff;stop-opacity:1;" + offset="1" + id="stop3063" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3049"> + <stop + style="stop-color:#19274c;stop-opacity:1;" + offset="0" + id="stop3051" /> + <stop + style="stop-color:#19274c;stop-opacity:0;" + offset="1" + id="stop3053" /> + </linearGradient> + <linearGradient + id="linearGradient3033"> + <stop + style="stop-color:#a8bbc8;stop-opacity:1;" + offset="0" + id="stop3035" /> + <stop + id="stop3041" + offset="0.25" + style="stop-color:#223261;stop-opacity:1;" /> + <stop + style="stop-color:#3d4c75;stop-opacity:1;" + offset="0.5" + id="stop3043" /> + <stop + id="stop3045" + offset="0.75" + style="stop-color:#3d528b;stop-opacity:1;" /> + <stop + style="stop-color:#9caedf;stop-opacity:1;" + offset="1" + id="stop3037" /> + </linearGradient> + <linearGradient + id="linearGradient3015"> + <stop + style="stop-color:#a7bffb;stop-opacity:1;" + offset="0" + id="stop3017" /> + <stop + id="stop3026" + offset="0.5" + style="stop-color:#a7cffb;stop-opacity:1;" /> + <stop + style="stop-color:#dcf3fe;stop-opacity:1;" + offset="1" + id="stop3019" /> + </linearGradient> + <linearGradient + id="linearGradient3099"> + <stop + style="stop-color:#9dc1ff;stop-opacity:1;" + offset="0" + id="stop3101" /> + <stop + id="stop3107" + offset="0.60714287" + style="stop-color:#93b4f3;stop-opacity:1;" /> + <stop + style="stop-color:#cbeaff;stop-opacity:1;" + offset="1" + id="stop3103" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3068"> + <stop + style="stop-color:#aeccef;stop-opacity:1;" + offset="0" + id="stop3070" /> + <stop + style="stop-color:#aeccef;stop-opacity:0;" + offset="1" + id="stop3072" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2979"> + <stop + style="stop-color:#8c99c6;stop-opacity:1;" + offset="0" + id="stop2981" /> + <stop + style="stop-color:#8c99c6;stop-opacity:0;" + offset="1" + id="stop2983" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3056"> + <stop + style="stop-color:#4b72a9;stop-opacity:1;" + offset="0" + id="stop3058" /> + <stop + style="stop-color:#4b72a9;stop-opacity:0;" + offset="1" + id="stop3060" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3046"> + <stop + style="stop-color:#0b1e37;stop-opacity:1;" + offset="0" + id="stop3048" /> + <stop + style="stop-color:#0b1e37;stop-opacity:0;" + offset="1" + id="stop3050" /> + </linearGradient> + <linearGradient + id="linearGradient3032"> + <stop + style="stop-color:#27528b;stop-opacity:1;" + offset="0" + id="stop3034" /> + <stop + style="stop-color:#0a3064;stop-opacity:1;" + offset="1" + id="stop3036" /> + </linearGradient> + <linearGradient + id="linearGradient3010"> + <stop + style="stop-color:#c5c8ff;stop-opacity:0;" + offset="0" + id="stop3012" /> + <stop + id="stop3030" + offset="0.5" + style="stop-color:#91d3ff;stop-opacity:0.72156864;" /> + <stop + style="stop-color:#e0fdff;stop-opacity:1;" + offset="1" + id="stop3014" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3000"> + <stop + style="stop-color:#34628c;stop-opacity:1;" + offset="0" + id="stop3002" /> + <stop + style="stop-color:#34628c;stop-opacity:0;" + offset="1" + id="stop3004" /> + </linearGradient> + <linearGradient + id="linearGradient2972"> + <stop + style="stop-color:#7d8da5;stop-opacity:1;" + offset="0" + id="stop2974" /> + <stop + style="stop-color:#5f6f89;stop-opacity:1;" + offset="1" + id="stop2976" /> + </linearGradient> + <linearGradient + id="linearGradient2954"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop2956" /> + <stop + id="stop2962" + offset="0.5" + style="stop-color:#b8b8b8;stop-opacity:1;" /> + <stop + style="stop-color:#2a2a2a;stop-opacity:1;" + offset="1" + id="stop2958" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2938"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop2940" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop2942" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2916"> + <stop + style="stop-color:#353c47;stop-opacity:1;" + offset="0" + id="stop2918" /> + <stop + style="stop-color:#353c47;stop-opacity:0;" + offset="1" + id="stop2920" /> + </linearGradient> + <linearGradient + id="linearGradient3332"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop3334" /> + <stop + id="stop3341" + offset="0.5535714" + style="stop-color:black;stop-opacity:1;" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop3336" /> + </linearGradient> + <linearGradient + id="linearGradient3317"> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop3319" /> + <stop + id="stop3325" + offset="0.5" + style="stop-color:black;stop-opacity:0.14432989;" /> + <stop + style="stop-color:black;stop-opacity:1;" + offset="1" + id="stop3321" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3931" + id="linearGradient3288" + x1="321.67255" + y1="442.76962" + x2="325.79459" + y2="409.21478" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,50)" /> + <linearGradient + id="linearGradient3290"> + <stop + id="stop3292" + offset="0" + style="stop-color:#ebf3ff;stop-opacity:1;" /> + <stop + style="stop-color:#cfeefe;stop-opacity:1;" + offset="0.5" + id="stop3294" /> + <stop + id="stop3298" + offset="0.75" + style="stop-color:#8face1;stop-opacity:1;" /> + <stop + id="stop3296" + offset="1" + style="stop-color:#8aa3e1;stop-opacity:1;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3262"> + <stop + style="stop-color:#42495a;stop-opacity:1;" + offset="0" + id="stop3264" /> + <stop + style="stop-color:#42495a;stop-opacity:0;" + offset="1" + id="stop3266" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3252"> + <stop + style="stop-color:#afc3e6;stop-opacity:1;" + offset="0" + id="stop3254" /> + <stop + style="stop-color:#afc3e6;stop-opacity:0;" + offset="1" + id="stop3256" /> + </linearGradient> + <linearGradient + id="linearGradient3240"> + <stop + style="stop-color:#8c99c6;stop-opacity:1;" + offset="0" + id="stop3242" /> + <stop + style="stop-color:#86a3ea;stop-opacity:1;" + offset="1" + id="stop3244" /> + </linearGradient> + <linearGradient + id="linearGradient3230"> + <stop + style="stop-color:#b0ddfa;stop-opacity:1;" + offset="0" + id="stop3232" /> + <stop + style="stop-color:#e5f5ff;stop-opacity:1;" + offset="1" + id="stop3234" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3214"> + <stop + style="stop-color:#9ea9cd;stop-opacity:1;" + offset="0" + id="stop3216" /> + <stop + style="stop-color:#9ea9cd;stop-opacity:0;" + offset="1" + id="stop3218" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3200"> + <stop + style="stop-color:#8197da;stop-opacity:1;" + offset="0" + id="stop3202" /> + <stop + style="stop-color:#232f54;stop-opacity:1" + offset="1" + id="stop3204" /> + </linearGradient> + <linearGradient + id="linearGradient3186"> + <stop + style="stop-color:#a9c7fd;stop-opacity:1;" + offset="0" + id="stop3188" /> + <stop + style="stop-color:#c7ebfe;stop-opacity:1;" + offset="1" + id="stop3190" /> + </linearGradient> + <linearGradient + id="linearGradient3176"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop3178" /> + <stop + style="stop-color:white;stop-opacity:0.41237113;" + offset="1" + id="stop3180" /> + </linearGradient> + <linearGradient + id="linearGradient3168"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop3170" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop3172" /> + </linearGradient> + <linearGradient + id="linearGradient3156"> + <stop + style="stop-color:#ebf3ff;stop-opacity:1;" + offset="0" + id="stop3158" /> + <stop + id="stop3164" + offset="0.5" + style="stop-color:#cfeefe;stop-opacity:1;" /> + <stop + style="stop-color:#b3d2fe;stop-opacity:1;" + offset="1" + id="stop3160" /> + </linearGradient> + <linearGradient + id="linearGradient3146"> + <stop + style="stop-color:#687586;stop-opacity:1;" + offset="0" + id="stop3148" /> + <stop + style="stop-color:#8ba7cb;stop-opacity:1;" + offset="1" + id="stop3150" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3126"> + <stop + style="stop-color:#ff9739;stop-opacity:1;" + offset="0" + id="stop3128" /> + <stop + style="stop-color:#ff9739;stop-opacity:0;" + offset="1" + id="stop3130" /> + </linearGradient> + <linearGradient + id="linearGradient3108"> + <stop + style="stop-color:#ffaa57;stop-opacity:1;" + offset="0" + id="stop3110" /> + <stop + style="stop-color:#c35c00;stop-opacity:0.76288658;" + offset="1" + id="stop3112" /> + </linearGradient> + <linearGradient + id="linearGradient3062"> + <stop + style="stop-color:#444;stop-opacity:1;" + offset="0" + id="stop3064" /> + <stop + style="stop-color:#6e6e6e;stop-opacity:1;" + offset="1" + id="stop3066" /> + </linearGradient> + <linearGradient + id="linearGradient3003"> + <stop + style="stop-color:#6b96c6;stop-opacity:1;" + offset="0" + id="stop3005" /> + <stop + id="stop3044" + offset="0.29464287" + style="stop-color:#84b2da;stop-opacity:1;" /> + <stop + id="stop3013" + offset="0.5" + style="stop-color:#9eceee;stop-opacity:1;" /> + <stop + style="stop-color:#cedcec;stop-opacity:1;" + offset="1" + id="stop3007" /> + </linearGradient> + <linearGradient + id="linearGradient2993"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop2995" /> + <stop + style="stop-color:#9dc1f9;stop-opacity:1;" + offset="1" + id="stop2997" /> + </linearGradient> + <linearGradient + id="linearGradient2957"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop2959" /> + <stop + id="stop3088" + offset="0.5" + style="stop-color:#c1d7fc;stop-opacity:0.79381442;" /> + <stop + style="stop-color:#c1d7fc;stop-opacity:0;" + offset="1" + id="stop2961" /> + </linearGradient> + <linearGradient + id="linearGradient2848"> + <stop + style="stop-color:#5b6879;stop-opacity:1;" + offset="0" + id="stop2850" /> + <stop + style="stop-color:#6c7c90;stop-opacity:1;" + offset="1" + id="stop2852" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2848" + id="linearGradient2854" + x1="605.78571" + y1="693.82843" + x2="679.82141" + y2="416.68555" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2957" + id="linearGradient2963" + x1="1059.4688" + y1="542.11444" + x2="1008.7902" + y2="639.25726" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2993" + id="linearGradient2999" + x1="81.606529" + y1="264.65201" + x2="611.91901" + y2="264.65201" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3003" + id="radialGradient3011" + cx="575.95508" + cy="20.347525" + fx="575.95508" + fy="20.347525" + r="240.65582" + gradientTransform="matrix(1.330288,0.722981,-0.410079,0.754547,-166.9089,-302.4274)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3062" + id="linearGradient3086" + x1="538.01337" + y1="286.5759" + x2="618.42566" + y2="118.00446" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3108" + id="linearGradient3140" + gradientUnits="userSpaceOnUse" + x1="989.28571" + y1="1700.8572" + x2="990.71429" + y2="1690.8738" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3126" + id="linearGradient3142" + gradientUnits="userSpaceOnUse" + x1="995.00024" + y1="1697.8326" + x2="992.47485" + y2="1687.7312" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3146" + id="linearGradient3152" + x1="682.85712" + y1="509.42856" + x2="716.42859" + y2="397.57141" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3156" + id="radialGradient3162" + cx="574.18042" + cy="1347.757" + fx="574.18042" + fy="1347.757" + r="191.53386" + gradientTransform="matrix(1,0,0,0.55348,-14.28574,-379.0895)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3176" + id="radialGradient3182" + cx="1281.3784" + cy="1089.6825" + fx="1281.3784" + fy="1089.6825" + r="462.13467" + gradientTransform="matrix(0.418567,1.138515e-8,0,0.199982,745.0363,502.0475)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3186" + id="linearGradient3192" + x1="378.57144" + y1="1178" + x2="281.3913" + y2="1148" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-2.857144,-958.5714)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3186" + id="linearGradient3196" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-7.857129,-957.8571)" + x1="378.57144" + y1="1178" + x2="294.96271" + y2="1148" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3200" + id="linearGradient3206" + x1="302.69244" + y1="1206.0665" + x2="299.28571" + y2="1189.4286" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.285714,-1016.857)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3214" + id="linearGradient3220" + x1="312.85715" + y1="1122.2858" + x2="297.34143" + y2="1120.8572" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(5.285716,-959.1429)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3230" + id="linearGradient3236" + x1="260" + y1="1203" + x2="185" + y2="1170.1428" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(2.14286,-1043.571)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3240" + id="linearGradient3246" + x1="235.71429" + y1="1084.4683" + x2="237.14285" + y2="1102.2856" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.857136,-966.2856)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3252" + id="linearGradient3258" + x1="-265.71429" + y1="655.14288" + x2="105.71429" + y2="898" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(343.7143,-513.2857)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3262" + id="linearGradient3268" + x1="660.63977" + y1="714.95422" + x2="661.38232" + y2="527.64288" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3156" + id="linearGradient3310" + x1="198.10001" + y1="362.28571" + x2="276.1857" + y2="362.28571" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(20,0)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3317" + id="radialGradient3328" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.681717,-0.196991,1.189962,4.118073,-340.6222,-1084.458)" + cx="300.60941" + cy="366.53375" + fx="300.60941" + fy="366.53375" + r="33.840111" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3332" + id="radialGradient3343" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0.43825,-0.199228,0.4546,60.32876,28.03149)" + cx="315.1676" + cy="302.81201" + fx="315.1676" + fy="302.81201" + r="154.43303" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3290" + id="linearGradient2024" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-36.21248,-969.3161)" + x1="236.21936" + y1="1114.7728" + x2="234.11238" + y2="1072.989" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2916" + id="radialGradient2922" + cx="454.64285" + cy="610.14288" + fx="454.64285" + fy="610.14288" + r="249.64285" + gradientTransform="matrix(1,0,0,0.549356,0,274.9571)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2938" + id="linearGradient2944" + x1="306.85715" + y1="266.8215" + x2="357.2941" + y2="227.53578" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2954" + id="radialGradient2960" + cx="342.5" + cy="424.42856" + fx="342.5" + fy="424.42856" + r="32.785721" + gradientTransform="matrix(2.109187,-1.212215e-6,2.571153e-6,4.473662,-379.8976,-1474.32)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2972" + id="linearGradient2978" + x1="148.61224" + y1="381.59784" + x2="108.62619" + y2="201.59782" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3032" + id="linearGradient3136" + gradientUnits="userSpaceOnUse" + x1="1105.9832" + y1="1614.0305" + x2="917.41821" + y2="1754.0305" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3046" + id="linearGradient3138" + gradientUnits="userSpaceOnUse" + x1="930" + y1="1780" + x2="1002" + y2="1698" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3000" + id="linearGradient3141" + gradientUnits="userSpaceOnUse" + x1="1202" + y1="1738" + x2="1226.4431" + y2="1812.2965" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3010" + id="linearGradient3143" + gradientUnits="userSpaceOnUse" + x1="1340.5737" + y1="1702.1013" + x2="1381.4182" + y2="1632.1013" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3056" + id="linearGradient3145" + gradientUnits="userSpaceOnUse" + x1="1140" + y1="1753" + x2="1128" + y2="1771" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2979" + id="linearGradient2985" + x1="72.359482" + y1="174.41611" + x2="87.939209" + y2="175.18224" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3068" + id="linearGradient3074" + x1="324.92596" + y1="477.6283" + x2="340.82547" + y2="440.29376" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3099" + id="linearGradient3177" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-90)" + x1="898" + y1="1078" + x2="1830" + y2="1237.4438" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2957" + id="linearGradient3179" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-450)" + x1="1035" + y1="1524" + x2="1377" + y2="1544" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2957" + id="linearGradient3181" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-90)" + x1="1258" + y1="939" + x2="1152" + y2="1126.6492" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2957" + id="linearGradient3183" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(312,-152)" + x1="1255" + y1="976" + x2="1234.5" + y2="1155" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3168" + id="linearGradient3185" + gradientUnits="userSpaceOnUse" + x1="1491" + y1="922" + x2="1643" + y2="1000" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3015" + id="radialGradient3028" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,2.342884e-7,-2.223753e-7,0.949152,9.885316e-5,-47.39676)" + cx="686.60065" + cy="439.31793" + fx="686.60065" + fy="439.31793" + r="83.438599" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3059" + id="radialGradient3083" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.384977,-5.035681e-8,2.308549e-8,0.63493,-225.5372,145.4852)" + cx="595.03033" + cy="230.00166" + fx="595.03033" + fy="230.00166" + r="75.30687" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3049" + id="linearGradient3088" + gradientUnits="userSpaceOnUse" + x1="612.35449" + y1="324.73068" + x2="624.37524" + y2="328.97333" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3033" + id="linearGradient3091" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.414207,0.707104)" + x1="599.91406" + y1="356.82278" + x2="625.0824" + y2="363.18677" /> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3321"> + <path + style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 973.22231,1494.6884 C 980.29341,1498.729 1119.1893,1603.7849 1134.3416,1615.9067 C 1149.4938,1628.0285 1253.5396,1719.9524 1262.6309,1731.0641 C 1341.4228,1729.0438 1391.9305,1720.9626 1391.9305,1720.9626 C 1391.9305,1720.9626 1264.6512,1621.9676 1227.2756,1597.7239 C 1189.9,1573.4803 1111.1081,1524.993 1101.0065,1518.932 C 1090.905,1512.8711 1067.6715,1504.7899 1057.57,1503.7798 C 1047.4684,1502.7696 973.22231,1494.6884 973.22231,1494.6884 z " + sodipodi:nodetypes="csccsssc" + id="path3317" /> + </clipPath> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3157" + id="linearGradient3340" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(37.44,-16.64)" + x1="1403.2334" + y1="1581.9968" + x2="1396.5648" + y2="1632.5245" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3190" + id="linearGradient3342" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(37.44,-16.64)" + x1="1155.48" + y1="1550.48" + x2="1355.08" + y2="1548.92" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3261" + id="linearGradient3344" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-216.9404,-73.53911)" + x1="1242.0754" + y1="1584.9865" + x2="1242.0754" + y2="1598.2235" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3209" + id="radialGradient3346" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.756834,0.11341,-6.052729e-2,0.937628,-578.1804,-19.99804)" + cx="1000.5534" + cy="1561.3158" + fx="1000.5534" + fy="1561.3158" + r="35.931072" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3209" + id="linearGradient3348" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(84.56997,2.206172)" + x1="952.80212" + y1="1525.0521" + x2="998.19037" + y2="1566.1309" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2954" + id="linearGradient3350" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.936508,0,0,0.936508,-23.6257,32.33626)" + x1="1125.1483" + y1="1587.5604" + x2="1123.6775" + y2="1597.8558" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3229" + id="radialGradient3352" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.609707,0.792627,-0.764705,0.588229,1686.72,-238.9536)" + cx="1146.1069" + cy="1620.7581" + fx="1146.1069" + fy="1620.7581" + r="18.752472" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3241" + id="radialGradient3354" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.0625,0,-101.0151)" + cx="1206.0413" + cy="1616.2406" + fx="1206.0413" + fy="1616.2406" + r="5.8831282" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3261" + id="linearGradient3356" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-132.3704,-14.70782)" + x1="1222.2198" + y1="1600.4297" + x2="1238.3984" + y2="1582.7803" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3209" + id="linearGradient3360" + gradientUnits="userSpaceOnUse" + x1="1107.2343" + y1="1611.0929" + x2="1179.0966" + y2="1611.0929" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2954" + id="linearGradient3362" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-11.03081,1.470782)" + x1="1125.1483" + y1="1587.5604" + x2="1123.6775" + y2="1597.8558" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3229" + id="radialGradient3364" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.609707,0.792627,-0.764705,0.588229,1686.72,-238.9536)" + cx="1146.1069" + cy="1620.7581" + fx="1146.1069" + fy="1620.7581" + r="18.752472" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3241" + id="radialGradient3366" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.0625,0,-101.0151)" + cx="1206.0413" + cy="1616.2406" + fx="1206.0413" + fy="1616.2406" + r="5.8831282" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2747" + id="linearGradient2753" + x1="354.45847" + y1="95.084274" + x2="356.66464" + y2="108.32131" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3059" + id="linearGradient3648" + x1="839.81659" + y1="215.09087" + x2="836.30078" + y2="153.0452" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,3.86443,0,-686.1124)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3240" + id="linearGradient3659" + x1="874.62329" + y1="121.56011" + x2="872.55994" + y2="147.18008" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-70)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3664" + id="linearGradient3670" + x1="606.31995" + y1="67.440048" + x2="674.95996" + y2="64.320045" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3674" + id="linearGradient3680" + x1="366.59244" + y1="186.64046" + x2="389.75723" + y2="203.92215" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3688" + id="linearGradient3694" + x1="131.56" + y1="129.32004" + x2="154.43999" + y2="135.56004" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3715" + id="linearGradient3721" + x1="240.25999" + y1="195.36005" + x2="327.83997" + y2="195.36005" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3725" + id="linearGradient3731" + x1="1095.7327" + y1="928.28229" + x2="1092.791" + y2="954.75635" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-40)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3172" + id="linearGradient3178" + x1="1483.5599" + y1="378.92004" + x2="1503.3199" + y2="386.72003" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-50)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3197" + id="linearGradient3203" + x1="1369.8599" + y1="336.50003" + x2="1482.9082" + y2="336.50003" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3172" + id="linearGradient3237" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-30,-50)" + x1="1529.6799" + y1="370.94003" + x2="1540.0798" + y2="370.16003" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3254" + id="linearGradient3263" + x1="1410.1123" + y1="317.54004" + x2="1411.583" + y2="326.91629" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3254" + id="linearGradient3267" + gradientUnits="userSpaceOnUse" + x1="1442.1018" + y1="321.95239" + x2="1506.8162" + y2="339.2341" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3254" + id="linearGradient3271" + gradientUnits="userSpaceOnUse" + x1="1288.0374" + y1="342.54333" + x2="1289.5081" + y2="358.90579" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3254" + id="linearGradient3275" + gradientUnits="userSpaceOnUse" + x1="1410.1123" + y1="327.46783" + x2="1413.0538" + y2="343.46259" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3254" + id="linearGradient3283" + gradientUnits="userSpaceOnUse" + x1="1065.2139" + y1="356.88348" + x2="1065.9492" + y2="373.79745" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3361" + id="linearGradient3367" + x1="1684.7999" + y1="745.52002" + x2="1694.1599" + y2="771.52002" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3371" + id="linearGradient3377" + gradientUnits="userSpaceOnUse" + x1="1684.7999" + y1="745.52002" + x2="1694.1599" + y2="771.52002" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3276" + id="linearGradient3380" + gradientUnits="userSpaceOnUse" + x1="1501.2399" + y1="852.64001" + x2="1506.4399" + y2="875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3314" + id="linearGradient3389" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-80)" + x1="1253.1063" + y1="937.10699" + x2="1841.4191" + y2="776.79175" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3232" + id="linearGradient3400" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-50)" + x1="1738.3599" + y1="851.60004" + x2="1528.7999" + y2="935.32001" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3208" + id="linearGradient3404" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-30,0)" + x1="1853.7999" + y1="719.00006" + x2="1847.5599" + y2="727.32001" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3221" + id="linearGradient3407" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-30,0)" + x1="1813.7599" + y1="765.79999" + x2="1807.5199" + y2="772.56" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3293" + id="linearGradient3411" + gradientUnits="userSpaceOnUse" + x1="1392.5599" + y1="917.12006" + x2="1314.5599" + y2="926.47998" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3254" + id="linearGradient3415" + x1="1640.6" + y1="754.88" + x2="1645.7999" + y2="789.72003" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3419" + id="linearGradient3425" + x1="1492.1084" + y1="880.48187" + x2="1510.4932" + y2="874.59875" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3475" + id="linearGradient3481" + x1="1499.6799" + y1="290.52005" + x2="1138.7999" + y2="91.360046" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,10)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3483" + id="linearGradient3489" + x1="1127.8799" + y1="219.26003" + x2="1477.3199" + y2="219.26003" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-20)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3495" + id="linearGradient3501" + x1="1499.6799" + y1="300.40002" + x2="1490.3199" + y2="293.90002" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3452" + id="linearGradient3504" + gradientUnits="userSpaceOnUse" + x1="1410.7599" + y1="202.90004" + x2="1402.96" + y2="209.14005" + gradientTransform="translate(-40,0)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3240" + id="linearGradient3507" + gradientUnits="userSpaceOnUse" + x1="1394.86" + y1="194.71004" + x2="1409.1599" + y2="214.47005" + gradientTransform="translate(-40,0)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3512" + id="linearGradient3510" + gradientUnits="userSpaceOnUse" + x1="1391.3207" + y1="192.83658" + x2="1397.4015" + y2="207.39658" + gradientTransform="translate(-40,0)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3452" + id="linearGradient3522" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-40,0)" + x1="1370.4598" + y1="179.65312" + x2="1381.8999" + y2="194.58005" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3556" + id="linearGradient3618" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-30,0)" + x1="1775.2339" + y1="510.5802" + x2="1781.8524" + y2="517.19873" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3535" + id="linearGradient3620" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-20,0)" + x1="1736.2582" + y1="481.16455" + x2="1757.0873" + y2="498.28571" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3582" + id="linearGradient3622" + gradientUnits="userSpaceOnUse" + x1="1593.2843" + y1="384.09293" + x2="1627.7415" + y2="384.09293" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3592" + id="linearGradient3624" + gradientUnits="userSpaceOnUse" + x1="1615.6399" + y1="384.64005" + x2="1607.84" + y2="378.40002" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3602" + id="linearGradient3626" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-30,0)" + x1="1626.0399" + y1="366.96002" + x2="1639.3199" + y2="356.30002" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3651" + id="radialGradient3670" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,-2.449946e-5,3.26177e-5,1.331364,-9.189301e-3,-92.83615)" + cx="337.68991" + cy="281.73077" + fx="337.69009" + fy="281.73068" + r="26.197193" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3660" + id="radialGradient3672" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.184925,0.291241,-0.244616,0.995229,5.770674,-93.65263)" + cx="337.68951" + cy="278.87592" + fx="337.68961" + fy="278.87601" + r="30.057995" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3617" + x1="782.83337" + y1="799.42517" + x2="864.77716" + y2="577.03143" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3623" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="771.66034" + y2="777.76068" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3627" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="771.66034" + y2="777.76068" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3631" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="771.66034" + y2="777.76068" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3635" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="771.66034" + y2="777.76068" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3640" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="771.66034" + y2="777.76068" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3852" + gradientUnits="userSpaceOnUse" + x1="751.09253" + y1="735" + x2="732.11664" + y2="745.52069" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3854" + gradientUnits="userSpaceOnUse" + x1="743.77771" + y1="577.80316" + x2="760.22034" + y2="597.8407" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3856" + gradientUnits="userSpaceOnUse" + x1="867.10388" + y1="601.625" + x2="850.70032" + y2="613.44067" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3858" + gradientUnits="userSpaceOnUse" + x1="912.13434" + y1="738.04584" + x2="892.15674" + y2="785.84998" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3860" + gradientUnits="userSpaceOnUse" + x1="823.10938" + y1="833.45209" + x2="823.10938" + y2="858.61041" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3422" + id="linearGradient3711" + x1="799.76501" + y1="597.83502" + x2="814.95313" + y2="814.15497" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3611" + id="linearGradient3769" + gradientUnits="userSpaceOnUse" + x1="911.05261" + y1="548.50476" + x2="793.18713" + y2="793.88776" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3771" + id="radialGradient3777" + cx="819.57001" + cy="681.40497" + fx="819.57001" + fy="681.40497" + r="89.050735" + gradientTransform="matrix(1.76434,-2.35869e-2,0.426816,1.801459,-928.0471,-507.7961)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3422" + id="linearGradient3823" + gradientUnits="userSpaceOnUse" + x1="837.68555" + y1="796.52527" + x2="780.84125" + y2="572.90417" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3463" + id="radialGradient3825" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.402597,0,-270.1008)" + cx="828.16028" + cy="706.72321" + fx="828.16028" + fy="706.72321" + r="84.93766" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3146" + id="linearGradient3827" + gradientUnits="userSpaceOnUse" + x1="823.68597" + y1="611.11115" + x2="806.85175" + y2="711.99713" /> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3833"> + <path + style="color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.03952456;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 959.1425,564.82625 C 958.9956,564.82625 958.8509,564.85409 958.705,564.8575 C 961.2854,564.93481 963.8642,565.51476 966.3925,566.57625 C 954.3198,572.32964 947.5839,591.64301 950.8613,614.57625 C 954.1381,637.50677 966.3961,656.82032 980.1113,662.57625 C 977.8891,663.63465 975.4796,664.21731 972.9238,664.295 C 973.0707,664.29841 973.2143,664.32625 973.3613,664.32625 C 990.1318,664.32625 1000.5676,642.0416 996.6425,614.57625 C 992.7175,587.11092 975.913,564.82627 959.1425,564.82625 z M 927.6738,573.51375 C 927.3371,573.69114 927.0075,573.89192 926.6738,574.07625 C 926.7234,578.55327 926.3543,582.80673 925.6113,586.7325 C 919.4843,593.25496 914.1454,601.22202 909.7363,610.38875 C 909.9551,610.48576 910.173,610.57965 910.3925,610.67 C 908.1368,611.726 905.6807,612.32482 903.08,612.38875 C 903.2563,612.39364 903.4348,612.38875 903.6113,612.38875 C 918.2837,612.38875 928.0972,595.68484 927.6738,573.51375 z M 907.1113,624.38875 C 906.9645,624.38875 906.8195,624.41667 906.6738,624.42 C 909.2562,624.49606 911.8301,625.06603 914.3613,626.1075 C 902.3011,631.72743 895.5873,650.58123 898.8613,672.9825 C 902.1345,695.37929 914.3493,714.23337 928.0488,719.8575 C 925.828,720.89233 923.4162,721.46813 920.8613,721.545 C 921.008,721.54833 921.152,721.57625 921.2988,721.57625 C 938.0517,721.57625 948.4696,699.81075 944.5488,672.9825 C 940.6278,646.15426 923.8643,624.38876 907.1113,624.38875 z M 1026.2363,642.76375 C 1026.0897,642.76375 1025.9444,642.79173 1025.7988,642.795 C 1028.3705,642.87004 1030.9296,643.43172 1033.455,644.45125 C 1020.76,650.25663 1013.6554,670.40681 1017.08,694.3575 C 1020.5058,718.3161 1033.3753,738.46594 1047.7363,744.26375 C 1045.4992,745.28674 1043.1036,745.84538 1040.5488,745.92 C 1040.6953,745.92327 1040.8397,745.95125 1040.9863,745.95125 C 1058.3863,745.95125 1069.1835,722.83766 1065.1113,694.3575 C 1061.0389,665.87733 1043.6362,642.76378 1026.2363,642.76375 z M 937.2363,739.1075 C 937.0865,739.1075 936.9475,739.1352 936.7988,739.13875 C 939.3775,739.21619 941.9607,739.7971 944.4863,740.8575 C 932.4421,746.61998 925.7459,765.90143 929.0175,788.795 C 932.291,811.70197 944.5042,831.01373 958.205,836.76375 C 955.9853,837.82106 953.5716,838.40468 951.0175,838.4825 C 951.1643,838.48591 951.3082,838.51375 951.455,838.51375 C 968.208,838.51375 978.6259,816.23209 974.705,788.795 C 970.7841,761.35788 953.9893,739.1075 937.2363,739.1075 z M 1010.0488,755.295 C 1009.9022,755.295 1009.7569,755.32298 1009.6113,755.32625 C 1012.183,755.40129 1014.7421,755.96297 1017.2675,756.9825 C 1004.5739,762.78928 997.4681,782.93954 1000.8925,806.88875 C 1004.3184,830.84781 1017.2187,850.99762 1031.58,856.795 C 1029.3699,857.80582 1026.9794,858.36539 1024.455,858.45125 C 1024.5702,858.45327 1024.6835,858.4825 1024.7988,858.4825 C 1042.1988,858.4825 1053.0273,835.36894 1048.955,806.88875 C 1044.8826,778.40858 1027.4487,755.295 1010.0488,755.295 z M 977.83,841.7325 C 977.6941,841.7325 977.5588,841.76088 977.4238,841.76375 C 979.983,841.84501 982.5447,842.42434 985.0488,843.45125 C 981.1116,845.30446 977.7441,848.58583 975.1113,852.92 C 984.5554,858.6399 994.3582,862.32873 1004.2363,863.63875 C 1001.955,863.95668 999.6342,864.13326 997.2675,864.17 C 1000.3379,864.17 1003.3416,863.95003 1006.2675,863.4825 C 998.9144,850.38461 988.3818,841.73252 977.83,841.7325 z " + id="path3535" + sodipodi:nodetypes="cccsccsscccccccsccccsccssccccsccssccccsccssccccsccssccccccccc" /> + </clipPath> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2954" + id="linearGradient3912" + gradientUnits="userSpaceOnUse" + x1="814.44556" + y1="742.2583" + x2="814.44556" + y2="699.93915" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3771" + id="linearGradient3917" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,-0.357143,0.821429,258.463,86.94653)" + x1="815.54865" + y1="721.63739" + x2="812.54578" + y2="701.04614" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2957" + id="linearGradient3921" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.945605,-0.217581,0.40526,0.47818,-220.401,581.0172)" + x1="815.54865" + y1="721.63739" + x2="810.40088" + y2="701.04645" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3771" + id="linearGradient3925" + gradientUnits="userSpaceOnUse" + x1="815.54865" + y1="721.63739" + x2="810.40088" + y2="701.04645" /> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3932"> + <path + transform="matrix(0.31032,0,5.178125e-2,0.352536,530.9291,471.175)" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" + sodipodi:rx="84.93766" + sodipodi:cy="670.89545" + sodipodi:cx="813.71014" + id="path3895" + style="opacity:1;color:black;fill:#fc0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8.22614479;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" /> + </clipPath> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3937" + id="linearGradient3943" + x1="809.74945" + y1="715.75433" + x2="822.82684" + y2="711.34198" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.367696,0.367696)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3937" + id="linearGradient3947" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-11.76626,14.70782)" + x1="812.69104" + y1="719.43127" + x2="822.82684" + y2="711.34198" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2830" + gradientUnits="userSpaceOnUse" + x1="909.77393" + y1="748.375" + x2="909.77393" + y2="799.96875" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3463" + id="linearGradient2833" + gradientUnits="userSpaceOnUse" + x1="812.26624" + y1="665.6875" + x2="820.95752" + y2="739.92749" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2851" + gradientUnits="userSpaceOnUse" + x1="812.26831" + y1="842.35431" + x2="814.00519" + y2="851.5625" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2855" + gradientUnits="userSpaceOnUse" + x1="733.65625" + y1="696.75964" + x2="744.9621" + y2="768.34375" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2858" + gradientUnits="userSpaceOnUse" + x1="847.7276" + y1="557.90625" + x2="894.53625" + y2="619.54285" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2861" + gradientUnits="userSpaceOnUse" + x1="752.10992" + y1="576.96875" + x2="752.10992" + y2="635.84375" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2864" + gradientUnits="userSpaceOnUse" + x1="761.6665" + y1="621.93903" + x2="759.14404" + y2="753.24847" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2867" + gradientUnits="userSpaceOnUse" + x1="773.9549" + y1="732.1875" + x2="782.68182" + y2="850.28198" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2870" + gradientUnits="userSpaceOnUse" + x1="858.75" + y1="748.375" + x2="858.01459" + y2="865.15143" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2873" + gradientUnits="userSpaceOnUse" + x1="879.375" + y1="642.57867" + x2="879.375" + y2="744.06262" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2876" + gradientUnits="userSpaceOnUse" + x1="813.66602" + y1="557.90625" + x2="813.41272" + y2="657.40625" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3599" + id="linearGradient2891" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.220779,0,0.203704,1.382716,-313.0049,-219.993)" + x1="819.11285" + y1="555.48511" + x2="793.83105" + y2="790.02881" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2905" + gradientUnits="userSpaceOnUse" + x1="909.77393" + y1="748.375" + x2="909.77393" + y2="799.96875" + gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3463" + id="linearGradient2908" + gradientUnits="userSpaceOnUse" + x1="812.26624" + y1="665.6875" + x2="820.95752" + y2="739.92749" + gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2926" + gradientUnits="userSpaceOnUse" + x1="812.26831" + y1="842.35431" + x2="814.00519" + y2="851.5625" + gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2929" + gradientUnits="userSpaceOnUse" + x1="733.65625" + y1="696.75964" + x2="744.9621" + y2="768.34375" + gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2932" + gradientUnits="userSpaceOnUse" + x1="847.7276" + y1="557.90625" + x2="879.375" + y2="601.625" + gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2935" + gradientUnits="userSpaceOnUse" + x1="752.10992" + y1="576.96875" + x2="752.10992" + y2="635.84375" + gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2939" + gradientUnits="userSpaceOnUse" + x1="761.6665" + y1="621.93903" + x2="759.14404" + y2="714.65625" + gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2942" + gradientUnits="userSpaceOnUse" + x1="773.9549" + y1="732.1875" + x2="782.68182" + y2="850.28198" + gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2945" + gradientUnits="userSpaceOnUse" + x1="858.75" + y1="748.375" + x2="858.01459" + y2="865.15143" + gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2948" + gradientUnits="userSpaceOnUse" + x1="879.375" + y1="642.57867" + x2="879.375" + y2="744.06262" + gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4018" + id="linearGradient2951" + gradientUnits="userSpaceOnUse" + x1="813.66602" + y1="557.90625" + x2="813.41272" + y2="657.40625" + gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3599" + id="linearGradient2966" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.598901,0,8.400139e-2,0.962206,-424.6396,-245.4445)" + x1="819.11285" + y1="555.48511" + x2="793.83105" + y2="790.02881" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3747" + id="radialGradient3753" + cx="900.87634" + cy="429.33759" + fx="900.87634" + fy="429.33759" + r="48.691078" + gradientTransform="matrix(1,0,0,0.848475,0,65.71196)" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + id="filter3933"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="22.417147" + id="feGaussianBlur3935" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3347" + id="radialGradient3380" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.336911,-6.393033e-3,7.168639e-3,1.499105,-315.1945,-350.4958)" + cx="889.67188" + cy="707.07434" + fx="889.67188" + fy="707.07434" + r="145.07635" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3337" + id="linearGradient3392" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-240,0)" + x1="1088.0862" + y1="752.67523" + x2="1070.9225" + y2="516.59521" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3347" + id="radialGradient3395" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.855854,-4.721012e-3,-1.795074e-2,1.107032,-573.9138,-379.4444)" + cx="889.67188" + cy="707.07434" + fx="889.67188" + fy="707.07434" + r="145.07635" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3337" + id="linearGradient3408" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.640101,0,-1.503523e-2,0.738462,-531.0515,-120.6166)" + x1="1088.0862" + y1="752.67523" + x2="1070.9225" + y2="516.59521" /> + <filter + inkscape:collect="always" + id="filter4382"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="5.8935163" + id="feGaussianBlur4384" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2980" + id="radialGradient2993" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.945085,0.545627,-0.270591,0.468689,142.3973,-159.4092)" + cx="628.70422" + cy="407.33719" + fx="628.48901" + fy="398.23914" + r="38.580692" /> + <filter + inkscape:collect="always" + x="-0.23653734" + width="1.4730747" + y="-0.35096824" + height="1.7019365" + id="filter4877"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="7.6348052" + id="feGaussianBlur4879" /> + </filter> + <filter + inkscape:collect="always" + x="-0.17345947" + width="1.3469189" + y="-0.27603572" + height="1.5520714" + id="filter4958"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="2.6896932" + id="feGaussianBlur4960" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4970" + id="linearGradient4976" + x1="627.0163" + y1="374.24841" + x2="582.94659" + y2="386.46796" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5002" + id="linearGradient5008" + x1="1105.0763" + y1="556.67267" + x2="1116.7949" + y2="540.26642" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3209" + id="radialGradient5012" + cx="1217.5303" + cy="1610.0789" + fx="1217.5303" + fy="1610.0789" + r="35.931072" + gradientTransform="matrix(1.618346,-0.534976,1.718181,1.15679,-3572.63,429.4414)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5016" + id="linearGradient5022" + x1="1070.3107" + y1="525.81335" + x2="1072.6544" + y2="544.75861" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + x="-0.026605937" + width="1.0532119" + y="-0.11884383" + height="1.2376877" + id="filter5154"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="1.9936009" + id="feGaussianBlur5156" /> + </filter> + <filter + inkscape:collect="always" + x="-0.058378786" + width="1.1167576" + y="-0.14122266" + height="1.2824453" + id="filter5194"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="2.3537535" + id="feGaussianBlur5196" /> + </filter> + <filter + inkscape:collect="always" + id="filter5254"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="12.362587" + id="feGaussianBlur5256" /> + </filter> + <filter + inkscape:collect="always" + x="-0.33162393" + width="1.6632479" + y="-0.50389611" + height="2.0077922" + id="filter5329"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="15.236484" + id="feGaussianBlur5331" /> + </filter> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath5339"> + <use + x="0" + y="0" + xlink:href="#path5198" + id="use5337" + width="1" + height="1" + transform="translate(0,-540)" /> + </clipPath> + <filter + inkscape:collect="always" + x="-0.059271395" + width="1.1185428" + y="-0.2476752" + height="1.4953504" + id="filter3952"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="6.568345" + id="feGaussianBlur3954" /> + </filter> + <filter + inkscape:collect="always" + x="-0.067821837" + width="1.1356437" + y="-0.13965996" + height="1.2793199" + id="filter4914"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="7.9175213" + id="feGaussianBlur4916" /> + </filter> + <filter + inkscape:collect="always" + id="filter3871"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="6.9266087" + id="feGaussianBlur3873" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3877" + id="linearGradient3875" + gradientUnits="userSpaceOnUse" + x1="1843.3077" + y1="1139.8347" + x2="1798.4442" + y2="1145.3904" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3877" + id="linearGradient2949" + gradientUnits="userSpaceOnUse" + x1="1332.6165" + y1="1341.6736" + x2="1329.6609" + y2="1290.606" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3838" + id="linearGradient3844" + x1="1306.5068" + y1="1474.1163" + x2="1334.7703" + y2="1533.567" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + x="-0.284216" + width="1.568432" + y="-0.23374538" + height="1.4674908" + id="filter3912"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="12.342325" + id="feGaussianBlur3914" /> + </filter> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3918"> + <use + x="0" + y="0" + xlink:href="#path3144" + id="use3916" + width="1" + height="1" /> + </clipPath> + <filter + inkscape:collect="always" + id="filter4167"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="1.164557" + id="feGaussianBlur4169" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2957" + id="linearGradient4211" + gradientUnits="userSpaceOnUse" + x1="1059.4688" + y1="542.11444" + x2="1044.2227" + y2="593.19513" /> + <filter + inkscape:collect="always" + id="filter4217"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="10.108017" + id="feGaussianBlur4219" /> + </filter> + <filter + inkscape:collect="always" + x="-0.21888952" + width="1.437779" + y="-0.19940901" + height="1.398818" + id="filter4259"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="12.615137" + id="feGaussianBlur4261" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4263" + id="linearGradient4269" + x1="1182.5635" + y1="429.21915" + x2="1247.7144" + y2="430.47183" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + x="-0.050900629" + width="1.1018013" + y="-0.10984331" + height="1.2196866" + id="filter4601"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="9.025964" + id="feGaussianBlur4603" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3059" + id="linearGradient4607" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.496947,0,-822.1609)" + x1="839.81659" + y1="215.09087" + x2="836.30078" + y2="153.0452" /> + <filter + inkscape:collect="always" + id="filter4653"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="8.6485882" + id="feGaussianBlur4655" /> + </filter> + <filter + inkscape:collect="always" + x="-0.10894429" + width="1.2178886" + y="-0.17668761" + height="1.3533752" + id="filter4826"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="1.9101588" + id="feGaussianBlur4828" /> + </filter> + <filter + inkscape:collect="always" + x="-0.1440634" + width="1.2881268" + y="-0.21936503" + height="1.4387301" + id="filter5032"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="1.7103122" + id="feGaussianBlur5034" /> + </filter> + <filter + inkscape:collect="always" + x="-0.30684853" + width="1.6136971" + y="-0.20180214" + height="1.4036043" + id="filter5106"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="5.8270206" + id="feGaussianBlur5108" /> + </filter> + <filter + inkscape:collect="always" + x="-0.094454055" + width="1.1889081" + y="-0.14074299" + height="1.281486" + id="filter5200"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="5.3388835" + id="feGaussianBlur5202" /> + </filter> + <filter + inkscape:collect="always" + x="-0.12801512" + width="1.2560302" + y="-0.3464887" + height="1.6929774" + id="filter5304"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="3.7809852" + id="feGaussianBlur5306" /> + </filter> + <filter + inkscape:collect="always" + x="-0.035006558" + width="1.0700131" + y="-0.14665898" + height="1.293318" + id="filter6393"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="6.4832538" + id="feGaussianBlur6395" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6405" + id="linearGradient6403" + x1="931.52002" + y1="872.21838" + x2="1079.7725" + y2="885.69226" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + id="filter3915"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="3.0141434" + id="feGaussianBlur3917" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3332" + id="radialGradient3919" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.200899,0.579174,-0.2156105,0.4470627,8.8637985,-8.9711893)" + cx="347.41388" + cy="303.43369" + fx="347.41388" + fy="303.43369" + r="154.43303" /> + <filter + inkscape:collect="always" + x="-0.097929535" + width="1.1958591" + y="-0.11166643" + height="1.2233329" + id="filter3927"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="1.8517745" + id="feGaussianBlur3929" /> + </filter> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3946"> + <path + style="opacity:1;color:#000000;fill:url(#linearGradient3949);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3944" + sodipodi:nodetypes="csscsccsc" + d="M 544.28571,615.14286 C 502.85714,590.85714 445.71429,549.42857 421.42857,533.71429 C 397.14286,518 368.57143,493.71429 354.28571,479.42857 C 340,465.14286 317.14286,445.14286 312.85714,435.14286 C 290,446.57143 297.14286,456.57143 295.71429,462.28571 C 294.28571,468 291.42857,472.28571 291.42857,472.28571 L 218.57143,436.57143 C 218.57143,436.57143 348.57143,509.42857 364.28571,518 C 380,526.57143 548.57143,619.42857 544.28571,615.14286 z " /> + </clipPath> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3931" + id="linearGradient3949" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,50)" + x1="321.67255" + y1="442.76962" + x2="325.79459" + y2="409.21478" /> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3953"> + <path + style="opacity:1;color:#000000;fill:url(#linearGradient3956);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3951" + sodipodi:nodetypes="csscsccsc" + d="M 544.28571,615.14286 C 502.85714,590.85714 445.71429,549.42857 421.42857,533.71429 C 397.14286,518 368.57143,493.71429 354.28571,479.42857 C 340,465.14286 317.14286,445.14286 312.85714,435.14286 C 290,446.57143 297.14286,456.57143 295.71429,462.28571 C 294.28571,468 291.42857,472.28571 291.42857,472.28571 L 218.57143,436.57143 C 218.57143,436.57143 348.57143,509.42857 364.28571,518 C 380,526.57143 548.57143,619.42857 544.28571,615.14286 z " /> + </clipPath> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3931" + id="linearGradient3956" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,50)" + x1="321.67255" + y1="442.76962" + x2="325.79459" + y2="409.21478" /> + <filter + inkscape:collect="always" + id="filter3982"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="1.2477499" + id="feGaussianBlur3984" /> + </filter> + <filter + inkscape:collect="always" + id="filter4008"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="2.5339087" + id="feGaussianBlur4010" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3156" + id="linearGradient4012" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(18.081772,0)" + x1="198.10001" + y1="362.28571" + x2="276.1857" + y2="362.28571" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3156" + id="linearGradient4016" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(84,0)" + x1="198.10001" + y1="362.28571" + x2="276.1857" + y2="362.28571" /> + <filter + inkscape:collect="always" + id="filter4022"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="1.0729348" + id="feGaussianBlur4024" /> + </filter> + <filter + inkscape:collect="always" + id="filter4070"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="1.2671386" + id="feGaussianBlur4072" /> + </filter> + <filter + inkscape:collect="always" + x="-0.04195043" + width="1.0839009" + y="-0.14643413" + height="1.2928683" + id="filter4097"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="2.7365391" + id="feGaussianBlur4099" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3230" + id="linearGradient4101" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(2.14286,-1045.1974)" + x1="260" + y1="1203" + x2="185" + y2="1170.1428" /> + <filter + inkscape:collect="always" + x="-0.038803903" + width="1.0776078" + y="-0.1411126" + height="1.2822252" + id="filter4119"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="2.419179" + id="feGaussianBlur4121" /> + </filter> + <filter + inkscape:collect="always" + id="filter4139"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="5.6950996" + id="feGaussianBlur4141" /> + </filter> + <filter + inkscape:collect="always" + id="filter4161"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="4.9493976" + id="feGaussianBlur4163" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.48036041" + inkscape:cx="851.92362" + inkscape:cy="521.2444" + inkscape:document-units="px" + inkscape:current-layer="layer3" + width="1901px" + height="1018px" + inkscape:window-width="900" + inkscape:window-height="687" + inkscape:window-x="10" + inkscape:window-y="20" + showguides="true" + inkscape:guide-bbox="true" + showborder="false" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>Lamborghini Gallardo</dc:title> + <dc:date>10.25.2006</dc:date> + <dc:creator> + <cc:Agent> + <dc:title>Michael Grosberg</dc:title> + </cc:Agent> + </dc:creator> + <dc:description>A traced Lamborghini Gallardo. +The source image can be found at: +http://en.wikipedia.org/wiki/Image:Lamborghini_Gallardo_silver.jpg</dc:description> + <cc:license + rdf:resource="http://creativecommons.org/licenses/by-nc-sa/2.5/" /> + </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/by-nc-sa/2.5/"> + <cc:permits + rdf:resource="http://web.resource.org/cc/Reproduction" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/Distribution" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Notice" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Attribution" /> + <cc:prohibits + rdf:resource="http://web.resource.org/cc/CommercialUse" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/ShareAlike" /> + </cc:License> + </rdf:RDF> + </metadata> + <g + inkscape:label="shadow" + style="opacity:1;display:inline" + id="layer6" + inkscape:groupmode="layer"> + <path + style="opacity:0.75652179;fill:url(#linearGradient6403);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter6393)" + d="M 833.92042,891.98536 C 852.45199,895.69167 862.33549,901.86886 873.45443,900.63342 C 884.57337,899.39798 1151.4279,910.51692 1144.0153,901.86886 C 1136.6027,893.2208 1103.2458,841.33241 1081.008,843.80329 C 1058.7701,846.27416 996.9982,826.50716 971.054,826.50716 C 945.10981,826.50716 869.74812,812.91735 847.51024,817.8591 C 825.27236,822.80085 765.97135,831.44891 774.61942,841.33241 C 783.26748,851.21592 799.32817,887.04361 833.92042,891.98536 z " + id="path5398" /> + <path + style="opacity:0.75;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3933)" + d="M 1723.6555,787.9542 C 1760.3047,803.4157 1777.1834,823.7398 1754.1015,846.0505 C 1749.1968,851.3011 1737.9063,858.5431 1721.797,866.8706 C 1637.8809,910.3155 1423.8477,988.2316 1316.0696,988.3291 C 1303.4824,988.3491 1284.8718,986.4359 1262.8773,983.2064 C 1180.5796,970.8403 1042.9036,938.2083 1001.7948,921.9216 C 975.7298,911.4804 942.7654,911.8916 910.653,911.7278 C 875.7047,911.2128 838.4307,909.9972 808.9547,893.2168 C 791.2046,882.9509 779.904,873.7065 772.6421,865.0477 C 752.7058,840.9555 763.5005,822.0002 748.5703,799.5818 C 742.099,790.8866 714.0216,771.8511 672.6307,748.8436 C 560.35406,686.2063 339.78489,576.1304 279.061,551.8925 C 271.83005,549.0114 266.67254,547.2996 264.04046,546.9561 C 234.24042,543.1389 148.46794,567.8161 130.10669,542.5468 C 130.07796,542.5073 130.04939,542.4676 130.02098,542.4279 C 111.74379,516.8365 152.20544,475.4745 188.8197,471.533 C 188.97119,471.5167 189.1229,471.5009 189.27482,471.4856 C 226.04741,467.7881 642.21633,370.1412 716.9405,387.9473 C 719.5366,388.561 723.0239,389.5757 727.3347,390.965 C 848.5229,430.0548 1700.6312,778.9385 1723.6555,787.9542 C 1723.6555,787.9542 1723.6555,787.9542 1723.6555,787.9542" + id="path7090" /> + <use + x="0" + y="0" + xlink:href="#path5398" + id="use6413" + transform="matrix(0.9136,0,0,0.9136,-620.2102,-276.0885)" + width="1901" + height="1018" /> + </g> + <g + inkscape:label="paint" + style="opacity:1;display:inline" + id="layer3" + inkscape:groupmode="layer"> + <path + style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + d="M 1033.7599,832.88001 C 946.39995,785.04001 809.11996,712.24001 782.07996,718.48001 C 755.03996,724.72001 700.95997,747.60001 700.95997,747.60001 L 659.35997,691.44002 L 671.83997,473.04003 L 794.55996,435.60003 L 960.95995,518.80002 L 1033.7599,832.88001 z " + id="path3635" /> + <path + d="M 988,874.48001 C 931.84,892.16001 885.04,899.44001 865.28,899.44001 C 845.52,899.44001 786.24,884.88001 757.11996,840.16001 C 727.99996,795.44001 701.99997,724.72001 703.03997,669.60002 C 704.07997,614.48002 706.15997,502.16002 819.52,508.40002 C 932.88,514.64002 979.68,647.76002 989.04,684.16002 C 998.4,720.56001 989.04,874.48001 988,874.48001 z " + id="path3331" + style="opacity:1;color:black;fill:url(#linearGradient3392);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" /> + <path + id="path3540" + d="M 988,874.48001 C 931.84,892.16001 885.04,899.44001 865.28,899.44001 C 845.52,899.44001 786.24,884.88001 757.11996,840.16001 C 727.99996,795.44001 701.99997,724.72001 703.03997,669.60002 C 704.07997,614.48002 706.15997,502.16002 819.52,508.40002 C 932.88,514.64002 979.68,647.76002 989.04,684.16002 C 998.4,720.56001 989.04,874.48001 988,874.48001 z " + style="opacity:0.29444442;color:black;fill:url(#radialGradient3380);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" /> + <path + style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + d="M 76.959996,366.96003 C 69.679996,358.64003 58.239997,336.80004 58.239997,294.16004 C 58.239997,271.28004 72.799996,225.52004 72.799996,225.52004 L 147.67999,227.60004 L 241.27999,402.32003 L 265.19999,467.84003 C 265.19999,467.84003 190.55853,384.49949 130.31349,390.57618 C 101.54215,393.47824 76.959996,366.96003 76.959996,366.96003 z " + sodipodi:nodetypes="csccccsc" + id="path3637" /> + <path + id="path4128" + sodipodi:nodetypes="csssssc" + d="M 241.84448,525.15366 C 205.63058,538.20967 175.5644,543.58567 162.91601,543.58567 C 150.26761,543.58567 112.54134,532.83366 94.573945,499.80964 C 76.606579,466.78562 61.027251,414.56159 62.521698,373.85757 C 64.016144,333.15354 67.036312,250.20949 139.50436,254.8175 C 211.97239,259.4255 263.84761,445.08956 269.29167,471.96957 C 274.73573,498.84958 242.51018,525.15366 241.84448,525.15366 z " + style="opacity:1;color:black;fill:url(#linearGradient3408);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" /> + <path + d="M 232.48448,518.91366 C 196.27059,531.96967 175.5644,543.58567 162.91601,543.58567 C 150.26761,543.58567 112.54134,532.83366 94.573945,499.80964 C 76.606579,466.78562 61.027251,414.56159 62.521698,373.85757 C 64.016144,333.15354 67.036312,250.20949 139.50436,254.8175 C 211.97239,259.4255 256.5676,459.64955 262.01166,486.52957 C 267.45572,513.40958 233.15019,518.91366 232.48448,518.91366 z " + sodipodi:nodetypes="csssssc" + id="path4144" + style="opacity:0.29444442;color:black;fill:url(#radialGradient3395);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" /> + <path + style="color:black;fill:#5b6879;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1482.9039,285.6394 C 1482.9039,285.6394 1562.706,300.79169 1609.173,327.05566 C 1655.64,353.31962 1764.4406,443.34576 1833.131,534.25949 C 1833.131,534.25949 1846.4286,550.14286 1859.2857,581.57143 M 1482.9039,285.63941 C 1482.9039,285.63941 1371.7872,215.93888 1326.3303,189.67491 C 1280.8734,163.41095 1185.9191,114.92362 1140.4622,98.761184 C 1095.0054,82.598743 1018.2338,67.446455 978.83782,62.395693 C 939.44187,57.34493 769.73624,50.273862 717.20831,53.30432 C 664.68037,56.334777 553.56359,65.426151 485.88337,77.547981 C 435.37575,81.588591 323.24881,88.659659 284.86302,92.700269 C 246.47722,96.740879 200.89409,102.80179 200.95723,102.80179 C 171.72593,104.8221 109.09647,121.99469 76.588293,132.59549 L 65.714286,197.28571 L 62.142857,202.28571 C 62.142857,202.28571 58.571429,245.14286 57.142857,252.28571 C 55.714286,259.42857 52.857143,292.28571 60,325.85714 C 56.428571,268.71429 67.142857,253 72.857143,244.42857 C 78.571429,235.85714 91.428571,229.42857 103.57143,233 C 115.71429,236.57143 164.28571,282.28571 185,363.71429 C 205.71429,445.14286 204.28571,457.28571 204.28571,457.28571 L 201.42857,461.57143 L 207.85714,503 C 207.85714,503 309.28571,541.57143 391.42857,585.85714 C 473.57143,630.14286 704.28571,747.28571 704.28571,747.28571 L 692.14286,713.71429 L 696.42857,708 L 690.71429,704.42857 C 690.71429,704.42857 680,662.31034 680.71429,616.57143 C 681.62886,558.00714 711.42857,477.28571 786.42857,488 C 854.22975,497.68587 902.85714,573.71429 910,586.57143 C 908.57143,589.42857 909.28571,589.42857 909.28571,589.42857 C 909.28571,589.42857 962.14286,681.57143 969.28571,751.57143 C 976.42857,821.57143 975,853 975,853 C 975,853 1143.5714,905.14286 1211.4286,915.14286 C 1299.2857,771.57143 1304.2857,768.71429 1304.1963,769.61346 C 1400.0714,766.47202 1597.0512,729.09637 1692.0055,698.7918 C 1786.9599,668.48722 1839.4878,611.91868 1858.6807,580.60395" + sodipodi:nodetypes="cscccsssscsccccscssscccsccccssccscccsc" + id="path2801" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2854);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 664.28571,423.35714 C 630,406.21428 361.42857,252.28571 325.71429,233.71429 C 290,215.14286 172.85714,145.14286 142.85714,135.14286 C 112.85714,125.14286 96.132704,131.69398 76.588293,132.59549 L 65.714286,197.28571 L 62.142857,202.28571 C 62.142857,202.28571 58.571429,245.14286 57.142857,252.28571 C 55.714286,259.42857 52.857143,292.28571 60,325.85714 C 56.428571,268.71429 67.142857,253 72.857143,244.42857 C 78.571429,235.85714 91.428571,229.42857 103.57143,233 C 115.71429,236.57143 164.28571,282.28571 185,363.71429 C 205.71429,445.14286 204.28571,457.28571 204.28571,457.28571 L 201.42857,461.57143 L 207.85714,503 C 207.85714,503 309.28571,541.57143 391.42857,585.85714 C 473.57143,630.14286 704.28571,747.28571 704.28571,747.28571 L 692.14286,713.71429 L 696.42857,708 L 690.71429,704.42857 C 690.71429,704.42857 680,662.31034 680.71429,616.57143 C 681.62886,558.00714 711.42857,477.28571 786.42857,488 C 854.22975,497.68587 902.85714,573.71429 910,586.57143 C 908.57143,589.42857 909.28571,589.42857 909.28571,589.42857 C 909.28571,589.42857 962.14286,681.57143 969.28571,751.57143 C 976.42857,821.57143 975,853 975,853 C 975,853 1143.5714,905.14286 1211.4286,915.14286 C 1299.2857,771.57143 1304.2857,768.71429 1304.2857,768.71429 L 1252.1429,715.14286 C 1252.1429,715.14286 1067.8571,548 987.85714,498.71429 C 907.85714,449.42857 849.33268,417.77137 818.57143,411.57143 C 757.12842,399.18757 696.88216,394.82973 672.36316,398.77249 C 669.37512,408.00389 664.28571,423.35714 664.28571,423.35714 z " + sodipodi:nodetypes="csscccscssscccsccccssccsccccsscc" + id="path2973" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3258);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3248" + sodipodi:nodetypes="csscccscssscccscc" + d="M 665.14286,421.5 C 630.85715,404.35714 362.28571,250.42857 326.57143,231.85715 C 290.85714,213.28572 173.71429,143.28572 143.71429,133.28572 C 113.71429,123.28572 98.505075,132.36222 78.960665,133.26373 L 66.571426,195.42857 L 62.999996,200.42857 C 62.999996,200.42857 59.428576,243.28572 57.999996,250.42857 C 56.571426,257.57143 53.714286,290.42857 60.857146,324 C 57.285716,266.85715 67.999996,251.14286 73.714286,242.57143 C 79.428576,234 92.285716,227.57143 104.42858,231.14286 C 116.57144,234.71429 165.14286,280.42857 185.85715,361.85715 C 206.57144,443.28572 205.14286,455.42857 205.14286,455.42857 L 202.28572,459.71429 L 208.71429,501.14289 C 208.71429,501.14289 310.14285,539.71429 392.28571,583.99999 C 474.42858,628.28569 705.14286,745.42859 705.14286,745.42859 C 627.05373,594.84069 665.0035,569.41479 665.14286,421.5 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2985);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible" + id="path2976" + sodipodi:nodetypes="ccccccccc" + d="M 75.23606,243.22315 L 60.164992,238.5404 L 63.170068,201.47441 L 65.123833,198.26601 L 65.979144,197.98959 L 78.999998,132.50002 L 115.71343,132.18931 L 97.999997,215.50002 L 75.23606,243.22315 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2999);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path2965" + sodipodi:nodetypes="cssssccsssssssssscsscccssssc" + d="M 117.95028,131.82387 C 118.96044,143.94577 118.96979,142.91927 113.91903,148.98017 C 108.86827,155.04107 105.82528,155.05507 105.82528,163.13637 C 105.82528,171.21757 104.8237,181.31457 98.762783,185.35517 C 92.701872,189.39567 92.700282,189.37697 92.700282,193.41767 C 92.700282,197.45827 82.111603,202.51219 80.596379,216.14927 C 102.15149,218.96692 120.15358,226.87465 132.10653,243.94887 C 143.21819,239.90827 139.15808,237.88487 137.13778,231.82387 C 135.11747,225.76297 137.14873,225.74957 139.16903,220.69887 C 141.18933,215.64807 139.15808,217.66597 137.13778,211.60517 C 135.11747,205.54427 151.28467,215.66527 155.32528,206.57387 C 159.3659,197.48257 150.2761,195.44817 161.38778,192.41767 C 172.49946,189.38707 174.51515,186.36767 183.60653,194.44887 C 192.6979,202.53007 206.83939,209.59657 220.98153,216.66767 C 235.12367,223.73867 258.35969,231.82457 270.48153,234.85517 C 282.60336,237.88567 294.72297,233.84567 301.79403,237.88637 C 308.86509,241.92697 303.82845,244.94967 315.95028,247.98017 C 324.91012,250.22007 369.39404,263.24968 435.24677,296.16641 C 404.4122,278.76461 329.19878,237.08445 315.6868,228.67135 C 262.14871,195.33635 190.67601,157.07237 177.54403,151.01137 C 164.41206,144.95047 130.07211,131.82387 117.95028,131.82387 z M 153.54403,177.16767 C 155.24491,177.05947 156.5896,177.32287 157.35653,178.26137 C 149.7542,185.86367 152.56806,190.38397 150.29403,199.48017 C 148.22327,207.76317 141.64769,206.14957 138.16903,201.51137 C 136.45178,199.22167 124.01278,195.89187 124.01278,194.44887 C 124.01278,187.42117 125.91394,181.29257 134.10653,181.29267 C 140.06869,181.29267 148.44138,177.49197 153.54403,177.16767 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3152);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 685.71429,527.57141 C 695.71429,497.57141 730.9746,446.39679 807.03486,462.89842 C 802.74915,424.32702 747.14286,401.85711 747.14286,401.85711 L 675.71429,397.57141 C 675.71429,397.57141 664.28571,410.42861 664.28571,426.14281 C 664.28571,441.85711 662.85714,509.00001 662.85714,509.00001 L 685.71429,527.57141 z " + id="path3144" + sodipodi:nodetypes="ccccscc" /> + <path + style="opacity:0.56956522;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter3912)" + id="path3850" + d="M 721.67688,456.86456 C 729.30457,453.42935 737.72355,453.00826 745.85283,451.55583 C 748.01123,452.31667 765.21374,447.8819 756.84996,448.67261 C 756.38575,458.55317 751.28724,445.55918 748.77771,441.88811 C 745.65845,435.95671 742.29659,430.31658 738.09673,425.11953 C 734.77045,421.97746 730.50938,420.36682 726.42252,418.49738 C 714.57034,413.07586 720.69767,396.05939 732.68987,401.16374 L 732.68987,401.16374 C 738.75684,403.74608 744.72407,406.56833 749.74464,410.94576 C 754.9415,416.39336 759.11042,422.53887 762.23822,429.40789 C 768.44893,439.08502 775.13182,445.24087 772.54164,458.10853 C 765.79028,467.62205 759.32448,468.59758 748.32866,469.57403 C 742.02784,470.81009 703.27245,512.99529 697.2797,515.37227 C 692.16919,519.10918 714.84173,460.77048 721.67688,456.86456 z " + sodipodi:nodetypes="cccccscccccccc" + clip-path="url(#clipPath3918)" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2963);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path2857" + sodipodi:nodetypes="cccssccccssc" + d="M 696.90625,397.375 C 716.31072,399.15039 730.7816,403.02757 724.08756,414.24651 C 747.87178,417.64391 763.29567,436.9156 769.42747,458.40244 C 784.47414,462.16706 851.21242,454.70446 912.71875,547.46875 C 933.43519,578.71344 951.13573,647.06961 967.29118,659.67127 C 983.40346,672.23925 994.08962,609.51337 1009.375,623.0625 C 1036.9696,640.7111 1085.7096,694.90941 1117,705.0625 C 1169.4389,716.82057 1227.3539,726.23713 1280.2188,744 L 1252.1563,715.15625 C 1252.1562,715.15623 1067.8437,548.00446 987.84375,498.71875 C 907.84377,449.43303 849.32375,417.76244 818.5625,411.5625 C 772.48026,402.2746 727.07461,397.51778 696.90625,397.375 z " /> + <path + style="opacity:1;color:black;fill:url(#radialGradient3011);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 487.2123,108.89615 C 439.26568,111.09441 391.38329,115.92628 344.28114,124.95681 C 336.96091,127.43505 330.58931,131.91334 324.56325,136.56314 C 364.74696,171.77294 403.98097,208.3632 451.13456,233.88525 C 521.94112,275.56005 594.70245,314.22138 669.45346,348.45715 C 706.54686,364.87734 747.03861,370.7207 787.14746,374.61313 C 793.3854,375.23462 799.63181,375.77396 805.87489,376.34372 C 770.04529,320.75944 736.35336,263.76108 696.2648,211.20112 C 671.43459,181.40361 644.97507,152.66792 612.06086,131.70103 C 584.15074,117.98769 552.47933,115.39278 522.06312,110.85314 C 510.49462,109.57466 498.85779,108.74629 487.2123,108.89615 z " + id="path3001" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3192);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3184" + sodipodi:nodetypes="cssscc" + d="M 402.85715,215.14287 C 388.57143,205.14287 344.99997,175.14291 337.85715,172.28573 C 330.71429,169.42853 282.10983,172.87456 268.92244,184.68104 C 261.47206,191.35126 309.60572,206.31147 318.57143,216.57147 C 325.73041,224.76393 325.71429,235.14287 325.71429,235.14287 C 325.71429,235.14287 368.57143,217.99997 402.85715,215.14287 z " /> + <path + style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 494.9375,104.78125 C 461.60246,104.78125 358.55933,116.91799 346.4375,121.96875 C 334.31567,127.01952 319.15625,140.15625 319.15625,140.15625 C 319.15624,140.15626 379.77902,194.70399 411.09375,217.9375 C 442.40846,241.171 618.66281,335.20635 689.90625,362.12054 C 735.36314,379.29314 814.41316,380.79911 812.39286,380.79911 C 812.39285,380.79912 737.54278,259.00793 713.29911,226.68304 C 689.05546,194.35816 641.39912,136.11168 614.125,125 C 586.85088,113.88832 528.27253,104.78125 494.9375,104.78125 z M 497.0625,111.90625 C 506.75642,112.04153 516.42756,112.77895 526.0625,113.84375 C 556.47871,118.38339 588.15239,120.97416 616.0625,134.6875 C 648.97671,155.65439 675.41982,184.38998 700.25,214.1875 C 703.63285,218.62274 706.95293,223.09864 710.25,227.59375 C 709.11316,230.30784 682.77602,293.60911 675.96875,352.53125 C 675.13851,352.17562 674.29566,351.8348 673.46875,351.46875 C 598.71774,317.23298 525.93157,278.5498 455.125,236.875 C 444.49805,231.12313 434.26704,224.79545 424.34375,218.0625 C 444.27323,174.03577 483.54579,130.27867 497.0625,111.90625 z M 484.65625,112.21875 C 474.51946,123.1227 437.29401,164.90878 416,212.25 C 385.21587,190.30191 357.12398,164.58866 328.5625,139.5625 C 334.58856,134.9127 340.96103,130.44699 348.28125,127.96875 C 393.23692,119.34975 438.90106,114.54918 484.65625,112.21875 z M 716.0625,235.59375 C 749.41739,282.03967 778.8563,331.22286 809.875,379.34375 C 803.63192,378.77399 797.39419,378.24649 791.15625,377.625 C 754.84036,374.10066 718.2297,368.96977 684.09375,355.84375 C 690.00797,305.83151 710.97052,256.43507 716.0625,235.59375 z " + sodipodi:nodetypes="cscsssssccccccccccccccccccccc" + id="path3270" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3086);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 490.9375,101.78125 C 457.60246,101.78125 354.55933,113.91799 342.4375,118.96875 C 330.31567,124.01952 315.15625,137.15625 315.15625,137.15625 C 315.15624,137.15626 375.77902,191.70399 407.09375,214.9375 C 438.40846,238.171 614.66281,336.49206 685.90625,363.40625 C 731.36314,380.57885 823.2703,385.65625 821.25,385.65625 C 821.24999,385.65626 736.39992,250.29364 712.15625,217.96875 C 687.9126,185.64387 637.39912,133.11168 610.125,122 C 582.85088,110.88832 524.27253,101.78125 490.9375,101.78125 z M 493.0625,108.90625 C 502.75642,109.04153 512.42756,109.77895 522.0625,110.84375 C 552.47871,115.38339 584.15239,117.97416 612.0625,131.6875 C 644.97671,152.65439 671.41982,181.38998 696.25,211.1875 C 699.63285,215.62274 702.95293,220.09864 706.25,224.59375 C 705.11316,227.30784 678.77602,290.60911 671.96875,349.53125 C 671.13851,349.17562 670.29566,348.8348 669.46875,348.46875 C 594.71774,314.23298 521.93157,275.5498 451.125,233.875 C 440.49805,228.12313 430.26704,221.79545 420.34375,215.0625 C 440.27323,171.03577 479.54579,127.27867 493.0625,108.90625 z M 480.65625,109.21875 C 470.51946,120.1227 433.29401,161.90878 412,209.25 C 381.21587,187.30191 353.12398,161.58866 324.5625,136.5625 C 330.58856,131.9127 336.96103,127.44699 344.28125,124.96875 C 389.23692,116.34975 434.90106,111.54918 480.65625,109.21875 z M 712.0625,232.59375 C 745.41739,279.03967 774.8563,328.22286 805.875,376.34375 C 799.63192,375.77399 793.39419,375.24649 787.15625,374.625 C 750.84036,371.10066 714.2297,365.96977 680.09375,352.84375 C 686.00797,302.83151 706.97052,253.43507 712.0625,232.59375 z " + id="path3053" /> + <g + id="g3134" + transform="translate(-10,-1074.286)"> + <path + style="opacity:1;color:black;fill:#76452b;fill-opacity:0.77631579;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 952.57385,1666.5179 L 964.69568,1694.8022 C 964.69568,1694.8022 994.58841,1704.537 1003.0815,1707.9342 C 1018.2338,1713.9952 1043.4876,1703.8936 1043.4876,1703.8936 L 952.57385,1666.5179 z " + sodipodi:nodetypes="ccscc" + id="path3090" /> + <path + style="opacity:1;color:black;fill:#d17827;fill-opacity:0.77631579;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3092" + d="M 956.0625,1670.2188 C 960.19233,1677.1049 962.13721,1684.9727 965.75,1692.0625 C 969.11452,1696.2138 975.70112,1694.9161 980.12825,1697.6204 C 995.4794,1703.1908 1011.5555,1711.0394 1028.1563,1706.375 C 1030.7134,1705.6178 1037.675,1704.642 1037.1563,1703.2188 C 1020.6011,1697.4663 1004.6387,1689.635 988.1997,1683.3083 C 977.52337,1678.9651 966.59327,1674.3794 956.0625,1670.2188 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3140);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3100" + d="M 963.34375,1676 C 961.22401,1679.6177 964.66365,1684.3186 965.96875,1688.0938 C 969.26394,1695.2571 978.36466,1693.5937 984.24841,1696.9772 C 997.14095,1701.693 1010.9742,1708.0754 1024.9688,1704.9375 C 1028.8342,1701.44 1022.0874,1699.0432 1019.375,1698.4063 C 1000.9085,1691.0721 982.67631,1682.46 964.00071,1675.9752 L 963.34375,1676 z " /> + <path + sodipodi:cy="1692.2769" + sodipodi:type="arc" + sodipodi:cx="992.47485" + style="opacity:1;color:black;fill:url(#linearGradient3142);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3124" + sodipodi:rx="7.5761442" + d="M 1000.051 1692.2769 A 7.5761442 4.5456862 0 1 1 984.89871,1692.2769 A 7.5761442 4.5456862 0 1 1 1000.051 1692.2769 z" + sodipodi:ry="4.5456862" /> + </g> + <path + style="opacity:1;color:black;fill:url(#radialGradient3162);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3154" + sodipodi:nodetypes="csssscscsscc" + d="M 325.50371,235.26855 C 325.50371,235.26855 499.60709,332.18715 515.76953,342.28875 C 531.93197,352.39025 655.17058,421.08065 663.2518,421.08065 C 671.33302,421.08065 680.71429,428.71425 683.57143,424.42855 C 686.42857,420.14285 677.14286,413.00005 683.57143,413.00005 C 690,413.00005 700,410.14285 708.57143,410.85715 C 682.85714,405.14285 690,405.14285 682.85714,405.85715 C 675.71429,406.57145 673.06747,416.91511 666.63889,411.91511 C 660.21032,406.91511 665,403.00005 657.85714,396.57145 C 650.71429,390.14285 591.42857,320.85715 577.14286,313.71425 C 562.85714,306.57145 443.18263,243.8982 407.46834,213.8981 C 358.89691,221.041 326.78572,233.17855 325.50371,235.26855 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3196);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 341.42857,228.00005 C 231.07143,162.82145 182.02366,134.71267 167.98858,135.98859 C 162.26858,136.50859 154.87714,136.63436 147.85714,138.71436 C 165.20537,146.18896 230.32484,179.03195 326.03913,235.46055 C 326.03913,235.46055 324.64286,231.03575 341.42857,228.00005 z " + sodipodi:nodetypes="ccccc" + id="path3194" /> + <path + style="opacity:1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4070)" + d="M 314.15745,145.20789 C 300.01531,148.23839 284.86302,150.25869 273.75134,155.30939 C 262.63967,160.36019 241.42646,171.47189 241.42646,171.47189 L 276.81165,189.88479 L 326.27928,170.46169 L 314.15745,145.20789 z " + sodipodi:nodetypes="cscccc" + id="path3222" /> + <path + style="opacity:0.94782609;color:black;fill:url(#linearGradient3206);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4119)" + id="path3198" + sodipodi:nodetypes="ccsccsc" + d="M 281.14286,192.5715 C 307.33928,189.99763 351.04624,198.41235 378.28572,198.2858 C 360.46198,188.17501 341.57637,182.42027 334.43352,178.13457 C 327.29066,173.84887 328.28572,172.5715 328.28572,172.5715 L 305.42858,164 C 305.42858,164 248.28572,172.5715 254,176.8572 C 259.71429,181.1429 282.57143,194 281.14286,192.5715 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3220);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 316.38881,143.34171 L 380.43346,199.677 C 380.43346,199.677 323.85715,174.57144 308.14286,174.57144 C 292.42858,174.57144 316.38881,143.34171 316.38881,143.34171 z " + sodipodi:nodetypes="ccsc" + id="path3212" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3246);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 316.86447,143.55277 C 306.86447,143.55277 287.71429,148.94155 280.57143,148.94155 C 275.22263,148.94155 209.34077,132.57172 173.91411,135.06808 C 162.30428,135.88617 165.37429,135.73719 165.37429,135.73719 L 146.03715,128.33719 C 146.03715,128.33719 199.14286,113.14289 207.71429,113.14289 C 216.28572,113.14289 222.04221,104.16151 240.61364,107.01871 C 259.18507,109.87581 304.00733,130.69567 316.86447,143.55277 z " + sodipodi:nodetypes="cssccssc" + id="path3238" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3236);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 294.07695,145.84997 C 265.79267,136.75857 244.57947,134.73827 231.44749,136.75857 C 218.3155,138.77887 208.21398,133.72807 198.11245,133.72807 C 188.01093,133.72807 163.76727,135.74837 163.76727,135.74837 C 163.76727,135.74837 179.92971,140.79917 195.082,147.87027 C 210.23428,154.94127 239.52871,171.10377 239.52871,171.10377 C 239.52871,171.10377 263.77237,156.96157 270.84344,153.93117 C 277.9145,150.90067 296.09725,144.83977 294.07695,145.84997 z " + id="path3224" /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#6b89a2;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3228" + sodipodi:nodetypes="cc" + d="M 315.84571,144.68857 C 286.75428,147.93427 263.44,157.15717 242.01143,172.15717" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3268);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3260" + sodipodi:nodetypes="cccccccccc" + d="M 664.28571,423.35714 C 630,406.21428 361.42857,252.28571 325.71429,233.71429 C 210.11211,477.92779 168.54943,473.07191 391.42857,585.85714 C 473.57143,630.14286 704.28571,747.28571 704.28571,747.28571 L 692.14286,713.71429 L 696.42857,708 L 690.71429,704.42857 C 690.71429,704.42857 680,662.31034 680.71429,616.57143 C 684.07606,583.66932 689.97812,551.14682 701.35097,531.37465 C 677.62453,492.14479 666.70522,466.89564 664.28571,423.35714 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2024);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 235.40172,107.87418 L 137.94474,130.42048 L 85.864752,130.37242 C 112.70742,123.24989 168.02796,105.98041 197.22153,103.80642 C 204.68128,103.12799 223.55473,105.1186 235.40172,107.87418 z " + sodipodi:nodetypes="ccccc" + id="path2022" /> + <path + style="opacity:0.71111115;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:4.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path2911" + sodipodi:nodetypes="cc" + d="M 688.57143,710.85714 L 204.28571,459.42857" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2978);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 201.96428,456.39285 C 201.96428,456.39285 209.03535,459.42331 209.03535,459.42331 C 209.03535,459.42331 215.69326,444.13271 194.97897,362.70414 C 174.26468,281.27556 138.76871,224.10864 103.57143,213.8071 C 80.911886,207.17511 68.469904,224.74546 62.755618,233.31689 C 57.041332,241.88832 51.785714,292.64286 60,325.85714 C 56.428571,268.71429 67.142857,253 72.857143,244.42857 C 78.571429,235.85714 91.151034,230.56322 103.57143,233 C 121.77521,236.57143 162.14285,282.28571 182.85714,363.71429 C 203.57143,445.14286 201.96428,456.39285 201.96428,456.39285 z " + sodipodi:nodetypes="ccssscsssc" + id="path2964" /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#efefef;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 73.23606,244.22315 L 66.164992,226.0404 L 66.670068,219.47441 L 64.144687,199.77644" + id="path2980" /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#37404e;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible" + id="path2983" + d="M 75.23606,243.22315 L 68.164992,225.0404 L 68.670068,218.47441 L 66.144687,198.77644" /> + <g + style="opacity:1;display:inline" + id="g3105" + transform="translate(-59.41309,-1435.706)"> + <path + style="color:black;fill:url(#linearGradient3136);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path2985" + sodipodi:nodetypes="csscscssssc" + d="M 1201.4927,1535.7713 C 1157.046,1536.7815 1068.1525,1535.7713 1010.5738,1541.8322 C 952.99516,1547.8932 770.15754,1570.1165 758.03571,1572.1368 C 745.91388,1574.1571 746.92404,1578.1977 749.95449,1581.2282 C 809.55349,1637.7967 923.70073,1807.5024 932.7921,1820.6343 C 941.88348,1833.7663 948.95455,1829.7257 948.95455,1829.7257 C 948.95455,1829.7257 1172.9422,1847.1973 1237.8582,1843.8679 C 1340.1822,1838.6717 1419.6856,1810.5328 1467.1628,1800.4313 C 1514.6399,1790.3298 1552.0156,1752.9541 1531.8126,1733.7612 C 1521.4554,1723.9219 1420.6958,1653.9592 1405.5435,1644.8678 C 1390.3912,1635.7764 1231.7973,1546.883 1201.4927,1535.7713 z " /> + <path + style="color:black;fill:url(#linearGradient3138);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible" + d="M 766.25989,1588.4609 L 926,1812 L 1178,1754 L 1184,1684 L 766.25989,1588.4609 z " + sodipodi:nodetypes="ccccc" + id="path3044" /> + <path + style="color:black;fill:url(#linearGradient3141);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible" + id="path2987" + d="M 1453.0625,1704.7813 C 1442.9429,1704.7349 1435.125,1705.375 1432,1706 C 1422,1708 1354,1730 1340,1730 C 1326,1730 1266,1734 1252,1734 C 1238,1734 1190,1718 1176,1716 C 1162,1714 1138,1718 1118,1724 C 1098,1730 1104,1734 1094,1742 C 1084,1750 1060,1752 1060,1752 L 922,1788 C 922.83382,1788.8338 921.93726,1798.7449 921.46875,1810.8438 C 923.57963,1813.9369 926.02664,1817.535 926.78125,1818.625 C 935.87262,1831.757 942.96875,1827.7188 942.96875,1827.7188 C 942.96877,1827.7187 1166.9277,1845.2044 1231.8438,1841.875 C 1334.1678,1836.6788 1413.6791,1808.539 1461.1563,1798.4375 C 1508.6333,1788.336 1546.0155,1750.9429 1525.8125,1731.75 C 1522.6238,1728.7207 1510.8466,1719.99 1495.6563,1709.0938 C 1480.8889,1705.8916 1465.2921,1704.8373 1453.0625,1704.7813 z " /> + <path + style="color:black;fill:#4c75a1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible" + d="M 1043.3753,1607.2495 C 1110.3746,1638.7505 1241.0441,1666.2137 1339.3753,1689.2495 L 1334,1678 L 1034,1594 L 1043.3753,1607.2495 z " + sodipodi:nodetypes="ccccc" + id="path2992" /> + <path + style="color:black;fill:#6ea9d5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible" + id="path2994" + d="M 1154,1556 L 1024,1564 L 1032,1596 C 1163.8555,1639.7684 1250.8514,1659.3815 1336,1678 L 1322,1626 L 1154,1556 z M 1372,1650 L 1384,1686 L 1446,1704 L 1372,1650 z " + sodipodi:nodetypes="cccccccccc" /> + <path + style="color:black;fill:url(#linearGradient3143);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1201.4927,1535.7713 C 1157.046,1536.7815 1068.1525,1535.7713 1010.5738,1541.8322 C 1201.0479,1637.8143 1308.2698,1670.0197 1467.1628,1800.4313 C 1514.6399,1790.3298 1552.0156,1752.9541 1531.8126,1733.7612 C 1521.4554,1723.9219 1420.6958,1653.9592 1405.5435,1644.8678 C 1390.3912,1635.7764 1231.7973,1546.883 1201.4927,1535.7713 z " + sodipodi:nodetypes="cccssc" + id="path3008" /> + <path + style="color:black;fill:#184177;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible" + id="path3040" + d="M 1086,1566 C 1068,1566 1014,1568 1002,1572 C 990,1576 986,1584 994,1594 C 1002,1604 1018,1608 1032,1608 C 1046,1608 1106,1610 1110,1600 C 1114,1590 1112,1576 1102,1570 C 1092,1564 1086,1564 1086,1566 z " /> + <path + style="color:black;fill:#1a4680;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible" + id="path3042" + d="M 802,1590 C 816,1588 870,1584 870,1584 L 860,1624 C 860,1624 832,1632 828,1624 C 824,1616 798,1590 802,1590 z " /> + <path + style="color:black;fill:url(#linearGradient3145);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible" + id="path3054" + d="M 1086,1748 C 1098,1750 1170,1792 1188,1810 C 1206,1828 1216,1838 1216,1838 C 1216,1838 1186,1786 1162,1766 C 1138,1746 1120,1728 1112,1728 C 1104,1728 1086,1752 1086,1748 z " /> + </g> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2944);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.85526315;visibility:visible;display:inline;overflow:visible" + d="M 405.66291,214.21444 C 405.66291,214.21444 436.97763,237.44794 405.6886,214.32151 C 405.71429,214.42857 330.23183,229.19675 325.71429,233.71429 C 320,239.42857 295,292.28571 295,292.28571" + id="path2924" /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient2960);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.85526315;visibility:visible;display:inline;overflow:visible" + id="path2928" + sodipodi:nodetypes="csssc" + d="M 310.71428,303 C 312.14285,316.57143 320.71428,348.71429 328.57143,378 C 336.42857,407.28571 368.92857,490.14286 372.14285,495.67857 C 373.97171,498.82827 364.46428,514.25 364.46428,518.53571 C 364.46428,522.82142 374.28572,545.85714 374.28572,545.85714" /> + <path + style="opacity:1;color:black;fill:black;fill-opacity:0.30263157;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1142.1875,99.750032 C 1097.7408,100.76023 1008.8599,99.751632 951.2812,105.81253 C 893.70262,111.87353 710.87183,134.10473 698.75,136.12503 C 686.62817,138.14543 687.6258,142.18833 690.65625,145.21883 C 750.25527,201.78733 864.40863,371.49313 873.5,384.62503 C 882.59136,397.75703 889.65625,393.71883 889.65625,393.71883 C 889.65627,393.71873 1113.6465,411.17313 1178.5625,407.84383 C 1280.8866,402.64753 1360.3978,374.50783 1407.875,364.40633 C 1455.3521,354.30483 1492.7343,316.94293 1472.5313,297.75003 C 1462.174,287.91063 1361.4023,217.93523 1346.25,208.84383 C 1331.0978,199.75233 1172.4921,110.86173 1142.1875,99.750032 z M 1158.1875,110.81253 C 1201.5324,130.30313 1239.0798,151.33873 1280.625,174.46883 C 1344.1639,207.05073 1403.1865,247.21713 1460.625,289.62503 C 1465.7201,295.19363 1459.3367,303.65383 1461.75,311.40633 C 1455.5213,326.68703 1440.0107,335.79223 1425.375,341.96883 C 1404.6546,348.96473 1383.0983,353.82113 1361.9688,359.65633 C 1305.2556,374.08683 1247.8693,387.80073 1189.25,390.93753 C 1091.1562,394.69503 993.346,383.78543 895.53125,378.25003 C 889.18828,379.82653 886.5665,373.84663 883.15625,369.81253 C 829.6456,295.32933 779.53599,217.81223 717.34375,150.09383 C 765.92012,143.17733 815.62684,137.89733 864.71875,131.96883 C 950.1476,118.94013 1036.8226,111.07603 1123.1875,110.93753 C 1128.1875,110.89583 1153.1875,110.85423 1158.1875,110.81253 z " + id="path2993" /> + <use + x="0" + y="0" + xlink:href="#path2744" + id="use4125" + style="filter:url(#filter4139)" /> + <path + style="opacity:1;color:black;fill:black;fill-opacity:0.1842105;fill-rule:evenodd;stroke:none;stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 481.24773,109.96447 C 435.34721,112.28647 389.53367,117.0681 344.43523,125.71447 C 337.11499,128.19271 330.74254,132.65842 324.71648,137.30822 C 353.08617,162.16634 380.98495,187.7046 411.52898,209.55822 C 413.09557,206.34504 414.77574,203.13089 416.49773,199.93322 C 394.90233,186.48643 374.10949,169.1597 360.15398,155.90197 C 365.15398,145.18769 370.86379,140.16536 384.43523,127.30822 C 409.94324,123.3839 445.52563,121.86778 471.65398,121.08947 C 475.42332,116.61121 478.70818,112.82887 481.24773,109.96447 z M 713.12273,234.58947 C 705.71323,258.8358 686.01622,309.31718 679.62273,353.37072 C 713.92701,366.66493 750.78553,371.82612 787.31023,375.37072 C 793.54817,375.99221 799.7859,376.51971 806.02898,377.08947 C 775.28355,329.39251 746.1125,280.67101 713.12273,234.58947 z M 717.31023,260.90197 C 718.02452,260.18768 743.02449,298.73679 782.31023,362.30822 C 735.88166,357.30822 692.31021,342.30822 692.31023,342.30822 C 692.31023,342.30822 703.0245,289.47339 717.31023,260.90197 z " + id="path3024" /> + <g + id="g3639"> + <path + style="opacity:1;color:black;fill:url(#linearGradient3288);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3280" + sodipodi:nodetypes="csscsccsc" + d="M 544.28571,615.14286 C 502.85714,590.85714 445.71429,549.42857 421.42857,533.71429 C 397.14286,518 368.57143,493.71429 354.28571,479.42857 C 340,465.14286 317.14286,445.14286 312.85714,435.14286 C 290,446.57143 297.14286,456.57143 295.71429,462.28571 C 294.28571,468 291.42857,472.28571 291.42857,472.28571 L 218.57143,436.57143 C 218.57143,436.57143 348.57143,509.42857 364.28571,518 C 380,526.57143 548.57143,619.42857 544.28571,615.14286 z " /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3310);stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3302" + d="M 291.89344,471.33463 C 256.17916,395.62034 254.28571,382.28571 245.71429,353.71429 C 237.14286,325.14286 222.85714,286.57143 220,259.42857" + sodipodi:nodetypes="csc" /> + <path + style="opacity:0.53913043;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3343);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3466" + d="M 162.63456,229.06071 L 467.70063,378.56329" /> + <path + style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3313" + d="M 220.21325,257.35513 C 230.31478,301.80185 245.5406,343.25376 250.73194,363.42115 C 257.61909,390.17647 287.84328,458.35575 292.89404,469.46743 C 301.91998,453.44571 313.14729,436.15213 313.14729,436.15213 C 313.14729,436.15213 284.86302,376.55313 278.8021,352.30947 C 272.74119,328.06581 261.62951,279.57849 261.62951,279.57849 L 220.21325,257.35513 z " + sodipodi:nodetypes="csccscc" /> + <path + style="opacity:1;color:black;fill:url(#radialGradient3328);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 277.22995,287.19347 C 278.76005,305.9259 289.25026,344.10569 297.33148,366.87002 C 304.29823,386.49495 305.81009,407.50891 322.16687,447.61044 C 316.43155,441.448 317.20277,442.83451 311.71872,435.43784 C 296.94896,410.89831 283.43445,375.83884 277.37353,351.59518 C 271.31262,327.35152 260.20094,278.8642 260.20094,278.8642 L 277.22995,287.19347 z " + sodipodi:nodetypes="csccscc" + id="path3469" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3074);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible" + id="path3066" + d="M 313.9554,436.75824 C 323.14779,448.77906 344.36099,470.69937 348.60363,474.2349 C 352.84627,477.77043 371.23105,495.4481 371.23105,495.4481 L 347.18942,438.87956 L 302.64169,416.25215 L 313.9554,436.75824 z " /> + <path + d="M 163.5275,231.29306 L 557.77109,424.49853" + id="path3000" + style="opacity:0.41304345;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3919);stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3915)" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="csc" + d="M 289.9752,471.33463 C 254.26092,395.62034 252.36747,382.28571 243.79605,353.71429 C 235.22462,325.14286 220.9389,286.57143 218.08176,259.42857" + id="path3986" + style="opacity:0.38260869;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4012);stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4008)" /> + <path + style="opacity:0.10869565;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4016);stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4022)" + id="path4014" + d="M 329.55771,453.04593 C 307.89786,393.24881 295.66955,355.75004 284.73154,290.88513" + sodipodi:nodetypes="cc" /> + <use + x="0" + y="0" + xlink:href="#path3280" + id="use4143" + style="filter:url(#filter4161);opacity:0.9173913" /> + </g> + <path + style="opacity:1;color:black;fill:url(#radialGradient2922);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path2914" + sodipodi:nodetypes="ccsccc" + d="M 205,473 L 207.85714,503 C 207.85714,503 309.28571,541.57143 391.42857,585.85714 C 473.57143,630.14286 704.28571,747.28571 704.28571,747.28571 L 692.85715,720.85715 L 205,473 z " /> + <path + style="opacity:1;color:black;fill:url(#radialGradient3028);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3013" + sodipodi:nodetypes="ccsccccc" + d="M 761.55397,401.40291 L 756.60423,379.4826 C 756.60423,379.4826 697.20726,370.99732 688.01487,366.75468 C 678.82248,362.51204 577.70621,315.84299 577.70621,315.84299 L 594.67678,383.72524 L 662.55903,422.61611 L 673.16563,398.57448 C 673.16563,398.57448 723.37021,397.16027 761.55397,401.40291 z " /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.45394736;visibility:visible;display:inline;overflow:visible" + d="M 687.94679,365.35343 C 616.70335,338.43924 438.99996,236.8964 407.68524,213.6629 C 407.68524,213.6629 330.23183,229.19675 325.71429,233.71429 C 320,239.42857 295,292.28571 295,292.28571 C 295,292.28571 296.42857,295.14286 312.85714,302.28571 C 314.28571,315.85714 322.85714,348.71429 330.71429,378 C 338.57143,407.28571 373.57143,493.71429 374.28571,497.28571 C 375,500.85714 366.42857,513.71429 366.42857,518 C 366.42857,522.28571 377.14286,548 377.14286,548 L 675.71429,701.57143 C 675.71429,701.57143 668.57143,697.28571 668.57143,693 C 668.57143,688.71429 665.71429,625.85714 663.57143,573.71429 C 661.42857,521.57143 662.16391,437.14531 664.28571,423 C 666.42857,408.71429 687.94679,365.35343 687.94679,365.35343 z " + id="path1897" /> + <g + style="opacity:1;display:inline" + id="g3159" + transform="translate(-2.641884,-561.5901)"> + <path + style="color:black;fill:url(#linearGradient3177);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3089" + sodipodi:nodetypes="ccscccccccccsccsccsz" + d="M 819.54383,974.21723 C 783.31746,965.09822 758.63736,962.71531 730.75908,961.06724 C 776.39437,962.12044 815.84589,943.8445 823.55086,945.3846 C 844.20909,949.5138 884.75481,954.5533 884.75481,954.5533 C 884.75481,954.5533 1131.232,968.6954 1177.699,974.7563 C 1184.7701,978.7969 1184.7701,978.7969 1184.7701,978.7969 L 1190.831,972.736 C 1190.831,972.736 1415.0849,948.4924 1484.7854,918.1878 C 1489.8362,917.1776 1491.8565,917.1776 1491.8565,917.1776 L 1491.8565,913.137 C 1491.8565,913.137 1538.3235,871.7208 1492.8666,851.5177 C 1481.7549,845.4568 1481.7549,845.4568 1481.7549,845.4568 C 1481.7549,845.4568 1560.9961,861.62723 1608.024,886.8731 C 1655.011,912.097 1762.7716,997.9632 1831.982,1094.0769 C 1831.982,1094.0769 1845.2796,1109.9603 1857.8342,1140.9051 C 1838.3388,1171.7361 1785.8109,1228.3046 1690.8565,1258.6092 C 1595.9022,1288.9138 1398.9224,1326.2894 1303.0473,1329.4309 L 1250.9939,1274.9603 C 1250.9939,1274.9603 1066.7081,1107.8174 986.70821,1058.5317 C 906.70821,1009.246 855.10484,983.16875 819.54383,974.21723 z " /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3179);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3109" + d="M 1178,978 C 1178,978 1264,1060 1280,1080 C 1296,1100 1354,1176 1376,1210" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3181);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1178,978 C 1178,978 1264,1060 1280,1080 C 1296,1100 1354,1176 1376,1210 L 1374,1208 C 1374,1208 1218,1136 1168,1110 C 1118,1084 927.99997,956 927.99997,956 C 927.99997,956 1142,970 1178,978 z " + sodipodi:nodetypes="csccscc" + id="path3119" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3183);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1488,915 C 1488,915 1600.7516,975.6995 1622,990 C 1678.3886,1027.9505 1718.2001,1046.9778 1738,1080 C 1738,1080 1530,1074 1480,1048 C 1430,1022 1291.8654,960.62692 1291.8654,960.62692 C 1291.8654,960.62692 1452,928 1488,915 z " + sodipodi:nodetypes="cscscc" + id="path3129" /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#7a99d9;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3133" + d="M 1492,916 C 1526,930 1688,1014 1794,1122" /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3185);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1492,912 C 1526,926 1688,1010 1794,1118" + id="path3137" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3875);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1516,876 C 1573,887 1622,924 1668,972 C 1714,1020 1724,1041 1730,1050 C 1736,1059 1742,1072 1751,1080 C 1760,1088 1775,1117 1776,1129 C 1777,1141 1777,1149 1777,1149 L 1787,1142 C 1787,1142 1786,1154 1791,1162 C 1796,1170 1809,1174 1812,1174 C 1815,1174 1791,1194 1782,1203 C 1773,1212 1749,1224 1738,1225 C 1727,1226 1716,1238 1709,1242 C 1702,1246 1688,1245 1680,1245 C 1672,1245 1669,1251 1660,1251 C 1651,1251 1662,1249 1646,1249 C 1630,1249 1598,1259 1586,1259 C 1574,1259 1557,1256 1551,1256 C 1545,1256 1521,1270 1507,1270 C 1493,1270 1477,1263 1458,1263 C 1439,1263 1382,1274 1362,1280 C 1342,1286 1278.6891,1304.0674 1278.6891,1304.0674 L 1305.04,1326.08 C 1305.04,1326.08 1456.08,1318.48 1534,1300 C 1561.8628,1293.3919 1700.8868,1257.7496 1725,1247 C 1757.84,1232.36 1798.32,1208.72 1824,1182.5 C 1839.3459,1166.8314 1853.28,1151.44 1859,1140 C 1859,1140 1837.2311,1103.6399 1831.4,1095.64 C 1802.04,1055.36 1754.371,1007.035 1729.28,982.52 C 1699.4373,953.35054 1644.3563,910.269 1610.6323,890.47078 C 1594.7053,881.12058 1565.1202,868.00854 1530.1031,858.49311 C 1533.1031,866.49311 1532,864.83848 1532,864.83848 L 1498,851 C 1498,851 1517,866 1516,876 z " + sodipodi:nodetypes="cssssccsssssssssssssccssscssscccc" + id="path3149" /> + <use + x="0" + y="0" + xlink:href="#path3149" + id="use3857" + style="filter:url(#filter3871)" /> + <path + id="path2946" + sodipodi:nodetypes="csssssssssccsss" + d="M 1738,1225 C 1727,1226 1716,1238 1709,1242 C 1702,1246 1688,1245 1680,1245 C 1672,1245 1669,1251 1660,1251 C 1651,1251 1662,1249 1646,1249 C 1630,1249 1598,1259 1586,1259 C 1574,1259 1557,1256 1551,1256 C 1545,1256 1521,1270 1507,1270 C 1493,1270 1477,1263 1458,1263 C 1439,1263 1382,1274 1362,1280 C 1342,1286 1280,1303.9326 1280,1303.9326 L 1302.9726,1330.2149 C 1302.9726,1330.2149 1456.08,1318.48 1534,1300 C 1561.8628,1293.3919 1700.8868,1257.7496 1725,1247 C 1757.84,1232.36 1749,1224 1738,1225 z " + style="opacity:1;color:black;fill:url(#linearGradient2949);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + </g> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3182);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3166" + d="M 909.13729,592.69532 L 941.46217,594.71563 L 953.584,624.01005 L 991.9698,638.15219 C 991.9698,638.15219 1011.1627,641.18264 1019.2439,638.15219 C 1027.3251,635.12173 1031.3657,632.09127 1031.3657,632.09127 L 1250.5689,718.96439 C 1250.5689,718.96439 1366.7364,711.89332 1395.0207,706.84256 C 1395.0207,706.84256 1588.97,679.56844 1656.6502,652.29432 C 1724.3304,625.0202 1791.0005,586.63441 1805.1426,575.52273 C 1819.2847,564.41105 1831.4066,536.12678 1831.4066,536.12678" /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.36842107;visibility:visible;display:inline;overflow:visible" + d="M 909.13729,589.69532 L 941.46217,591.71563 L 953.584,621.01005 L 991.9698,635.15219 C 991.9698,635.15219 1011.1627,638.18264 1019.2439,635.15219 C 1027.3251,632.12173 1031.3657,629.09127 1031.3657,629.09127 L 1250.5689,715.96439 C 1250.5689,715.96439 1366.7364,708.89332 1395.0207,703.84256 C 1395.0207,703.84256 1588.97,676.56844 1656.6502,649.29432 C 1724.3304,622.0202 1791.0005,583.63441 1805.1426,572.52273 C 1819.2847,561.41105 1831.4066,533.12678 1831.4066,533.12678" + id="path3190" /> + <path + style="opacity:1;color:black;fill:#9fbbf1;fill-opacity:1;fill-rule:evenodd;stroke:#89a2db;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3010" + sodipodi:nodetypes="csc" + d="M 820.95094,386.55367 C 810.34434,395.74606 782.76718,400.13237 765.79661,398.01105 C 748.82605,395.88973 725.49153,396.45317 715.59203,374.53286" /> + <g + style="opacity:1;display:inline" + id="g3138" + transform="translate(-26,12)"> + <path + style="opacity:1;color:black;fill:#0d1021;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3134" + sodipodi:nodetypes="cscsc" + d="M 1634.4173,588.01711 C 1639.4239,593.82868 1666.7798,620.28293 1673.2523,616.79474 C 1679.7248,613.30654 1662.33,580.60468 1657.8802,576.24443 C 1652.2167,574.50034 1646.1487,574.50034 1642.9125,575.80841 C 1639.6762,577.11647 1633.3559,582.92805 1634.4173,588.01711 z " /> + <path + style="opacity:1;color:black;fill:#c0c6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1636.2504,587.33066 C 1641.029,592.83866 1667.1394,617.91103 1673.3173,614.60505 C 1679.4951,611.29906 1662.8922,580.30543 1658.645,576.17295 C 1653.2394,574.51996 1647.4477,574.51996 1644.3588,575.7597 C 1641.2698,576.99944 1635.2373,582.50744 1636.2504,587.33066 z " + sodipodi:nodetypes="cscsc" + id="path3130" /> + <path + style="opacity:1;color:black;fill:#494d83;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3132" + sodipodi:nodetypes="cscsc" + d="M 1641.0142,590.19024 C 1645.109,594.68633 1667.483,615.15244 1672.7768,612.45383 C 1678.0705,609.75521 1663.8435,584.45568 1660.2041,581.08242 C 1655.5721,579.7331 1650.6092,579.7331 1647.9623,580.74508 C 1645.3154,581.75706 1640.1461,586.25314 1641.0142,590.19024 z " /> + <path + style="opacity:1;color:black;fill:#ebf0e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3136" + d="M 1656.0489,585.98123 C 1650.6163,588.06746 1655.2132,591.40541 1655.631,595.16063 C 1656.0489,598.91584 1656.0489,604.75728 1658.9742,604.34003 C 1661.8994,603.92279 1659.8099,597.6641 1661.8994,597.24686 C 1663.9889,596.8296 1670.6753,599.33309 1668.1679,595.99512 C 1665.6604,592.65716 1662.7353,591.40541 1660.2279,588.4847 C 1657.7204,585.56398 1655.2132,585.56398 1656.0489,585.98123 z " /> + </g> + <g + style="opacity:1;display:inline" + id="g3324" + transform="translate(-210.08,-960.96)"> + <path + style="opacity:1;color:black;fill:url(#linearGradient3340);fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1187.4623,1436.4484 C 1194.5334,1440.489 1333.4293,1545.5449 1348.5816,1557.6667 C 1363.7338,1569.7885 1467.7796,1661.7124 1476.8709,1672.8241 C 1555.6628,1670.8038 1606.1705,1662.7226 1606.1705,1662.7226 C 1606.1705,1662.7226 1478.8912,1563.7276 1441.5156,1539.4839 C 1404.14,1515.2403 1325.3481,1466.753 1315.2465,1460.692 C 1305.145,1454.6311 1281.9115,1446.5499 1271.81,1445.5398 C 1261.7084,1444.5296 1187.4623,1436.4484 1187.4623,1436.4484 z " + sodipodi:nodetypes="csccsssc" + id="path3155" /> + <path + style="opacity:1;color:black;fill:#202c54;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1422.333,1622.4002 C 1453.3979,1650.0085 1472.8742,1665.7815 1477.7376,1671.7257 C 1556.5295,1669.7053 1598.9295,1663.1027 1605.5481,1662.3673 C 1605.5481,1662.3673 1579.6649,1640.958 1543.2124,1613.2078 C 1543.2124,1613.2078 1559.6435,1626.8251 1551.5542,1627.1928 L 1442.7745,1632.732 C 1433.9499,1633.8351 1422.333,1622.4002 1422.333,1622.4002 z " + sodipodi:nodetypes="ccccccc" + id="path3165" /> + <path + id="path2951" + sodipodi:nodetypes="csccsssc" + d="M 1187.4623,1436.4484 C 1194.5334,1440.489 1333.4293,1545.5449 1348.5816,1557.6667 C 1363.7338,1569.7885 1467.7796,1661.7124 1476.8709,1672.8241 C 1555.6628,1670.8038 1606.1705,1662.7226 1606.1705,1662.7226 C 1606.1705,1662.7226 1478.8912,1563.7276 1441.5156,1539.4839 C 1404.14,1515.2403 1325.3481,1466.753 1315.2465,1460.692 C 1305.145,1454.6311 1281.9115,1446.5499 1271.81,1445.5398 C 1261.7084,1444.5296 1187.4623,1436.4484 1187.4623,1436.4484 z " + style="opacity:1;color:black;fill:url(#linearGradient3844);fill-opacity:1.0;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3342);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1193.92,1438.16 C 1206.4,1448.56 1277.12,1498.48 1306.24,1520.32 C 1335.36,1542.16 1432.08,1626.4 1432.08,1626.4" + sodipodi:nodetypes="csc" + id="path3180" /> + <g + clip-path="url(#clipPath3321)" + transform="translate(216.32,-62.4)" + id="g3305"> + <path + style="opacity:1;color:black;fill:url(#linearGradient3344);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1052.3445,1512.1827 L 997.92562,1511.4474 L 1006.0149,1549.6877 L 1052.3445,1512.1827 z " + sodipodi:nodetypes="cccc" + id="path3301" /> + <path + style="opacity:1;color:black;fill:url(#radialGradient3346);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3348);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3271" + sodipodi:nodetypes="csccsc" + d="M 1101.6157,1537.9215 C 1101.6157,1553.3647 1101.6157,1567.3371 1087.6432,1567.3371 C 1073.6709,1567.3371 1014.8396,1547.4816 1014.8396,1547.4816 L 1022.9289,1529.8322 C 1022.9289,1529.8322 1017.7901,1514.2279 1044.2553,1513.6536 C 1068.5286,1513.1269 1088.3786,1529.8322 1101.6157,1537.9215 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3350);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1035.7458,1514.1206 C 1050.2085,1515.4979 1059.0099,1518.066 1059.0099,1533.9061 C 1059.0099,1549.7461 1050.7455,1554.567 1050.7455,1554.567 L 1022.9291,1527.8945 C 1022.9291,1527.8945 1024.2597,1514.8092 1035.7458,1514.1206 z " + sodipodi:nodetypes="csccc" + id="path3289" /> + <path + transform="matrix(0.818861,0,0,0.818861,108.7186,219.3779)" + sodipodi:cy="1611.8282" + sodipodi:type="arc" + sodipodi:cx="1141.6946" + style="opacity:1;color:black;fill:url(#radialGradient3352);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3291" + sodipodi:rx="18.752472" + d="M 1160.4471 1611.8282 A 18.752472 23.164818 0 1 1 1122.9421,1611.8282 A 18.752472 23.164818 0 1 1 1160.4471 1611.8282 z" + sodipodi:ry="23.164818" /> + <path + transform="matrix(1.330649,0,0,1.541385,-556.0913,-957.7293)" + sodipodi:cy="1616.2406" + sodipodi:type="arc" + sodipodi:cx="1206.0413" + style="opacity:1;color:black;fill:url(#radialGradient3354);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3293" + sodipodi:rx="5.8831282" + d="M 1211.9244 1616.2406 A 5.8831282 6.250824 0 1 1 1200.1581,1616.2406 A 5.8831282 6.250824 0 1 1 1211.9244 1616.2406 z" + sodipodi:ry="6.250824" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3356);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1136.9145,1571.014 L 1032.489,1544.54 L 1090.5849,1608.519 L 1136.9145,1571.014 z " + id="path3259" /> + <path + inkscape:transform-center-y="-16.160042" + transform="matrix(1.093875,0,0.39879,0.998849,-751.9213,1.854308)" + sodipodi:cy="1611.0929" + sodipodi:type="arc" + sodipodi:cx="1143.1654" + style="opacity:1;color:black;fill:url(#radialGradient5012);fill-opacity:1.0;fill-rule:evenodd;stroke:url(#linearGradient3360);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + inkscape:transform-center-x="-66.767625" + id="path3199" + sodipodi:rx="34.931072" + d="M 1178.0965 1611.0929 A 34.931072 39.343422 0 1 1 1108.2343,1611.0929 A 34.931072 39.343422 0 1 1 1178.0965 1611.0929 z" + sodipodi:ry="39.343422" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3362);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1106.0282,1580.5742 C 1121.4714,1582.0449 1145.0039,1587.9281 1145.0039,1604.8421 C 1145.0039,1621.7561 1136.1792,1626.9038 1136.1792,1626.9038 L 1099.4097,1595.282 C 1099.4097,1595.282 1101.6158,1581.3095 1106.0282,1580.5742 z " + id="path3249" /> + <path + transform="translate(-14.70782,-0.735389)" + sodipodi:cy="1611.8282" + sodipodi:type="arc" + sodipodi:cx="1141.6946" + style="opacity:1;color:black;fill:url(#radialGradient3364);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3227" + sodipodi:rx="18.752472" + d="M 1160.4471 1611.8282 A 18.752472 23.164818 0 1 1 1122.9421,1611.8282 A 18.752472 23.164818 0 1 1 1160.4471 1611.8282 z" + sodipodi:ry="23.164818" /> + <path + transform="matrix(1.625,0,0,1.882353,-826.5795,-1438.229)" + sodipodi:cy="1616.2406" + sodipodi:type="arc" + sodipodi:cx="1206.0413" + style="opacity:1;color:black;fill:url(#radialGradient3366);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3239" + sodipodi:rx="5.8831282" + d="M 1211.9244 1616.2406 A 5.8831282 6.250824 0 1 1 1200.1581,1616.2406 A 5.8831282 6.250824 0 1 1 1211.9244 1616.2406 z" + sodipodi:ry="6.250824" /> + <path + style="fill:url(#linearGradient5008);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 1139.4511,548.07893 C 1133.2012,545.73519 1052.342,525.81334 1052.342,525.81334 C 1052.342,525.81334 1105.0763,563.70391 1105.0763,563.70391 C 1109.6261,555.79874 1116.2816,546.34848 1139.4511,548.07893 z " + id="path5000" + transform="translate(-6.24,1023.36)" + sodipodi:nodetypes="ccsc" /> + <path + sodipodi:nodetypes="ccsc" + transform="translate(-6.24,1023.36)" + id="path5014" + d="M 1139.4511,548.07893 C 1133.2012,545.73519 1052.342,525.81334 1052.342,525.81334 C 1052.342,525.81334 1105.0763,563.70391 1105.0763,563.70391 C 1109.6261,555.79874 1116.2816,546.34848 1139.4511,548.07893 z " + style="fill:url(#linearGradient5022);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.53043478" /> + </g> + <path + style="opacity:0.53043476;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter5154);enable-background:accumulate" + id="path5120" + d="M 1260.6097,709.68561 C 1257.6313,704.30499 1239.4961,688.30688 1234.577,684.7353 C 1228.2945,680.6957 1222.9763,679.17553 1224.0869,670.89591 C 1229.2219,665.71476 1236.5969,667.5455 1243.1906,667.69223 C 1249.4113,667.46897 1255.5898,667.91808 1261.7893,668.32645 C 1267.6422,669.15685 1273.5001,668.84644 1279.3758,668.57004 C 1285.2286,668.33741 1291.0871,668.40966 1296.9426,668.44226 C 1303.0974,668.32722 1309.116,667.17398 1315.1554,666.12154 C 1321.2855,664.59528 1327.4489,665.08165 1333.6472,665.66824 C 1339.4381,666.36866 1345.0483,664.5506 1350.7503,665.85513 C 1356.0675,668.54094 1361.4074,671.31639 1366.4208,674.54242 C 1368.9944,676.18397 1380.7414,685.76626 1382.8034,687.97895 C 1384.7121,690.02703 1372.4913,685.70059 1370.5986,683.63778 L 1395.266,701.22932 C 1393.4024,699.19824 1366.8843,679.56838 1364.5526,678.04932 C 1359.8751,674.95511 1354.7869,672.47209 1349.8852,669.75235 C 1344.3862,669.14513 1338.8855,669.99885 1333.2771,669.61947 C 1327.3648,669.05538 1321.5066,668.56124 1315.6556,670.03526 C 1309.4299,671.14148 1303.2094,672.27139 1296.864,672.40329 C 1291.0632,672.37703 1285.259,672.3107 1279.4613,672.54699 C 1273.4672,672.80913 1267.4891,673.12262 1261.5222,672.25095 C 1255.3642,671.87067 1249.2292,671.43545 1243.0526,671.64262 C 1237.7859,671.51322 1232.0143,670.11783 1227.418,673.07591 C 1228.1031,674.37246 1231.8653,679.74443 1236.5843,681.30791 C 1241.7547,685.04603 1246.2248,689.19799 1249.3066,694.8863 C 1250.6351,697.33819 1261.9602,712.12539 1260.6097,709.68561 z " + transform="matrix(0.932847,-2.173754e-2,2.173754e-2,0.932847,282.4787,1035.819)" + sodipodi:nodetypes="cccccccccccsccccccccccccsc" /> + <path + style="opacity:0.53043476;color:black;fill:#2f5586;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter5194)" + id="path5164" + d="M 1405.28,1598.9689 C 1408.5084,1603.5631 1412.5544,1607.5013 1417.0856,1610.7914 C 1421.5033,1614.403 1426.0316,1617.8695 1430.4945,1621.4221 C 1434.8239,1625.8799 1438.1193,1627.7707 1444.3084,1627.4335 C 1450.4682,1626.3484 1456.653,1626.1557 1462.8803,1626.0455 C 1468.7654,1625.8212 1527.2793,1627.0102 1533.149,1627.3891 C 1535.9556,1627.5702 1483.0042,1630.7045 1480.198,1630.5183 L 1480.198,1630.5183 C 1474.4214,1630.135 1487.0152,1627.2823 1481.223,1627.493 C 1475.0342,1627.6316 1450.5006,1630.2885 1444.3804,1631.3774 C 1437.4396,1631.7493 1433.1059,1629.754 1428.3131,1624.7551 C 1423.9114,1621.2114 1419.3929,1617.815 1415.0452,1614.201 C 1410.1759,1610.6946 1388.3146,1590.6488 1384.7734,1585.7857 C 1383.1077,1583.4985 1403.6531,1596.6538 1405.28,1598.9689 z " + sodipodi:nodetypes="cccccsccccccsc" /> + </g> + <path + style="opacity:1;color:black;fill:url(#linearGradient2753);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 218.2913,105.33514 C 221.37881,104.86014 244.52449,105.13105 249.0731,104.59612 C 286.777,100.16207 368.65601,93.953045 394.90498,90.67193 C 424.32062,86.99497 471.38564,81.11185 486.09346,81.11185 C 500.80128,81.11185 540.5124,81.11185 552.27865,82.58263 C 564.04491,84.05341 571.39882,106.85053 541.98318,103.90897 C 512.56754,100.9674 486.09346,101.70279 466.2379,102.43819 C 446.38235,103.17358 352.2523,114.20444 345.63378,117.14601 C 339.01526,120.08757 314.74735,136.26617 314.74735,136.26617 L 405.93585,213.11453 C 405.93585,213.11453 325.04283,150.2386 311.0704,139.20774 C 297.09797,128.17687 261.06381,113.46905 255.91607,111.26288 C 250.76834,109.0567 217.55591,105.33514 218.2913,105.33514 z " + sodipodi:nodetypes="csssssssccssc" + id="path2744" /> + <path + style="opacity:1;color:black;fill:url(#radialGradient2993);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="M 624.9099,362.64482 C 624.09528,371.41246 616.44404,377.72566 606.63474,377.19246 C 606.63474,377.19246 598.87477,378.0361 604.58709,382.60576 C 621.10593,395.82025 658.50309,402.80443 666.47502,413.26303 C 669.6844,405.24161 670.24637,402.3972 671.50922,400.269 C 675.26049,393.94718 653.17204,375.81556 624.9099,362.64482 z " + id="path2977" + sodipodi:nodetypes="ccscsc" + transform="matrix(1.017743,0,0,0.97895,-11.88466,7.633765)" /> + <g + id="g3114"> + <path + style="opacity:1;color:black;fill:url(#linearGradient3091);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 610.23313,317.25719 C 610.23313,317.25719 598.91942,359.6836 596.7981,366.75467 C 594.67678,373.82573 601.04074,381.60391 605.99049,383.01812 C 610.94024,384.43233 622.25395,384.43233 626.49659,373.11863 C 630.73923,361.80492 636.39608,313.01455 636.39608,313.01455 L 610.23313,317.25719 z " + sodipodi:nodetypes="cssscc" + id="path3043" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3088);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3047" + d="M 630.03213,315.84298 C 626.49659,325.03537 623.66816,333.52065 619.42552,336.34908 C 615.18288,339.17751 607.40471,352.61254 607.40471,348.3699 C 607.40471,344.12726 607.40471,341.29883 601.04075,340.59172 C 594.67679,339.88461 516.89504,332.10644 508.40976,329.27801 C 499.92448,326.44959 487.90367,313.01456 487.90367,309.47902 C 487.90367,305.94349 630.03213,316.55009 630.03213,315.84298 z " /> + <path + style="opacity:1;color:black;fill:url(#radialGradient3083);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 487.82661,309.06261 C 487.82661,309.06261 612.78264,315.54446 620.56082,315.54446 C 628.33899,315.54446 637.10319,315.84299 637.10319,310.18613 C 637.10319,304.52928 633.56766,291.09425 627.2037,284.73029 C 620.83974,278.36633 603.16207,268.46684 589.72704,268.46684 C 576.29201,268.46684 526.08743,267.75973 511.9453,276.95212 C 497.80316,286.1445 488.53372,294.21337 487.82661,309.06261 z " + sodipodi:nodetypes="csssssc" + id="path3057" /> + <path + style="opacity:0.23043478;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4877);enable-background:accumulate" + id="path4827" + d="M 672.07967,364.71084 C 670.42546,367.09722 667.6541,367.90897 665.12408,369.03759 C 661.84684,370.84217 658.86544,373.12904 655.77552,375.23387 C 652.90706,376.82391 650.61188,381.34386 647.23238,380.84 C 645.2797,383.53727 641.40304,382.52314 638.35458,383.56296 C 635.0111,383.653 632.64311,384.42579 629.47719,384.25502 C 626.47028,384.38201 623.38674,382.77046 621.49606,380.48683 C 621.21102,380.15219 620.92599,379.81754 620.64095,379.4829 C 610.74633,367.8662 616.36466,345.22463 624.35511,358.22478 L 624.35511,358.22478 C 624.59646,358.61746 624.83782,359.01014 625.07918,359.40282 C 626.83581,361.71888 628.11608,362.94479 631.22893,362.78295 C 634.30209,362.79263 636.3171,363.77923 639.57541,362.89681 C 642.51192,362.74924 645.52592,360.42208 647.93092,361.13382 C 650.1124,358.71938 653.49086,358.40258 656.108,356.28295 C 659.2285,354.04751 662.60734,352.15958 665.42704,349.54001 C 667.55521,347.38156 669.52413,345.01154 671.97224,343.20794 C 684.21379,334.18921 680.74194,352.21452 672.07967,364.71084 z " + transform="matrix(1,0,-0.718026,1,264.3032,6)" /> + </g> + <path + style="opacity:1;color:black;fill:url(#linearGradient3659);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 451.35998,84.08005 C 497.11997,79.92005 533.51997,83.04005 556.39997,86.16005 C 579.27997,89.28005 623.99997,102.80005 623.99997,102.80005 C 623.99997,102.80005 867.35996,80.960049 893.35995,83.040049 C 919.35995,85.120049 1013.9999,102.28005 1013.9999,102.28005 L 1143.9999,99.68005 C 1117.9999,90.32005 1070.9668,79.065394 1029.5999,70.56005 C 973.95995,59.12005 892.31996,56.52005 857.99996,54.96005 C 826.76296,53.540186 744.63996,49.76005 711.35996,52.88005 C 678.07997,56.00005 548.07997,67.44005 523.11997,71.60005 C 498.15997,75.76005 450.31998,84.08005 451.35998,84.08005 z " + sodipodi:nodetypes="cscsccssssc" + id="path3651" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3648);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;" + d="M 689.79677,145.09086 C 686.11982,133.72341 690.53216,113.83034 695.6799,108.14662 C 700.82764,102.46288 885.41078,20.048761 917.76799,5.8394101 C 950.12519,-8.3699012 1064.1108,-31.104839 1069.9939,-31.104839 C 1075.8771,-31.104839 1089.8495,-39.630427 1070.7293,-59.523501 C 1051.6092,-79.416577 980.27622,-122.04455 949.3898,-133.41204 C 918.50338,-144.77949 892.76469,-161.8307 883.20461,-164.67256 C 873.64453,-167.51443 849.37662,-187.40746 838.34576,-178.88188 C 827.31489,-170.35629 807.45934,-133.41204 819.96098,-130.57014 C 832.46263,-127.72828 857.46592,-122.04455 847.90584,-119.20269 C 838.34576,-116.36083 750.83423,-87.942164 732.44945,-82.258439 C 714.06468,-76.574675 633.17167,-22.579252 622.1408,-22.579252 C 660.38114,37.099974 683.17825,113.83034 689.79677,145.09086 z " + sodipodi:nodetypes="csssssssssscc" + id="path3640" + transform="matrix(1,0,0,0.255782,0,107.9793)" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3670);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 538.71997,84.080047 C 552.23997,75.760047 582.39997,71.600048 602.15997,69.520048 C 621.91997,67.440048 683.27997,63.280048 683.27997,63.280048 L 629.19997,59.120048 C 629.19997,59.120048 555.35997,66.400048 528.31997,70.560048 C 501.27997,74.720048 457.59998,83.040047 457.59998,83.040047 C 457.59998,83.040047 515.83997,82.000047 538.71997,84.080047 z " + id="path3662" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3680);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 315.48275,142.88469 L 355.99906,187.62087 L 376.8879,197.67132 L 400.42041,214.21762 L 407.03893,213.48222 L 315.48275,142.88469 z " + sodipodi:nodetypes="cccccc" + id="path3672" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3694);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 79.039996,133.48004 C 96.719995,131.92004 107.63999,131.40004 118.03999,131.92004 C 128.43999,132.44004 151.05999,140.50004 151.05999,140.50004 L 167.69999,137.12004 C 167.69999,137.12004 152.87999,128.28004 137.79999,127.24004 C 122.71999,126.20004 107.63999,124.12004 99.839995,126.20004 C 92.039995,128.28004 79.039996,133.48004 79.039996,133.48004 z " + sodipodi:nodetypes="csccssc" + id="path3686" /> + <path + style="opacity:1;color:black;fill:#a4b0ea;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 186.15999,105.92005 C 210.68921,105.43701 222.94616,105.66005 242.70616,105.40005 C 292.01695,101.36622 366.07998,93.440047 366.07998,93.440047 L 458.63998,82.000047 L 485.67998,77.840047 C 485.67998,77.840047 395.28036,82.546991 355.67998,85.855438 C 314.6892,89.280047 201.75999,101.76005 186.15999,105.92005 z " + sodipodi:nodetypes="cccccsc" + id="path3699" /> + <path + style="opacity:1;color:black;fill:#7a8cbd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3701" + sodipodi:nodetypes="cccccsc" + d="M 186.15999,105.92005 C 210.13767,104.15008 207.4268,102.49544 229.57141,103.40927 C 278.8822,97.295437 362.77072,89.395396 362.77072,89.395396 L 458.63998,82.000047 L 485.67998,77.840047 C 485.67998,77.840047 395.28036,82.546991 355.67998,85.855438 C 314.6892,89.280047 201.75999,101.76005 186.15999,105.92005 z " /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3721);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 240.75999,171.44004 C 268.31999,184.44004 312.51999,209.92004 327.33998,219.28004" + sodipodi:nodetypes="cc" + id="path3705" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3731);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1322.9685,950.34403 C 1283.2573,940.04855 1211.9244,915.04526 1211.9244,915.04526 C 1211.9244,915.04526 1057.4923,875.33414 975.12849,850.33085 C 985.42396,878.27571 991.30709,887.1004 991.30709,887.1004 C 991.30709,887.1004 1209.7182,938.57777 1322.9685,950.34403 z " + sodipodi:nodetypes="ccccc" + id="path3723" /> + <path + style="opacity:1;color:black;fill:#201e2b;fill-opacity:0.73026315;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1360.3199,219.28004 C 1384.2399,239.04004 1400.8799,247.36004 1410.2399,259.84004 C 1419.5999,272.32004 1431.0399,286.88004 1445.5999,298.32003 C 1460.1599,309.76003 1475.7599,323.28003 1475.7599,323.28003 C 1475.7599,323.28003 1486.1599,309.76003 1476.7999,301.44003 C 1467.4399,293.12004 1374.8799,226.56004 1360.3199,219.28004 z " + id="path2273" /> + <path + style="opacity:1;color:black;fill:#201e2b;fill-opacity:0.73026315;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1452.8799,283.76004 C 1438.3199,306.64003 1397.7599,325.36003 1377.9999,333.68003 C 1358.2399,342.00003 1198.0799,372.16003 1176.2399,372.16003 C 1154.3999,372.16003 880.87996,369.04003 880.87996,369.04003 L 896.47996,392.96003 C 896.47996,392.96003 1138.7999,410.64003 1173.1199,406.48003 C 1207.4399,402.32003 1407.1199,370.08003 1422.7199,363.84003 C 1438.3199,357.60003 1462.2399,343.04003 1467.4399,337.84003 C 1472.6399,332.64003 1487.1999,309.76003 1477.8399,302.48003 C 1468.4799,295.20004 1452.8799,283.76004 1452.8799,283.76004 z " + sodipodi:nodetypes="cssccssssc" + id="path3167" /> + <g + style="display:inline" + id="g3224"> + <path + style="opacity:1;color:black;fill:url(#linearGradient3178);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3170" + sodipodi:nodetypes="ccssscsccccsc" + d="M 1496.5599,303.00003 C 1488.7599,297.80003 1478.3599,291.04003 1478.3599,291.04003 C 1478.3599,291.04003 1486.6799,308.72003 1484.0799,318.08003 C 1481.4799,327.44003 1462.2399,346.68003 1454.4399,351.88003 C 1446.6399,357.08003 1424.2799,365.40003 1411.7999,371.12003 C 1400.2112,376.43153 1312.9999,396.60003 1312.9999,396.60003 C 1312.9999,396.60003 1409.7199,382.04003 1426.8799,376.32003 C 1444.0399,370.60003 1486.1599,356.56003 1486.1599,356.56003 L 1490.3199,358.12003 L 1492.3999,353.44003 L 1507.9999,336.80003 C 1507.9999,336.80003 1503.8399,332.12003 1501.7599,325.36003 C 1499.6799,318.60003 1496.5599,303.00003 1496.5599,303.00003 z " /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3181" + sodipodi:nodetypes="cssc" + d="M 1480.3199,293.08003 C 1484.4799,304.52003 1485.5199,319.08003 1481.3599,326.36003 C 1477.1999,333.64003 1466.2799,346.64003 1450.1599,354.96003 C 1434.0399,363.28003 1374.2399,381.22003 1350.8399,386.42003" /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3203);stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3183" + sodipodi:nodetypes="cssc" + d="M 1479.3999,292.56003 C 1483.5599,304.00003 1482.5199,319.08003 1478.3599,326.36003 C 1474.1999,333.64003 1463.2799,346.64003 1447.1599,354.96003 C 1431.0399,363.28003 1373.3199,381.22003 1349.9199,386.42003" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3237);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3205" + sodipodi:nodetypes="ccsccc" + d="M 1496.0399,302.48003 C 1495.5199,312.88003 1506.7761,338.48079 1506.7761,338.48079 C 1506.7761,338.48079 1513.7199,331.08003 1513.7199,323.80003 C 1513.7199,316.52003 1512.5646,314.59233 1512.5646,314.59233 L 1500.1999,302.48003 L 1496.0399,302.48003 z " /> + <path + style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3210" + d="M 1513.7199,320.68003 C 1513.7199,310.28003 1511.6399,303.52003 1507.4799,299.88003 C 1503.3199,296.24003 1485.1199,289.48003 1485.1199,289.48003 L 1502.7999,299.88003 L 1500.1999,304.04003 L 1513.7199,320.68003 z " /> + </g> + <g + style="display:inline" + id="g3285"> + <path + style="opacity:1;color:black;fill:url(#linearGradient3275);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3273" + d="M 1492.1084,342.17566 C 1471.8851,336.66022 1436.5864,334.82174 1428.1294,335.55714 C 1419.6724,336.29253 1377.3874,345.11722 1375.5489,346.22031 C 1373.7104,347.32339 1365.6211,359.45734 1365.6211,359.45734 L 1350.9133,356.51578 L 1350.9133,342.54335 C 1350.9133,342.54335 1436.5864,327.46783 1442.4695,327.46783 C 1448.3526,327.46783 1494.3145,336.66022 1494.3145,336.66022 L 1492.1084,342.17566 z " /> + <path + style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3240" + sodipodi:nodetypes="cccssscsscc" + d="M 1503.3199,338.36003 C 1494.7399,333.42003 1465.6199,323.28003 1454.1799,323.28003 C 1445.3399,318.08003 1448.7199,320.68003 1448.7199,320.68003 C 1448.7199,320.68003 1427.9268,321.95005 1405.0104,325.60107 C 1379.3059,329.69629 1351.0643,336.25021 1349.1399,336.80003 C 1347.3633,337.30762 1347.0996,340.16875 1350.7559,342.96511 C 1354.5909,345.89819 1362.3999,348.76003 1362.3999,348.76003 C 1362.3999,348.76003 1381.3799,337.06003 1398.5399,334.98003 C 1415.6999,332.90003 1453.9199,329.52003 1466.3999,331.60003 C 1478.8799,333.68003 1492.9199,342.52003 1492.9199,342.52003 L 1503.3199,338.36003 z " /> + <path + style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3242" + sodipodi:nodetypes="cssccccsscscsc" + d="M 1494.4799,342.26003 C 1471.5999,334.98003 1448.7199,333.16003 1438.3199,333.68003 C 1427.9199,334.20003 1377.9999,342.52003 1374.8799,344.60003 C 1371.7599,346.68003 1364.9999,358.64003 1364.9999,358.64003 L 1353.5599,355.52003 L 1349.3999,360.20003 L 1369.1599,363.32003 C 1369.1599,363.32003 1372.7999,349.28003 1379.5599,347.72003 C 1386.3199,346.16003 1423.2399,337.32003 1430.5199,337.84003 C 1437.7999,338.36003 1448.7199,338.88003 1448.7199,338.88003 C 1448.7199,338.88003 1452.3599,342.52003 1454.9599,342.52003 C 1457.5599,342.52003 1460.6799,339.92003 1460.6799,339.92003 C 1460.6799,339.92003 1472.1199,341.48003 1475.2399,344.08003 C 1478.3599,346.68003 1493.9599,343.30003 1494.4799,342.26003 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3271);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3269" + d="M 1353.1195,351.73574 C 1353.8549,347.69109 1349.8102,337.39561 1346.8686,337.39561 C 1343.9271,337.39561 1343.9271,341.44026 1339.8824,341.44026 C 1335.8378,341.44026 1301.2744,344.01413 1298.3328,342.91105 C 1295.3913,341.80796 1295.3913,340.70487 1290.6112,340.70487 C 1285.8312,340.70487 1282.5219,343.27874 1281.0512,343.27874 C 1279.5804,343.27874 1280.3158,346.22031 1275.5357,346.22031 C 1270.7557,346.22031 1140.9592,356.88348 1139.1207,359.08965 C 1137.2822,361.29582 1131.3991,370.8559 1135.076,370.8559 C 1138.753,370.8559 1353.4872,352.83882 1353.1195,351.73574 z " /> + <path + style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3244" + d="M 1354.0799,349.80003 C 1349.9199,346.16003 1346.7999,344.60003 1340.5599,349.28003 C 1330.1599,350.84003 1300.5199,351.88003 1300.5199,351.88003 C 1300.5199,351.88003 1298.4399,348.24003 1295.3199,348.24003 C 1292.1999,348.24003 1289.0799,351.88003 1289.0799,351.88003 C 1289.0799,351.88003 1289.5999,348.24003 1285.4399,348.24003 C 1281.2799,348.24003 1275.5599,353.44003 1275.5599,353.44003 L 1136.1999,367.48003 L 1133.5999,373.72003 L 1269.8399,363.32003 L 1351.4799,357.08003 L 1354.0799,349.80003 z " /> + <path + style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3246" + sodipodi:nodetypes="ccssssccccssssc" + d="M 1428.4399,373.20003 C 1412.8399,374.24003 1387.3599,382.04003 1368.1199,380.48003 C 1305.7199,387.76003 1279.1999,392.96003 1267.7599,395.04003 C 1256.3199,397.12003 1236.5599,400.24003 1226.1599,398.16003 C 1215.7599,396.08003 1173.1199,377.36003 1163.2399,375.80003 C 1153.3599,374.24003 1136.1999,371.64003 1125.7999,371.64003 C 1115.3999,371.64003 1077.6999,363.84003 1077.6999,363.84003 L 1060.7999,370.60003 L 879.62457,366.85999 L 876.71996,377.88003 C 876.71996,377.88003 1076.3999,377.36003 1097.7199,378.92003 C 1119.0399,380.48003 1165.8399,383.08003 1177.7999,387.76003 C 1189.7599,392.44003 1219.9199,405.96003 1227.1999,405.44003 C 1234.4799,404.92003 1313.5199,395.56003 1333.2799,393.48003 C 1353.0399,391.40003 1428.9599,373.72003 1428.4399,373.20003 z " /> + <path + style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3250" + d="M 1060.7999,382.56003 C 1093.0399,384.64003 1140.3599,385.68003 1150.2399,390.88003 C 1160.1199,396.08003 1169.9999,404.40003 1179.8799,404.92003 C 1189.7599,405.44003 1168.9599,408.04003 1159.5999,405.44003 C 1150.2399,402.84003 1139.3199,395.56003 1130.4799,395.56003 C 1121.6399,395.56003 1077.9599,393.48003 1072.7599,390.88003 C 1067.5599,388.28003 1061.8399,382.56003 1060.7999,382.56003 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3263);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3252" + d="M 1447.6172,320.48162 C 1436.5864,323.05549 1417.8339,325.62936 1414.8923,325.26166 C 1411.9508,324.89397 1357.8995,337.76331 1355.6933,337.76331 C 1353.4872,337.76331 1347.9717,339.23409 1347.9717,339.23409 L 1346.1333,334.82174 C 1346.1333,334.82174 1348.7071,331.14479 1352.0164,330.4094 C 1355.3256,329.67401 1398.7137,317.54006 1401.6553,317.54006 C 1404.5968,317.54006 1442.1018,314.59849 1442.1018,314.59849 L 1447.6172,320.48162 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3267);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3265" + d="M 1446.8818,320.11392 L 1451.2942,324.15858 C 1451.2942,324.15858 1473.7236,327.83553 1482.5483,330.0417 C 1491.373,332.24788 1503.8746,339.23409 1503.8746,339.23409 L 1506.8162,335.92483 C 1506.8162,335.92483 1482.5483,327.10014 1476.2975,325.99705 C 1470.0466,324.89397 1457.1773,322.68779 1453.868,321.58471 C 1450.5588,320.48162 1446.8818,319.37853 1446.8818,320.11392 z " /> + <path + style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3277" + d="M 1458.0799,343.56003 C 1446.6399,345.12003 1421.6799,346.68003 1421.6799,346.68003 L 1411.2799,338.36003 C 1411.2799,338.36003 1383.1999,342.00003 1377.4799,344.60003 C 1371.7599,347.20003 1353.5599,355.52003 1353.5599,355.52003 L 1347.8399,360.72003 L 1333.2799,360.72003 L 1327.5599,365.40003 L 1295.3199,367.48003 L 1298.4399,357.08003 L 1267.2399,360.20003 L 1280.2399,375.28003 L 1330.1599,370.60003 C 1330.1599,370.60003 1329.6399,374.24003 1333.7999,374.76003 C 1337.9599,375.28003 1350.9599,374.24003 1356.1599,374.24003 C 1361.3599,374.24003 1405.0399,366.96003 1410.7599,366.44003 C 1416.4799,365.92003 1457.0399,345.64003 1458.0799,343.56003 z " /> + <path + style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3279" + d="M 1188.1999,370.08003 C 1203.2799,370.60003 1250.0799,375.28003 1254.2399,377.36003 C 1258.3999,379.44003 1259.4399,388.28003 1259.4399,388.28003 C 1259.4399,388.28003 1228.7599,395.04003 1221.9999,393.48003 C 1215.2399,391.92003 1155.4399,371.12003 1155.4399,371.12003 L 1188.1999,370.08003 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3283);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3281" + sodipodi:nodetypes="cccccssscccccc" + d="M 1132.5022,366.44356 C 1119.2651,364.97278 1088.3787,362.7666 1088.3787,362.7666 L 1081.0248,356.88348 L 1066.317,357.61887 L 1060.4338,362.03121 C 1060.4338,362.03121 939.09433,359.08965 916.29721,359.08965 C 893.50009,359.08965 884.67539,359.08965 882.46922,362.03121 C 880.26305,364.97277 876.58609,368.64973 880.26305,370.12051 C 883.94,371.5913 1064.1108,370.85591 1064.1108,370.85591 L 1072.2001,367.17895 L 1084.7017,367.17895 L 1090.5849,370.85591 L 1137.6499,373.79747 L 1132.5022,366.44356 z " /> + </g> + <path + style="color:black;fill:url(#linearGradient3411);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1496.5599,904.12001 L 1491.3599,853.68001 L 1246.9599,905.16001 L 1323.9199,940.52 L 1496.5599,904.12001 z " + id="path3288" /> + <path + style="color:black;fill:#100f15;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1522.0399,780.88001 L 1473.1599,889.04001 C 1473.1599,889.04001 1336.3999,917.12 1323.9199,917.12 C 1311.4399,917.12 1270.3599,914 1270.3599,914 L 1230.8399,901.00001 L 1309.8799,774.64001 L 1522.0399,780.88001 z " + sodipodi:nodetypes="ccscccc" + id="path3202" /> + <path + style="color:black;fill:url(#linearGradient3407);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1810.1199,713.80001 L 1766.4399,762.68001 L 1784.6399,779.32001 L 1832.4799,730.96001 L 1832.4799,720.56001 L 1810.1199,713.80001 z " + id="path3217" /> + <path + style="color:black;fill:url(#linearGradient3404);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1825.7199,688.32002 C 1831.9599,698.20002 1832.4799,726.28001 1830.9199,730.96001 C 1829.3599,735.64001 1810.1199,719.00001 1810.1199,719.00001 L 1825.7199,688.32002 z " + sodipodi:nodetypes="cscc" + id="path3206" /> + <path + style="color:black;fill:#222537;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1549.0799,777.24001 L 1522.5599,846.40001 L 1484.5999,859.92001 L 1521.5199,778.80001 L 1549.0799,777.24001 z " + sodipodi:nodetypes="ccccc" + id="path3284" /> + <path + style="color:black;fill:url(#linearGradient3400);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1754.9999,751.76001 L 1784.6399,779.32001 C 1784.6399,779.32001 1732.1199,817.28001 1717.5599,825.60001 C 1702.9999,833.92001 1599.5199,879.68001 1594.3199,881.24001 C 1589.1199,882.80001 1496.0399,908.80001 1496.0399,908.80001 L 1489.7999,857.84001 L 1520.9999,847.44001 C 1520.9999,847.44001 1545.9599,869.80001 1555.8399,866.68001 L 1748.2399,781.92001 C 1756.0399,777.24001 1754.9999,751.76001 1754.9999,751.76001 z " + sodipodi:nodetypes="ccsscccccc" + id="path3230" /> + <path + id="path3258" + d="M 1754.4799,760.60916 C 1754.4799,760.60916 1750.3199,779.84916 1749.2799,784.52916 C 1748.2399,789.20916 1744.5999,793.36916 1736.2799,797.52916 C 1727.9599,801.68916 1569.8799,872.40916 1562.0799,872.92916 C 1554.2799,873.44916 1545.9599,875.52916 1542.3199,871.88916 C 1538.6799,868.24916 1520.9999,855.76916 1520.9999,855.76916 L 1754.4799,760.60916 z " + style="opacity:0.91739131;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4914)" + transform="matrix(1.041323,0,0,1.079015,-62.85208,-69.7474)" /> + <path + style="color:black;fill:#100f15;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1857.9599,591.60002 C 1855.8799,607.20002 1834.0399,665.96002 1831.4399,673.24002 C 1828.8399,680.52002 1814.7999,717.44001 1814.7999,717.44001 C 1814.7999,717.44001 1786.1999,751.76001 1767.4799,763.72001 C 1750.8399,753.84001 1754.9999,752.80001 1754.9999,752.80001 L 1761.7599,693.52002 L 1857.9599,591.60002 z " + sodipodi:nodetypes="csccccc" + id="path3204" /> + <path + style="color:black;fill:url(#linearGradient3415);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1546.4799,775.68001 L 1518.3999,846.40001 L 1550.6399,870.32001 L 1752.3999,779.84001 L 1763.3199,708.60001 L 1759.1599,696.12002 L 1554.2799,776.20001 L 1546.4799,775.68001 z " + sodipodi:nodetypes="cccccccc" + id="path3286" /> + <path + style="opacity:1;color:black;fill:#12131d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1544.3999,780.88001 L 1517.8799,845.88001 L 1551.6799,870.32001 L 1559.9999,770.48001 L 1544.3999,780.88001 z " + id="path3413" /> + <path + style="color:black;fill:url(#linearGradient3389);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3312" + sodipodi:nodetypes="cscccsccccsscssscsccc" + d="M 1858.6807,580.60395 C 1837.9278,610.87868 1786.4399,665.88722 1691.4855,696.1918 C 1596.5312,726.49637 1397.8652,764.63354 1301.9007,768.67415 C 1219.0682,897.97367 1221.2744,896.78169 1211.1729,915.97459 C 1316.2288,954.3604 1284.3241,945.63264 1323.2998,949.3096 C 1323.2998,949.3096 1583.9192,910.92383 1679.8837,852.33498 C 1775.8482,793.74613 1799.0817,779.604 1833.4269,733.13698 C 1833.4269,694.75119 1827.1801,679.50192 1827.1801,679.50192 L 1824.7921,686.2053 C 1824.7921,686.2053 1831.4066,702.83241 1829.3863,730.10652 C 1785.9497,777.58369 1782.9192,788.69537 1670.7923,845.26391 C 1558.6654,901.83246 1338.8092,931.7186 1328.7077,932.7288 C 1318.6062,933.7389 1245.5181,900.8223 1245.5181,900.8223 C 1245.5181,900.8223 1238.447,895.77154 1245.5181,885.67002 C 1252.5892,875.56849 1305.1171,796.77659 1307.1374,791.72583 C 1309.1577,786.67507 1315.2186,780.61415 1326.3303,781.6243 C 1337.442,782.63446 1540.4826,781.6243 1540.4826,781.6243 C 1540.4826,781.6243 1650.5893,756.37049 1693.0157,736.16744 C 1735.4421,715.96439 1780.8989,689.70042 1780.8989,689.70042 C 1780.8989,689.70042 1850.5995,607.87807 1857.6705,596.76639 C 1861.7111,580.60395 1858.6807,581.6141 1858.6807,580.60395 z " /> + <path + style="color:black;fill:url(#linearGradient3380);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1543.3599,863.04001 L 1520.9999,846.40001 L 1486.1599,857.84001 L 1472.6399,887.48001 L 1543.3599,863.04001 z " + sodipodi:nodetypes="ccccc" + id="path3274" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3367);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1753.4399,718.48001 L 1745.1199,773.60001 L 1580.7999,844.32001 L 1589.1199,781.92001 L 1753.4399,718.48001 z " + id="path3358" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3377);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3369" + sodipodi:nodetypes="ccccc" + d="M 1574.0045,786.13598 L 1566.4199,850.81607 L 1580.7999,844.32001 L 1589.1199,781.92001 L 1574.0045,786.13598 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3425);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1489.9022,861.36171 C 1489.9022,861.36171 1499.4623,899.60205 1492.1084,903.279 C 1484.7545,906.95596 1531.0841,892.98353 1531.0841,892.98353 L 1509.0224,856.21398 L 1489.9022,861.36171 z " + id="path3417" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3481);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1473.6799,292.60003 C 1477.3199,290.52003 1480.4399,291.56003 1483.5599,293.64003 C 1486.6799,295.72003 1494.9999,301.96003 1494.9999,301.96003 L 1504.3599,301.44003 C 1504.3599,301.44003 1397.7599,232.80004 1388.3999,227.60004 C 1379.0399,222.40004 1286.9999,166.76004 1278.1599,162.60004 C 1269.3199,158.44004 1186.1199,116.62465 1176.7599,112.46465 C 1167.3999,108.30465 1129.6021,95.514632 1129.6021,95.514632 C 1129.6021,95.514632 1214.7199,132.44004 1225.1199,138.16004 C 1235.5199,143.88004 1319.7599,190.68004 1329.1199,195.88004 C 1338.4799,201.08004 1413.3599,251.00004 1420.6399,255.68004 C 1427.9199,260.36004 1473.6799,292.60003 1473.6799,292.60003 z " + sodipodi:nodetypes="csccssscsssc" + id="path3471" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3489);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1475.2399,292.08003 C 1474.7199,294.68003 1477.3199,303.00003 1477.3199,303.00003 C 1477.3199,303.00003 1426.8799,266.08004 1417.5199,258.28004 C 1408.1599,250.48004 1293.6299,180.02004 1283.2299,173.26004 C 1272.8299,166.50004 1172.1872,114.82406 1127.8799,95.52004 C 1142.3701,100.02183 1173.5183,113.47569 1189.4237,120.63234 C 1216.9739,133.02854 1299.7457,177.23751 1351.8476,210.07234 C 1362.9509,217.06966 1475.7599,292.60003 1475.2399,292.08003 z " + sodipodi:nodetypes="ccsscssc" + id="path3473" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3501);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1485.6399,294.68003 L 1495.5199,302.74003 L 1501.7599,305.34003 L 1505.3999,300.66003 L 1488.4999,290.52003 L 1485.6399,294.68003 z " + id="path3493" /> + <g + id="g3524"> + <path + style="color:black;fill:url(#linearGradient3510);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3430" + d="M 1324.4399,188.60004 C 1332.2399,183.92004 1338.4799,184.96004 1343.6799,186.00004 C 1348.8799,187.04004 1367.5999,198.48004 1371.7599,203.16004 C 1375.9199,207.84004 1379.0399,214.08004 1377.9999,216.68004 C 1376.9599,219.28004 1376.4399,220.32004 1376.4399,220.32004 L 1324.4399,188.60004 z " /> + <path + style="color:black;fill:url(#linearGradient3507);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3440" + sodipodi:nodetypes="cccscc" + d="M 1363.4399,212.52004 C 1358.7599,202.12004 1350.6999,189.38004 1340.5599,185.22004 C 1347.0599,186.00004 1346.7999,186.52004 1350.6999,189.12004 C 1350.6999,189.12004 1368.3799,204.20004 1371.4999,209.40004 C 1374.6199,214.60004 1375.9199,219.80004 1375.9199,219.80004 L 1363.4399,212.52004 z " /> + <path + style="color:black;fill:url(#linearGradient3504);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1324.4399,188.60004 C 1332.2399,183.92004 1338.4799,184.96004 1343.6799,186.00004 C 1348.8799,187.04004 1367.5999,198.48004 1371.7599,203.16004 C 1375.9199,207.84004 1379.0399,214.08004 1377.9999,216.68004 C 1376.9599,219.28004 1376.4399,220.32004 1376.4399,220.32004 L 1324.4399,188.60004 z " + id="path3450" /> + <path + style="color:black;fill:url(#linearGradient3522);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3520" + d="M 1324.4399,188.60004 C 1332.2399,183.92004 1338.4799,184.96004 1343.6799,186.00004 C 1348.8799,187.04004 1367.5999,198.48004 1371.7599,203.16004 C 1375.9199,207.84004 1379.0399,214.08004 1377.9999,216.68004 C 1376.9599,219.28004 1376.4399,220.32004 1376.4399,220.32004 L 1324.4399,188.60004 z " /> + </g> + <g + style="opacity:1;display:inline" + id="g3610" + transform="translate(50,0)"> + <path + style="opacity:1;color:black;fill:#1d1a2f;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 1595.9588,373.84137 L 1589.4953,350.56353 C 1643.1377,389.45686 1723.127,460.2671 1777.626,533.33599 C 1777.1209,533.84106 1765.4843,556.84949 1755.4026,568.31252 C 1755.4026,568.31252 1697.0302,458.84137 1595.9588,373.84137 z " + sodipodi:nodetypes="cccsc" + id="path3600" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3618);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3543" + d="M 1713.0313,458.53125 L 1696.1875,479.59375 C 1713.2501,501.66495 1726.8181,521.63941 1736.6563,537.03125 L 1758.1563,508.59375 C 1743.9913,491.44477 1728.7149,474.64744 1713.0313,458.53125 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3620);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path3530" + d="M 1628.4063,380.71875 L 1626.375,401.28125 C 1658.3763,432.14635 1684.9703,464.2647 1705.5625,492 C 1713.2991,496.18976 1722.4132,500.14931 1725.2188,497.34375 C 1727.8055,494.75703 1729.459,485.49122 1730.4688,476.90625 C 1697.2378,440.8052 1660.8438,407.36778 1628.4063,380.71875 z " /> + <path + style="opacity:1;color:black;fill:#506485;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3622);stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path3564" + d="M 1625.9561,398.80076 L 1626.6915,381.88677 L 1594.3343,369.38512 L 1625.9561,398.80076 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3624);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path3590" + d="M 1624.9999,382.56003 L 1611.9999,385.68003 L 1596.3999,371.12003 L 1624.9999,382.56003 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient3626);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path3606" + d="M 1587.4799,349.28003 L 1594.2399,366.96003 L 1631.1599,385.16003 C 1631.1599,385.16003 1604.1199,361.24003 1587.4799,349.28003 z " /> + </g> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#292531;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + d="M 306.65805,271.57812 C 338.27987,287.75672 358.59115,294.40654 356.84849,308.34767 C 356.1131,314.2308 353.90692,320.11393 353.90692,320.11393" + sodipodi:nodetypes="csc" + id="path3647" /> + <path + style="opacity:1;color:black;fill:url(#radialGradient3672);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3670);stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path3649" + sodipodi:nodetypes="ccscc" + d="M 295.99489,293.27215 L 304.45188,272.68121 C 336.0737,288.85981 357.12037,293.67115 355.37771,307.61228 C 354.64232,313.49541 352.43614,318.64315 352.43614,318.64315 L 352.2523,318.27545" /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.49342107;visibility:visible;display:inline;overflow:visible" + d="M 883.88348,393.72573 C 882.87332,405.84756 881.86317,415.94908 881.86317,415.94908 C 881.86317,415.94908 881.86317,424.0303 893.985,431.10137 C 906.10683,438.17244 970.48587,471.41454 977.55694,475.45515" + id="path2850" + sodipodi:nodetypes="ccss" /> + <path + sodipodi:nodetypes="ccss" + id="path3737" + d="M 886.51578,393.35803 C 885.50562,405.47986 884.12778,415.21369 884.12778,415.21369 C 884.12778,415.21369 882.657,421.82413 894.77883,428.8952 C 906.90066,435.96627 972.38278,469.94376 979.45385,473.98437" + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3753);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + style="opacity:1;color:black;fill:#7b6c69;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible;filter:url(#filter4382)" + id="path3424" + d="M 796.91629,519.29625 C 774.88799,519.36309 755.14159,533.70664 744.29124,552.17125 C 726.5769,581.5909 721.62479,616.57722 720.32249,650.3275 C 729.55311,601.29909 739.33496,539.6491 808.55376,547.80836 C 884.45036,556.75478 912.62913,637.71705 929.38499,695.9525 C 926.38479,643.06364 906.55029,589.39343 867.07249,552.73375 C 849.07199,536.47244 827.32319,521.73935 802.57249,519.3275 C 800.68969,519.23667 798.80019,519.24332 796.91629,519.29625 z " + sodipodi:nodetypes="cccscccc" + transform="matrix(1,0,-6.65908e-2,0.916762,36.4609,43.22222)" /> + <path + sodipodi:nodetypes="cccscccc" + d="M 143.30141,264.49705 C 121.27311,264.56389 101.52671,278.90744 90.676363,297.37205 C 72.962023,326.7917 68.009913,361.77802 66.707613,395.5283 C 75.938233,346.49989 85.720083,284.8499 154.93888,293.00916 C 230.83548,301.95558 259.01425,382.91785 275.77011,441.1533 C 272.76991,388.26444 252.93541,334.59423 213.45761,297.93455 C 195.45711,281.67324 173.70831,266.94015 148.95761,264.5283 C 147.07481,264.43747 145.18531,264.44412 143.30141,264.49705 z " + id="path4386" + style="opacity:1;color:black;fill:#7b6c69;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible;filter:url(#filter4382)" + transform="matrix(0.514575,0,0,0.941733,38.26461,25.70466)" /> + <g + style="display:inline" + id="g3061"> + <path + style="opacity:1;color:black;fill:url(#linearGradient2891);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4026" + d="M 790.94698,540.19833 C 754.72619,540.71825 728.95453,571.11018 717.7422,605.83687 C 697.98987,666.7463 708.92894,743.88739 745.26374,805.52032 C 765.90842,840.20434 798.62328,871.23818 834.78799,874.8156 C 868.48817,878.5734 895.99243,855.5754 909.73018,825.72918 C 935.97225,768.86578 929.36771,692.18826 898.79143,628.21685 C 880.06413,589.66458 848.74089,552.44694 810.32088,542.48845 C 803.85764,540.79759 797.31924,540.03971 790.94698,540.19833 z " /> + <path + transform="matrix(1.217408,0,0.203141,1.378897,-309.8841,-217.4311)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3617);stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4028" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <g + style="opacity:1;display:inline" + id="g4030"> + <path + transform="matrix(0.35769,0,5.968548e-2,0.41765,475.067,327.4519)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3623);stroke-width:7.03952456;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4032" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.371116,0,6.192573e-2,0.433082,529.996,396.8886)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3627);stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4034" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.371116,0,6.192573e-2,0.433082,513.8174,509.4034)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3631);stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4036" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.357317,0,5.96232e-2,0.417221,453.5199,501.9763)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3635);stroke-width:7.04681969;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4038" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.357317,0,5.96232e-2,0.407962,423.3689,392.3642)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3640);stroke-width:7.12633991;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4040" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3854);stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + d="M 767.59375,566.59375 C 753.99813,573.75695 742.77156,586.59663 734.65625,603.46875 C 737.57614,604.76217 740.53964,605.46875 743.53125,605.46875 C 758.20373,605.46875 768.01733,588.76484 767.59375,566.59375 z " + id="path4042" /> + <path + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3856);stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + d="M 839.125,576.96875 C 839.15658,577.19851 839.18506,577.42573 839.21875,577.65625 C 843.13967,604.48448 859.90323,626.28126 876.65625,626.28125 C 877.93248,626.28125 879.17587,626.12033 880.375,625.875 C 868.75343,605.36177 854.56788,588.48788 839.125,576.96875 z " + id="path4044" /> + <path + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3852);stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + d="M 721.78125,701.65625 C 722.05446,703.99289 722.37332,706.35522 722.71875,708.71875 C 725.81891,729.93104 731.5407,750.08353 739.21875,768.34375 C 742.24009,760.7239 743.30883,750.78622 741.71875,739.90625 C 739.29936,723.35199 731.3693,708.97479 721.78125,701.65625 z " + id="path4046" /> + <path + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3858);stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + d="M 910.75,739.40625 C 898.12259,744.48579 890.98865,763.76215 894.34375,786.71875 C 895.35456,793.63507 897.21958,800.19825 899.71875,806.15625 C 907.15716,787.43227 911.12123,764.58884 910.75,739.40625 z " + id="path4048" /> + <path + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3860);stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + d="M 817.75,834.8125 C 810.39953,834.8125 804.26586,839.02904 800.03125,846 C 812.03051,853.2674 824.61494,857.25 837.1875,857.25 C 840.25793,857.25 843.26165,857.03003 846.1875,856.5625 C 838.83437,843.46461 828.30177,834.81252 817.75,834.8125 z " + id="path4050" /> + </g> + <path + style="opacity:1;color:black;fill:url(#linearGradient2876);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.03952456;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4052" + d="M 798.0625,557.90625 C 781.29199,557.90625 770.85622,580.19093 774.78125,607.65625 C 778.70626,635.12159 795.51073,657.40627 812.28125,657.40625 C 815.04721,657.40625 817.64641,656.79216 820.03125,655.65625 C 806.31614,649.90032 794.0582,630.58677 790.78125,607.65625 C 787.50389,584.72301 794.23982,565.40964 806.3125,559.65625 C 803.59909,558.51703 800.83263,557.90625 798.0625,557.90625 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2873);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4054" + d="M 865.15625,635.84375 C 847.75626,635.84375 836.92769,658.95733 841,687.4375 C 845.07234,715.91767 862.50626,739.03127 879.90625,739.03125 C 882.67354,739.03125 885.2554,738.44165 887.65625,737.34375 C 873.29529,731.54594 860.4258,711.3961 857,687.4375 C 853.57535,663.48681 860.67997,643.33663 873.375,637.53125 C 870.66474,636.43706 867.91871,635.84375 865.15625,635.84375 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2870);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4056" + d="M 848.96875,748.375 C 831.56876,748.375 820.74018,771.48861 824.8125,799.96875 C 828.88484,828.44892 846.31875,851.56249 863.71875,851.5625 C 866.48647,851.5625 869.09884,850.97322 871.5,849.875 C 857.1387,844.07762 844.23837,823.92781 840.8125,799.96875 C 837.38805,776.01954 844.49392,755.86928 857.1875,750.0625 C 854.47724,748.96831 851.73121,748.375 848.96875,748.375 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2867);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.04681969;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4058" + sodipodi:nodetypes="csscscc" + d="M 776.15625,732.1875 C 759.40323,732.1875 749.01657,754.43791 752.9375,781.875 C 756.85842,809.31212 773.62199,831.59376 790.375,831.59375 C 793.13807,831.59375 803.09656,825.83075 805.47891,824.69601 C 791.77811,818.94599 772.21103,804.78197 768.9375,781.875 C 765.66587,758.98143 772.36213,739.69998 784.40625,733.9375 C 781.69566,732.79945 778.92349,732.1875 776.15625,732.1875 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2864);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.12633991;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4060" + d="M 746.03125,617.46875 C 729.27823,617.46875 718.86032,639.23429 722.78125,666.0625 C 726.70217,692.89074 743.46574,714.65622 760.21875,714.65625 C 762.98318,714.65625 765.58543,714.04811 767.96875,712.9375 C 754.26931,707.31337 742.05452,688.45929 738.78125,666.0625 C 735.50732,643.66123 742.22116,624.80743 754.28125,619.1875 C 751.5647,618.06976 748.80485,617.46875 746.03125,617.46875 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2861);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4062" + d="M 766.59375,566.59375 C 752.99813,573.75695 741.77156,586.59663 733.65625,603.46875 C 736.57614,604.76217 739.53964,605.46875 742.53125,605.46875 C 745.30699,605.46875 747.92096,604.86955 750.3125,603.75 C 750.09302,603.65965 749.87524,603.56576 749.65625,603.46875 C 754.06535,594.30202 759.40441,586.33496 765.53125,579.8125 C 766.30565,575.72087 766.68328,571.27999 766.59375,566.59375 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2858);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4064" + d="M 838.125,576.96875 C 838.15658,577.19851 838.18506,577.42573 838.21875,577.65625 C 842.13967,604.48448 858.90323,626.28126 875.65625,626.28125 C 876.93248,626.28125 878.17587,626.12033 879.375,625.875 C 878.26443,623.91474 877.125,621.98605 875.96875,620.09375 C 869.58799,615.02694 863.91172,607.14937 859.84375,597.65625 C 853.01371,589.60687 845.71836,582.63277 838.125,576.96875 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2855);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4066" + d="M 720.78125,701.65625 C 721.05446,703.99289 721.37332,706.35522 721.71875,708.71875 C 724.81891,729.93104 730.5407,750.08353 738.21875,768.34375 C 741.24009,760.7239 742.30883,750.78622 740.71875,739.90625 C 738.29936,723.35199 730.3693,708.97479 720.78125,701.65625 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2851);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4068" + d="M 816.75,834.8125 C 809.39953,834.8125 803.26586,839.02904 799.03125,846 C 811.03051,853.2674 823.61494,857.25 836.1875,857.25 C 838.90063,857.25 841.555,857.08129 844.15625,856.71875 C 834.27818,855.40873 824.47543,851.7199 815.03125,846 C 817.6641,841.66583 821.03164,838.38446 824.96875,836.53125 C 822.27037,835.42464 819.50739,834.81251 816.75,834.8125 z " /> + <g + clip-path="url(#clipPath3833)" + style="opacity:1;display:inline" + id="g4084" + transform="translate(-160.08,-6.92)"> + <path + transform="matrix(1.182067,0,0.197245,1.342882,-116.3514,-181.2832)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4086" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.728694,0,0.121593,0.827829,330.3581,158.0236)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:url(#linearGradient3823);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4088" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.399961,0,6.673916e-2,0.454373,634.653,408.5734)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4090" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(5.083673e-2,0,8.482827e-3,5.775273e-2,992.1429,635.1441)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4092" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.728694,0,0.121593,0.827829,333.4781,155.9436)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:url(#radialGradient3825);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4094" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.245003,0,4.088223e-2,0.278334,778.0912,526.6771)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:url(#linearGradient3827);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4096" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + </g> + <g + style="opacity:1;display:inline" + id="g4070"> + <path + style="opacity:1;color:black;fill:url(#linearGradient3711);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 766.46875,579.125 L 745.6875,604.09375 L 746.34375,605.25 C 756.58142,603.68632 764.04784,593.60291 766.625,579.375 L 766.46875,579.125 z M 775.03125,593.09375 C 774.82821,597.70319 775.05675,602.58655 775.78125,607.65625 C 779.70626,635.12159 796.51072,657.40626 813.28125,657.40625 C 813.63747,657.40625 813.99333,657.39495 814.34375,657.375 L 775.03125,593.09375 z M 844.75,597.4375 C 850.54334,611.07565 859.64242,621.40204 869.40625,624.9375 L 869.4375,624.875 L 844.75,597.4375 z M 836.8125,609.8125 L 824.53125,653.5 C 834.01028,646.20806 839.11131,629.48445 836.8125,609.8125 z M 754.0625,618.71875 L 785.1875,673 C 785.0588,670.73508 784.81279,668.41655 784.46875,666.0625 C 781.10031,643.01452 768.24142,623.70504 754.0625,618.71875 z M 865.71875,635.875 C 848.57591,636.25991 837.96199,659.19725 842,687.4375 C 846.07233,715.91767 863.50626,739.03127 880.90625,739.03125 C 884.96968,739.03125 888.66667,737.76385 891.90625,735.46875 L 844.75,697.90625 L 844.46875,698.71875 L 844.46875,697.6875 L 844.75,697.90625 L 865.71875,635.875 z M 783.1875,693.46875 L 744.3125,707.5 C 749.59407,712.04565 755.40496,714.65624 761.21875,714.65625 C 771.62157,714.65625 779.58739,706.25677 783.1875,693.46875 z M 731.34375,712.15625 L 731.125,712.25 L 741.53125,755.90625 L 742.15625,755.71875 C 742.64506,750.81799 742.53466,745.48907 741.71875,739.90625 C 740.17452,729.3401 736.3762,719.67921 731.34375,712.15625 z M 777.15625,732.1875 C 767.34788,732.1875 759.73316,739.822 755.875,751.65625 L 794.75,740.125 C 789.29318,735.10731 783.21605,732.1875 777.15625,732.1875 z M 849.96875,748.375 C 846.5652,748.375 843.43136,749.27029 840.59375,750.90625 L 881.5625,775.46875 C 873.92485,759.33771 861.95309,748.375 849.96875,748.375 z M 840.28125,751.09375 C 828.81261,757.98705 822.56628,777.26606 825.8125,799.96875 C 827.20724,809.72295 830.19739,818.84266 834.1875,826.625 L 840.28125,751.09375 z M 898.78125,751.21875 C 895.36157,757.78637 893.46241,766.41429 893.53125,776.125 L 898.78125,751.21875 z M 807.5625,758.21875 L 806.03125,824.46875 C 813.58502,815.76206 817.20471,799.9269 814.625,781.875 C 813.40117,773.31113 810.89987,765.25546 807.5625,758.21875 z " + id="path4072" /> + <path + style="opacity:1;color:black;fill:#7d86a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 840.10457,750.72001 L 834.07996,825.60001 L 847.07996,821.96001 L 852.21687,757.48001 L 840.10457,750.72001 z " + sodipodi:nodetypes="ccccc" + id="path4074" /> + <path + style="opacity:1;color:black;fill:#5e6787;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 865.27996,635.80002 L 844.47996,696.64002 L 857.99996,693.52002 L 878.27996,640.48002 C 878.27996,640.48002 871.51996,636.32002 865.27996,635.80002 z " + id="path4076" /> + <path + style="opacity:1;color:black;fill:#dadee2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 844.47996,696.12002 L 857.99996,694.56002 L 899.59996,724.20001 C 899.59996,724.20001 895.43996,732.00001 891.79996,735.12001 C 847.07996,699.76002 844.47996,697.16002 844.47996,696.12002 z " + id="path4078" /> + <path + style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 775.31996,592.64002 L 790.39996,588.48002 L 825.23996,650.88002 C 825.23996,650.88002 822.36762,656.89703 813.24719,656.28749 C 806.00627,647.65603 789.21488,610.71836 775.31996,592.64002 z " + sodipodi:nodetypes="ccccc" + id="path4080" /> + </g> + <path + style="opacity:1;color:black;fill:#d8dbe4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4082" + sodipodi:nodetypes="ccc" + d="M 767.57222,770.53227 C 766.71066,794.14766 786.67074,822.30157 806.43074,823.34157 C 782.51074,795.26157 770.69222,780.93227 767.57222,770.53227 z " /> + <path + transform="matrix(0.31032,0,5.178125e-2,0.352536,530.9291,471.175)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:url(#radialGradient3777);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3769);stroke-width:8.22614479;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4098" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2833);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8.22614479;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4100" + d="M 812,665.6875 C 797.45046,665.6875 788.40727,684.50414 791.8125,707.6875 C 795.21772,730.87083 809.7942,749.68749 824.34375,749.6875 C 827.69586,749.6875 830.75473,748.66455 833.4375,746.84375 C 822.68304,740.76704 813.43435,725.53755 810.8125,707.6875 C 808.19259,689.85074 812.94987,674.6171 821.90625,668.53125 C 818.69301,666.71563 815.34709,665.68751 812,665.6875 z " /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2830);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4102" + d="M 909.75,739.40625 C 897.12259,744.48579 889.98865,763.76215 893.34375,786.71875 C 894.35456,793.63507 896.21958,800.19825 898.71875,806.15625 C 906.15716,787.43227 910.12123,764.58884 909.75,739.40625 z " /> + <g + style="opacity:1;display:inline" + id="g4104"> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3947);stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4106" + sodipodi:nodetypes="css" + d="M 829.88877,749.94997 C 820.63051,755.49288 804.26228,742.54343 797.53157,728.25594 C 792.49647,717.56778 789.07457,708.40038 791.64844,693.32487" /> + <path + style="color:black;fill:url(#linearGradient3925);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 810.4009,701.04647 C 801.57621,704.72343 800.10543,704.72343 794.95769,707.66499 C 789.80995,710.60655 789.80995,721.63742 796.42847,721.63742 C 803.04699,721.63742 815.54864,719.43125 815.54864,719.43125 L 810.4009,701.04647 z " + id="path4108" /> + <path + style="color:black;fill:url(#linearGradient3921);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 830.02351,739.91505 C 823.16897,743.59338 821.77819,743.9134 818.10255,746.44005 C 814.42692,748.96669 817.33727,752.55142 823.59578,751.11135 C 829.85428,749.67129 835.19183,745.24622 835.19183,745.24622 L 830.02351,739.91505 z " + sodipodi:nodetypes="csscc" + id="path4110" /> + <path + style="color:black;fill:url(#linearGradient3917);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4112" + sodipodi:nodetypes="csscc" + d="M 813.74521,665.86114 C 803.60732,668.8815 806.88154,665.8265 800.68324,668.24278 C 794.48494,670.65906 790.54534,679.72013 797.16386,679.72013 C 803.78238,679.72013 817.07195,677.90792 817.07195,677.90792 L 813.74521,665.86114 z " /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3943);stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 835.7719,738.18372 C 824.37333,732.30059 814.44556,726.78516 811.87169,710.23886 C 809.29782,693.69257 811.1363,685.23557 813.34247,679.72014 C 815.54864,674.2047 815.91634,674.2047 815.91634,674.2047" + id="path4114" /> + <g + clip-path="url(#clipPath3932)" + id="g4116"> + <path + transform="matrix(0.846668,0.225827,0,0.854372,123.8091,-80.38611)" + sodipodi:cy="710.97424" + sodipodi:type="arc" + sodipodi:cx="814.44556" + style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:3.19906235;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible" + id="path4118" + sodipodi:rx="6.9862146" + d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z" + sodipodi:ry="9.9277792" /> + <path + transform="matrix(0.846668,0.225827,0,0.854372,146.6062,-53.17664)" + sodipodi:cy="710.97424" + sodipodi:type="arc" + sodipodi:cx="814.44556" + style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:3.19906235;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible" + id="path4120" + sodipodi:rx="6.9862146" + d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z" + sodipodi:ry="9.9277792" /> + <path + transform="matrix(0.846668,0.225827,0,0.854372,129.6922,-117.891)" + sodipodi:cy="710.97424" + sodipodi:type="arc" + sodipodi:cx="814.44556" + style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:3.19906235;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible" + id="path4122" + sodipodi:rx="6.9862146" + d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z" + sodipodi:ry="9.9277792" /> + </g> + <path + transform="matrix(1.478247,0.384378,0,1.454217,-369.2512,-643.1703)" + sodipodi:cy="710.97424" + sodipodi:type="arc" + sodipodi:cx="814.44556" + style="color:black;fill:#263141;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3912);stroke-width:0.68204319;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4124" + sodipodi:rx="6.9862146" + d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z" + sodipodi:ry="9.9277792" /> + </g> + </g> + <g + style="display:inline" + id="g3163"> + <path + style="opacity:1;color:black;fill:url(#linearGradient2966);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + d="M 108.18708,283.55817 C 90.41157,283.91998 77.41806,305.06914 71.517246,329.23479 C 61.125088,371.6205 65.60275,425.30152 82.717984,468.19071 C 92.44636,492.32666 108.1383,513.92252 125.83908,516.41197 C 142.32872,519.02696 156.08702,503.02308 163.17054,482.25367 C 176.69987,442.68351 174.34333,389.32508 160.08011,344.80859 C 151.33696,317.9808 136.39899,292.08175 117.66532,285.15183 C 114.51401,283.97519 111.31507,283.44779 108.18708,283.55817 z " + id="path4148" /> + <path + transform="matrix(0.597247,0,8.37692e-2,0.959548,-423.1381,-243.6618)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4266);stroke-width:3.59412193;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4150" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <g + transform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" + style="opacity:1;display:inline" + id="g4152"> + <path + transform="matrix(0.35769,0,5.968548e-2,0.41765,475.067,327.4519)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4268);stroke-width:12.04805183;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4154" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.371116,0,6.192573e-2,0.433082,529.996,396.8886)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4270);stroke-width:11.61547089;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4156" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.371116,0,6.192573e-2,0.433082,513.8174,509.4034)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4272);stroke-width:11.61547089;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4158" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.357317,0,5.96232e-2,0.417221,453.5199,501.9763)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4274);stroke-width:12.06053925;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4160" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.357317,0,5.96232e-2,0.407962,423.3689,392.3642)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4276);stroke-width:12.19663715;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4162" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4278);stroke-width:4.6566844;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4164" + d="M 767.59375,566.59375 C 753.99813,573.75695 742.77156,586.59663 734.65625,603.46875 C 737.57614,604.76217 740.53964,605.46875 743.53125,605.46875 C 758.20373,605.46875 768.01733,588.76484 767.59375,566.59375 z " /> + <path + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4280);stroke-width:4.6566844;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4166" + d="M 839.125,576.96875 C 839.15658,577.19851 839.18506,577.42573 839.21875,577.65625 C 843.13967,604.48448 859.90323,626.28126 876.65625,626.28125 C 877.93248,626.28125 879.17587,626.12033 880.375,625.875 C 868.75343,605.36177 854.56788,588.48788 839.125,576.96875 z " /> + <path + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4282);stroke-width:4.6566844;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4168" + d="M 721.78125,701.65625 C 722.05446,703.99289 722.37332,706.35522 722.71875,708.71875 C 725.81891,729.93104 731.5407,750.08353 739.21875,768.34375 C 742.24009,760.7239 743.30883,750.78622 741.71875,739.90625 C 739.29936,723.35199 731.3693,708.97479 721.78125,701.65625 z " /> + <path + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4284);stroke-width:4.6566844;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4170" + d="M 910.75,739.40625 C 898.12259,744.48579 890.98865,763.76215 894.34375,786.71875 C 895.35456,793.63507 897.21958,800.19825 899.71875,806.15625 C 907.15716,787.43227 911.12123,764.58884 910.75,739.40625 z " /> + <path + style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4286);stroke-width:4.6566844;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4172" + d="M 817.75,834.8125 C 810.39953,834.8125 804.26586,839.02904 800.03125,846 C 812.03051,853.2674 824.61494,857.25 837.1875,857.25 C 840.25793,857.25 843.26165,857.03003 846.1875,856.5625 C 838.83437,843.46461 828.30177,834.81252 817.75,834.8125 z " /> + </g> + <path + style="opacity:1;color:black;fill:url(#linearGradient2951);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.03952456;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 111.47382,295.88078 C 103.2464,295.88078 97.869927,311.38826 99.479011,330.50086 C 101.08808,349.61347 109.07538,365.12095 117.30281,365.12094 C 118.65976,365.12094 119.94198,364.69361 121.12504,363.90315 C 114.46289,359.8977 108.67183,346.45777 107.32843,330.50086 C 105.98487,314.54205 109.51199,301.10225 115.50102,297.09857 C 114.18298,296.30581 112.83282,295.88078 111.47382,295.88078 z " + id="path4174" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2948);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 143.49118,350.116 C 134.95493,350.116 129.37621,366.20031 131.04585,386.01911 C 132.71551,405.83792 141.00205,421.92224 149.5383,421.92223 C 150.8959,421.92223 152.16933,421.51193 153.35981,420.74793 C 146.38129,416.71334 140.29985,402.69145 138.89528,386.01911 C 137.49117,369.35228 141.20882,355.33016 147.50376,351.2903 C 146.18674,350.52888 144.84641,350.116 143.49118,350.116 z " + id="path4176" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2945);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 134.25303,428.42436 C 125.71678,428.42436 120.13806,444.50869 121.8077,464.32747 C 123.47736,484.14628 131.7639,500.23058 140.30015,500.23058 C 141.65796,500.23058 142.94635,499.82052 144.13699,499.05628 C 137.1583,495.022 131.06173,481.00013 129.65713,464.32747 C 128.25311,447.66167 131.97137,433.63949 138.26561,429.59866 C 136.9486,428.83724 135.60826,428.42436 134.25303,428.42436 z " + id="path4178" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2942);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.04681969;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 98.718551,417.15979 C 90.499704,417.15979 85.147723,432.64343 86.75512,451.73638 C 88.362512,470.82935 96.329776,486.33472 104.54862,486.33471 C 105.90415,486.33471 110.85608,482.32435 112.03792,481.5347 C 105.38271,477.53337 95.946537,467.6769 94.604544,451.73638 C 93.26333,435.80518 96.770628,422.38758 102.74574,418.37758 C 101.42907,417.58563 100.07613,417.15979 98.718551,417.15979 z " + sodipodi:nodetypes="csscscc" + id="path4180" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2939);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.12633991;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 85.261504,337.32919 C 77.042657,337.32919 71.680932,352.47542 73.295346,371.14466 C 74.909755,389.81392 82.882966,404.96011 91.101808,404.96013 C 92.458007,404.96013 93.74165,404.53693 94.923678,403.76408 C 88.267693,399.85036 82.492514,386.73016 81.14477,371.14466 C 79.796754,355.55604 83.307749,342.43604 89.289057,338.52524 C 87.969228,337.74742 86.622202,337.32919 85.261504,337.32919 z " + id="path4182" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2935);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 95.935492,301.92625 C 89.183086,306.91098 83.527498,315.84587 79.351792,327.58686 C 80.769354,328.48692 82.215072,328.97862 83.682723,328.97862 C 85.04447,328.97862 86.33376,328.56165 87.519924,327.78257 C 87.413291,327.7197 87.307533,327.65436 87.201216,327.58686 C 89.469904,321.2079 92.180995,315.66378 95.261916,311.12492 C 95.688978,308.27763 95.925413,305.18731 95.935492,301.92625 z " + id="path4184" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2932);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 130.90838,309.14601 C 130.92123,309.3059 130.93258,309.46401 130.94645,309.62443 C 132.56086,328.29368 140.53371,343.46165 148.75255,343.46164 C 149.37866,343.46164 149.99051,343.34966 150.58161,343.17894 C 150.05937,341.81483 149.5226,340.47269 148.97716,339.15588 C 145.90522,335.62998 143.21128,330.14813 141.32497,323.54205 C 138.06698,317.94064 134.56833,313.08749 130.90838,309.14601 z " + id="path4186" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2929);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 71.904008,395.91367 C 72.011116,397.5397 72.140323,399.1836 72.282551,400.82833 C 73.559019,415.58956 76.133841,429.6133 79.690189,442.32024 C 81.260232,437.01773 81.899059,430.10229 81.244357,422.53112 C 80.248192,411.01133 76.523466,401.00651 71.904008,395.91367 z " + id="path4188" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2926);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 117.45081,488.57458 C 113.84475,488.57458 110.78705,491.50879 108.62927,496.35975 C 114.43223,501.41699 120.56012,504.18841 126.72808,504.18841 C 128.05911,504.18841 129.36326,504.07101 130.64358,503.81872 C 125.81261,502.9071 121.04599,500.34012 116.47869,496.35975 C 117.82029,493.34368 119.51018,491.06024 121.46303,489.77062 C 120.15199,489.00055 118.80356,488.57458 117.45081,488.57458 z " + id="path4190" /> + <g + clip-path="url(#clipPath3833)" + style="opacity:1;display:inline" + id="g4206" + transform="matrix(0.490589,0,-1.152337e-2,0.695881,-352.0716,-97.17108)"> + <path + transform="matrix(1.182067,0,0.197245,1.342882,-116.3514,-181.2832)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4208" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.728694,0,0.121593,0.827829,330.3581,158.0236)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:url(#linearGradient4308);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4210" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.399961,0,6.673916e-2,0.454373,634.653,408.5734)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4212" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(5.083673e-2,0,8.482827e-3,5.775273e-2,992.1429,635.1441)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4214" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.728694,0,0.121593,0.827829,333.4781,155.9436)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:url(#radialGradient4310);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4216" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + transform="matrix(0.245003,0,4.088223e-2,0.278334,778.0912,526.6771)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="color:black;fill:url(#linearGradient4312);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4218" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + </g> + <g + transform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" + style="opacity:1;display:inline" + id="g4192"> + <path + style="opacity:1;color:black;fill:url(#linearGradient4306);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4194" + d="M 766.46875,579.125 L 745.6875,604.09375 L 746.34375,605.25 C 756.58142,603.68632 764.04784,593.60291 766.625,579.375 L 766.46875,579.125 z M 775.03125,593.09375 C 774.82821,597.70319 775.05675,602.58655 775.78125,607.65625 C 779.70626,635.12159 796.51072,657.40626 813.28125,657.40625 C 813.63747,657.40625 813.99333,657.39495 814.34375,657.375 L 775.03125,593.09375 z M 844.75,597.4375 C 850.54334,611.07565 859.64242,621.40204 869.40625,624.9375 L 869.4375,624.875 L 844.75,597.4375 z M 836.8125,609.8125 L 824.53125,653.5 C 834.01028,646.20806 839.11131,629.48445 836.8125,609.8125 z M 754.0625,618.71875 L 785.1875,673 C 785.0588,670.73508 784.81279,668.41655 784.46875,666.0625 C 781.10031,643.01452 768.24142,623.70504 754.0625,618.71875 z M 865.71875,635.875 C 848.57591,636.25991 837.96199,659.19725 842,687.4375 C 846.07233,715.91767 863.50626,739.03127 880.90625,739.03125 C 884.96968,739.03125 888.66667,737.76385 891.90625,735.46875 L 844.75,697.90625 L 844.46875,698.71875 L 844.46875,697.6875 L 844.75,697.90625 L 865.71875,635.875 z M 783.1875,693.46875 L 744.3125,707.5 C 749.59407,712.04565 755.40496,714.65624 761.21875,714.65625 C 771.62157,714.65625 779.58739,706.25677 783.1875,693.46875 z M 731.34375,712.15625 L 731.125,712.25 L 741.53125,755.90625 L 742.15625,755.71875 C 742.64506,750.81799 742.53466,745.48907 741.71875,739.90625 C 740.17452,729.3401 736.3762,719.67921 731.34375,712.15625 z M 777.15625,732.1875 C 767.34788,732.1875 759.73316,739.822 755.875,751.65625 L 794.75,740.125 C 789.29318,735.10731 783.21605,732.1875 777.15625,732.1875 z M 849.96875,748.375 C 846.5652,748.375 843.43136,749.27029 840.59375,750.90625 L 881.5625,775.46875 C 873.92485,759.33771 861.95309,748.375 849.96875,748.375 z M 840.28125,751.09375 C 828.81261,757.98705 822.56628,777.26606 825.8125,799.96875 C 827.20724,809.72295 830.19739,818.84266 834.1875,826.625 L 840.28125,751.09375 z M 898.78125,751.21875 C 895.36157,757.78637 893.46241,766.41429 893.53125,776.125 L 898.78125,751.21875 z M 807.5625,758.21875 L 806.03125,824.46875 C 813.58502,815.76206 817.20471,799.9269 814.625,781.875 C 813.40117,773.31113 810.89987,765.25546 807.5625,758.21875 z " /> + <path + style="opacity:1;color:black;fill:#7d86a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4196" + sodipodi:nodetypes="ccccc" + d="M 840.10457,750.72001 L 834.07996,825.60001 L 847.07996,821.96001 L 852.21687,757.48001 L 840.10457,750.72001 z " /> + <path + style="opacity:1;color:black;fill:#5e6787;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4198" + d="M 865.27996,635.80002 L 844.47996,696.64002 L 857.99996,693.52002 L 878.27996,640.48002 C 878.27996,640.48002 871.51996,636.32002 865.27996,635.80002 z " /> + <path + style="opacity:1;color:black;fill:#dadee2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4200" + d="M 844.47996,696.12002 L 857.99996,694.56002 L 899.59996,724.20001 C 899.59996,724.20001 895.43996,732.00001 891.79996,735.12001 C 847.07996,699.76002 844.47996,697.16002 844.47996,696.12002 z " /> + <path + style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4202" + sodipodi:nodetypes="ccccc" + d="M 775.31996,592.64002 L 790.39996,588.48002 L 825.23996,650.88002 C 825.23996,650.88002 822.36762,656.89703 813.24719,656.28749 C 806.00627,647.65603 789.21488,610.71836 775.31996,592.64002 z " /> + </g> + <path + style="opacity:1;color:black;fill:#d8dbe4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + d="M 94.065459,443.84319 C 93.370659,460.27669 102.83843,479.86846 112.52048,480.59218 C 101.10917,461.05184 95.476254,451.08035 94.065459,443.84319 z " + sodipodi:nodetypes="ccc" + id="path4204" /> + <path + transform="matrix(0.15224,0,2.134091e-2,0.245323,-18.57945,235.5262)" + sodipodi:cy="670.89545" + sodipodi:type="arc" + sodipodi:cx="813.71014" + style="opacity:1;color:black;fill:url(#radialGradient4314);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4316);stroke-width:14.07893753;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + id="path4220" + sodipodi:rx="84.93766" + d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z" + sodipodi:ry="119.13335" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2908);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8.22614479;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" + d="M 117.0694,370.8837 C 109.93156,370.8837 105.27824,383.97785 106.68166,400.11071 C 108.08507,416.24354 115.0193,429.3377 122.15715,429.33771 C 123.80166,429.33771 125.31409,428.62586 126.65121,427.3588 C 121.44522,423.13013 117.08341,412.53222 116.00285,400.11071 C 114.92309,387.69844 117.4325,377.09764 121.89653,372.86261 C 120.34107,371.59916 118.71145,370.88371 117.0694,370.8837 z " + id="path4222" /> + <path + style="opacity:1;color:black;fill:url(#linearGradient2905);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 164.17499,422.18318 C 157.92159,425.71794 154.19963,439.13199 155.58107,455.10705 C 155.99726,459.91999 156.83659,464.48718 157.994,468.63324 C 161.85896,455.60358 164.06692,439.70727 164.17499,422.18318 z " + id="path4224" /> + <g + transform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" + style="opacity:1;display:inline" + id="g4226"> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4322);stroke-width:4.10756874;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4228" + sodipodi:nodetypes="css" + d="M 829.88877,749.94997 C 820.63051,755.49288 804.26228,742.54343 797.53157,728.25594 C 792.49647,717.56778 789.07457,708.40038 791.64844,693.32487" /> + <path + style="color:black;fill:url(#linearGradient4324);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4230" + d="M 810.4009,701.04647 C 801.57621,704.72343 800.10543,704.72343 794.95769,707.66499 C 789.80995,710.60655 789.80995,721.63742 796.42847,721.63742 C 803.04699,721.63742 815.54864,719.43125 815.54864,719.43125 L 810.4009,701.04647 z " /> + <path + style="color:black;fill:url(#linearGradient4326);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4232" + sodipodi:nodetypes="csscc" + d="M 830.02351,739.91505 C 823.16897,743.59338 821.77819,743.9134 818.10255,746.44005 C 814.42692,748.96669 817.33727,752.55142 823.59578,751.11135 C 829.85428,749.67129 835.19183,745.24622 835.19183,745.24622 L 830.02351,739.91505 z " /> + <path + style="color:black;fill:url(#linearGradient4328);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4234" + sodipodi:nodetypes="csscc" + d="M 813.74521,665.86114 C 803.60732,668.8815 806.88154,665.8265 800.68324,668.24278 C 794.48494,670.65906 790.54534,679.72013 797.16386,679.72013 C 803.78238,679.72013 817.07195,677.90792 817.07195,677.90792 L 813.74521,665.86114 z " /> + <path + style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4330);stroke-width:4.10756874;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4236" + d="M 835.7719,738.18372 C 824.37333,732.30059 814.44556,726.78516 811.87169,710.23886 C 809.29782,693.69257 811.1363,685.23557 813.34247,679.72014 C 815.54864,674.2047 815.91634,674.2047 815.91634,674.2047" /> + <g + clip-path="url(#clipPath3932)" + id="g4238"> + <path + transform="matrix(0.846668,0.225827,0,0.854372,123.8091,-80.38611)" + sodipodi:cy="710.97424" + sodipodi:type="arc" + sodipodi:cx="814.44556" + style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:5.47515392;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible" + id="path4240" + sodipodi:rx="6.9862146" + d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z" + sodipodi:ry="9.9277792" /> + <path + transform="matrix(0.846668,0.225827,0,0.854372,146.6062,-53.17664)" + sodipodi:cy="710.97424" + sodipodi:type="arc" + sodipodi:cx="814.44556" + style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:5.47515392;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible" + id="path4242" + sodipodi:rx="6.9862146" + d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z" + sodipodi:ry="9.9277792" /> + <path + transform="matrix(0.846668,0.225827,0,0.854372,129.6922,-117.891)" + sodipodi:cy="710.97424" + sodipodi:type="arc" + sodipodi:cx="814.44556" + style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:5.47515392;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible" + id="path4244" + sodipodi:rx="6.9862146" + d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z" + sodipodi:ry="9.9277792" /> + </g> + <path + transform="matrix(1.478247,0.384378,0,1.454217,-369.2512,-643.1703)" + sodipodi:cy="710.97424" + sodipodi:type="arc" + sodipodi:cx="814.44556" + style="color:black;fill:#263141;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4332);stroke-width:1.16730797;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4246" + sodipodi:rx="6.9862146" + d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z" + sodipodi:ry="9.9277792" /> + </g> + </g> + <path + style="opacity:0.70434783;color:black;fill:url(#linearGradient4976);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter4958)" + id="path4896" + d="M 603.49401,376.6917 C 605.68022,380.29314 608.90095,381.472 612.89829,381.76628 C 616.55274,381.84427 619.06683,380.48985 621.67203,378.153 C 623.23324,374.8852 625.20964,371.78876 626.4345,368.37411 C 627.56726,365.21619 631.64398,367.99002 630.33308,371.07825 L 630.33308,371.07825 C 628.7101,374.90167 626.80709,378.7071 624.37026,382.06935 C 621.03262,385.02787 617.1318,386.70851 612.5883,386.43999 C 607.52089,386.17306 603.14577,384.3949 600.14288,380.10581 C 598.20277,377.33469 601.73866,373.80002 603.49401,376.6917 z " /> + <path + style="opacity:1;color:black;fill:#f2ffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path5198" + d="M 819.33652,386.084 C 819.33652,386.084 742.11653,260.504 717.15653,226.184 C 702.80803,206.4548 683.47615,183.6325 665.18672,165.0271 C 651.66069,151.2674 638.70481,139.814 628.75653,133.624 C 614.9308,125.0214 593.16949,114.6801 563.22582,108.0611 C 544.26429,103.8698 522.02171,101.1711 496.43539,101.3517 C 495.48043,101.3584 494.52081,101.3692 493.55653,101.384 C 497.64803,91.431 504.87858,87.738226 511.22886,83.615245 C 511.22886,83.615245 520.47,82.410986 534.03338,83.054232 C 555.83602,84.088187 587.81986,90.862122 612.11653,98.685902 C 627.1091,103.51371 638.77262,109.155 649.73884,115.1879 C 681.02965,132.402 702.34177,152.356 737.9938,195.3709 C 741.95339,200.1482 746.08986,205.2099 750.43653,210.584 C 768.47858,232.8905 816.99652,294.824 876.27652,391.544 C 862.43288,391.544 847.93403,390.4957 834.73361,388.6781 C 829.34006,387.9355 824.16328,387.0644 819.33652,386.084 C 819.33652,386.084 819.33652,386.084 819.33652,386.084" + sodipodi:nodetypes="csssssccssssscscc" /> + <path + style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter5106)" + id="path5036" + d="M 507.64262,283.34374 C 505.47606,286.36974 503.8547,288.55197 500.0401,288.96742 C 499.76275,292.25488 497.62043,293.52247 496.82896,296.74274 C 496.30525,299.70348 494.86523,301.70693 494.4431,304.92175 C 492.4482,309.38606 491.50333,307.70402 488.77311,311.1671 C 490.33377,312.96016 492.02997,315.08438 493.24677,317.57662 C 496.22657,319.77266 496.30264,324.27833 500.393,323.55709 C 501.86827,326.8485 505.64254,329.88761 501.60307,328.55147 C 498.23646,325.77417 494.98031,326.44889 492.24951,322.50889 C 493.21978,318.4119 488.66429,317.54931 487.90971,313.44211 C 487.97774,309.1429 486.8583,305.68217 488.34447,301.43637 C 490.2953,298.7153 490.51305,295.57962 491.09746,292.57097 C 493.67001,289.94427 494.26715,285.99688 496.49521,283.03536 C 499.73376,282.12685 502.34667,281.70501 503.96776,278.28573 C 505.86163,274.29107 510.21623,279.74922 507.64262,283.34374 z " + sodipodi:nodetypes="cccccccccccccsc" /> + <g + id="g5333" + clip-path="url(#clipPath5339)" + transform="translate(0,540)"> + <path + sodipodi:nodetypes="cssssssscscsssccc" + d="M 864.07817,-148.146 C 852.74527,-169.7657 812.50322,-226.4162 780.2559,-270.6337 C 764.41493,-292.3548 750.50317,-310.29031 742.89522,-320.38451 C 734.07075,-332.09281 725.47937,-341.77351 718.65114,-350.21231 C 705.71545,-366.19931 695.2722,-376.94443 680.9193,-389.36203 C 660.51571,-407.01443 657.09804,-411.15079 639.21395,-420.99159 C 638.5411,-421.36179 637.09908,-421.3337 636.45801,-421.6927 C 628.24674,-426.292 622.59004,-429.9982 618.14947,-433.3989 C 612.77561,-437.5143 563.64397,-446.73572 559.46006,-450.99712 C 574.39687,-446.01812 642.36945,-429.9353 661.28336,-418.3569 C 671.70217,-411.9789 681.05291,-405.2825 687.49412,-399.0202 C 710.25855,-376.9147 721.18315,-365.913 750.43653,-329.416 C 753.01933,-326.1937 756.22228,-322.1731 759.98828,-317.3664 C 779.98013,-291.8495 815.83892,-244.1753 859.02259,-176.123 C 864.65559,-167.2461 892.46594,-151.13093 898.32924,-141.56453 C 894.824,-141.01303 868.33803,-148.0219 864.07817,-148.146 C 864.07817,-148.146 870.96964,-132.98476 870.96964,-132.98476" + id="path5200" + style="opacity:1;color:black;fill:#2556dd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter5254)" /> + <path + transform="matrix(2.242215,0.424538,-0.186032,0.982545,-876.716,-289.2858)" + d="M 691.13947 -447.13715 A 45.945068 30.237352 0 1 1 599.24933,-447.13715 A 45.945068 30.237352 0 1 1 691.13947 -447.13715 z" + sodipodi:ry="30.237352" + sodipodi:rx="45.945068" + sodipodi:cy="-447.13715" + sodipodi:cx="645.1944" + id="path5263" + style="opacity:0.72608696;color:black;fill:#6488ea;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter5329);enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <path + transform="matrix(0.916345,0,0,0.916345,113.2764,74.39469)" + style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3952)" + d="M 1272.4399,903.60001 L 1469.5199,872.40001 C 1469.5199,872.40001 1496.0399,893.20001 1493.9599,893.20001 C 1491.8799,893.20001 1315.5999,925.44 1315.5999,925.44 L 1272.4399,903.60001 z " + id="path3321" + sodipodi:nodetypes="ccscc" /> + <path + style="opacity:0.60434783;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter4167)" + id="path4085" + d="M 837.87844,577.98179 C 841.46692,584.35026 845.6653,603.51883 851.56879,607.74463 C 854.38266,613.5104 862.93242,621.44522 874.67166,626.5043 C 875.61093,626.90908 867.52797,625.20659 866.57168,624.84382 L 866.57168,624.84382 C 858.90138,621.93405 854.13398,616.4021 849.03714,610.27999 C 843.93926,604.80748 840.54667,597.01066 840.00857,590.29176 C 839.91024,589.064 837.27379,576.90873 837.87844,577.98179 z " + sodipodi:nodetypes="ccscccsc" /> + <path + d="M 696.90625,397.375 C 716.31072,399.15039 730.7816,403.02757 724.08756,414.24651 C 747.87178,417.64391 763.29567,436.9156 769.42747,458.40244 C 784.47414,462.16706 851.21242,454.70446 912.71875,547.46875 C 933.43519,578.71344 951.13573,647.06961 967.29118,659.67127 C 983.40346,672.23925 994.08962,609.51337 1009.375,623.0625 C 1036.9696,640.7111 1085.7096,694.90941 1117,705.0625 C 1169.4389,716.82057 1227.3539,726.23713 1280.2188,744 L 1252.1563,715.15625 C 1252.1562,715.15623 1067.8437,548.00446 987.84375,498.71875 C 907.84377,449.43303 849.32375,417.76244 818.5625,411.5625 C 772.48026,402.2746 727.07461,397.51778 696.90625,397.375 z " + sodipodi:nodetypes="cccssccccssc" + id="use4171" + style="opacity:0.32173917;color:black;fill:url(#linearGradient4211);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4217)" /> + <path + style="fill:url(#linearGradient4269);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.11304348;filter:url(#filter4259)" + d="M 1342.9215,394.1428 C 1309.0979,396.64825 1181.3199,409.1755 1182.5726,415.43913 C 1183.8254,421.70275 1320.3725,567.01889 1340.4161,595.83157 C 1277.2878,487.51853 1221.3106,404.78717 1342.9215,394.1428 z " + id="path4221" + sodipodi:nodetypes="cscc" /> + <path + d="M 117.95028,131.82387 C 118.96044,143.94577 118.96979,142.91927 113.91903,148.98017 C 108.86827,155.04107 105.82528,155.05507 105.82528,163.13637 C 105.82528,171.21757 104.8237,181.31457 98.762783,185.35517 C 92.701872,189.39567 92.700282,189.37697 92.700282,193.41767 C 92.700282,197.45827 82.111603,202.51219 80.596379,216.14927 C 109.46712,205.68175 140.65228,235.39211 137.13778,231.82387 C 132.65466,227.27219 137.14873,225.74957 139.16903,220.69887 C 141.18933,215.64807 139.15808,217.66597 137.13778,211.60517 C 135.11747,205.54427 151.28467,215.66527 155.32528,206.57387 C 159.3659,197.48257 150.2761,195.44817 161.38778,192.41767 C 172.49946,189.38707 174.51515,186.36767 183.60653,194.44887 C 192.6979,202.53007 206.83939,209.59657 220.98153,216.66767 C 235.12367,223.73867 258.35969,231.82457 270.48153,234.85517 C 282.60336,237.88567 294.72297,233.84567 301.79403,237.88637 C 308.86509,241.92697 303.82845,244.94967 315.95028,247.98017 C 324.91012,250.22007 369.39404,263.24968 435.24677,296.16641 C 404.4122,278.76461 329.19878,237.08445 315.6868,228.67135 C 262.14871,195.33635 190.67601,157.07237 177.54403,151.01137 C 164.41206,144.95047 130.07211,131.82387 117.95028,131.82387 z M 153.54403,177.16767 C 155.24491,177.05947 156.5896,177.32287 157.35653,178.26137 C 149.7542,185.86367 152.56806,190.38397 150.29403,199.48017 C 148.22327,207.76317 141.64769,206.14957 138.16903,201.51137 C 136.45178,199.22167 124.01278,195.89187 124.01278,194.44887 C 124.01278,187.42117 125.91394,181.29257 134.10653,181.29267 C 140.06869,181.29267 148.44138,177.49197 153.54403,177.16767 z " + sodipodi:nodetypes="csssscsssssssssscsscccssssc" + id="path4539" + style="opacity:1;color:black;fill:url(#linearGradient2999);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4601)" /> + <path + id="path4605" + sodipodi:nodetypes="csssssssssscc" + d="M 689.79677,145.09093 C 686.11982,131.86289 690.53216,108.71379 695.6799,102.09978 C 700.82764,95.485746 885.41078,-0.41763823 917.76799,-16.952728 C 950.12519,-33.487771 1064.1108,-59.943887 1069.9939,-59.943887 C 1075.8771,-59.943887 1089.8495,-69.864915 1070.7293,-93.01402 C 1051.6092,-116.16313 980.27622,-165.7683 949.3898,-178.99639 C 918.50338,-192.22442 892.76469,-212.06652 883.20461,-215.37352 C 873.64453,-218.68054 849.37662,-241.82959 838.34576,-231.90858 C 827.31489,-221.98755 807.45934,-178.99639 819.96098,-175.68933 C 832.46263,-172.38233 857.46592,-165.7683 847.90584,-162.4613 C 838.34576,-159.15429 750.83423,-126.08415 732.44945,-119.47014 C 714.06468,-112.85607 633.17167,-50.022861 622.1408,-50.022861 C 660.38114,19.42446 683.17825,108.71379 689.79677,145.09093 z " + style="opacity:0.52173911;color:black;fill:url(#linearGradient4607);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4653)" + transform="matrix(1,0,0,0.230566,0,111.6378)" /> + <g + id="g4663" + style="opacity:0.55652174;filter:url(#filter5200)"> + <path + d="M 1806.6185,615.58146 C 1804.8267,618.06369 1801.5664,622.79015 1799.2825,623.09218 C 1795.8213,625.05097 1795.0148,626.6908 1794.0321,630.38076 C 1790.965,632.01807 1786.8719,633.70351 1784.249,636.31985 C 1780.2709,637.10109 1781.1876,640.68028 1778.8384,642.70679 C 1776.1233,643.71768 1771.3524,647.51399 1770.2967,646.7437 C 1770.6412,652.46947 1765.0568,651.9056 1762.0387,653.61314 C 1758.4097,655.05792 1756.6452,655.14756 1754.0337,658.71823 C 1749.8519,659.95696 1746.8734,661.40411 1742.3186,660.94588 C 1739.432,661.27862 1736.2825,663.54249 1733.3868,662.82183 C 1732.0885,664.62847 1727.0652,667.14698 1724.4244,666.98569 C 1721.8266,669.88342 1719.7227,668.9769 1718.3407,672.86742 C 1715.7651,673.60629 1698.523,685.49074 1694.735,680.6428 C 1692.0002,677.14269 1710.1394,673.98852 1711.7567,669.85154 L 1711.7567,669.85154 C 1713.5151,665.35349 1711.2316,670.9242 1713.0912,667.1255 C 1716.6749,665.98631 1717.6014,660.15728 1722.751,661.93537 C 1724.9849,657.41233 1727.3308,658.69344 1731.6397,656.90311 C 1734.6912,654.91325 1738.5185,654.83707 1741.8144,653.74433 C 1745.1175,653.36767 1749.4778,653.51689 1750.0423,651.1683 C 1754.3519,652.0677 1755.938,646.12295 1760.8569,647.4964 C 1762.1851,644.618 1765.7421,646.55097 1767.0513,643.08916 C 1768.4207,637.70231 1771.3409,640.26201 1773.764,636.84834 C 1776.6794,635.21098 1778.4886,632.14392 1781.2052,629.90534 C 1784.6968,628.25744 1785.3112,625.39949 1788.9987,625.25998 C 1789.5916,621.20235 1793.5739,620.0327 1795.3326,616.4096 C 1798.0704,616.0827 1800.5443,612.6309 1802.3968,611.17285 C 1805.7884,608.50339 1809.1446,612.08181 1806.6185,615.58146 z " + id="path4657" + style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:nodetypes="ccccccccccccscccccccccccccsc" /> + <path + d="M 1798.0216,613.29382 C 1797.0874,616.28412 1796.2418,620.33359 1793.1599,622.9797 C 1792.0706,626.89824 1787.453,627.48264 1785.5451,630.11989 C 1782.5165,631.86806 1781.8122,636.90866 1778.0487,638.3375 C 1775.9998,639.03739 1775.3976,640.4401 1773.259,640.85512 C 1768.1978,641.83731 1765.6928,637.04124 1770.061,634.30273 L 1770.061,634.30273 C 1772.9697,632.47918 1774.1144,637.36387 1774.0334,632.09126 C 1778.2644,631.31327 1778.0743,625.32316 1782.4137,625.5583 C 1783.5676,621.94087 1785.4312,620.61344 1788.3529,617.85061 C 1791.4004,614.47009 1790.9779,612.08063 1793.6707,608.75029 C 1796.4676,605.29131 1799.348,609.04795 1798.0216,613.29382 z " + id="path4659" + style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + d="M 1793.516,613.20171 C 1789.0948,614.37009 1791.8615,616.25358 1790.4862,619.02314 C 1789.9465,620.10983 1788.1005,619.9809 1787.4209,620.98606 C 1785.4294,624.4117 1783.8327,626.96005 1780.7755,629.96653 C 1776.9483,633.73013 1774.8728,628.65432 1776.655,623.59116 L 1776.655,623.59116 C 1777.9141,620.01393 1781.4593,619.97533 1782.8182,616.60362 C 1784.4707,613.27159 1786.0483,610.14364 1788.2172,607.19962 C 1791.5752,602.64166 1798.9895,611.75524 1793.516,613.20171 z " + id="path4661" + style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + </g> + <path + style="opacity:0.55652173;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4826);enable-background:accumulate" + d="M 317.50085,276.97238 C 318.91462,278.18011 320.89037,278.6003 322.09804,280.07033 C 323.10794,281.15753 324.37269,281.98621 325.7251,282.58431 C 328.14276,282.86624 330.32574,284.10473 332.23001,285.56005 C 332.78645,285.94644 333.43594,286.28302 334.13296,286.24069 C 334.63876,285.96515 335.28921,286.34027 335.45206,286.85688 C 336.45064,287.83774 337.8631,288.14129 339.14048,288.59061 C 340.57356,289.01305 342.02214,289.38162 343.45021,289.82128 C 344.02793,289.73077 344.53147,290.19207 344.75215,290.6874 C 345.59739,291.67816 346.89755,292.03777 347.99638,292.65643 C 348.55012,292.88332 349.20346,293.06136 349.51388,293.62488 C 350.10693,294.52567 350.437,295.64836 350.27185,296.72641 C 350.17573,297.23743 349.96656,297.80674 349.50023,298.08296 C 348.98543,298.27415 348.45039,297.87311 348.23552,297.42072 C 347.73255,296.79085 347.05164,296.32111 346.59887,295.64847 C 345.91925,295.09362 345.04567,294.82639 344.41247,294.20674 C 343.89341,293.79526 343.39893,293.35403 342.88408,292.93741 C 341.57502,292.64655 340.15875,292.54569 339.02699,291.75417 C 338.65852,291.23834 337.96258,291.43337 337.42808,291.36442 C 335.81585,291.16081 334.57881,289.82757 332.93478,289.74715 C 331.73001,289.52779 330.89356,288.56076 329.93606,287.88576 C 329.4197,287.63165 328.91352,287.34895 328.46107,286.99101 C 327.54252,286.58713 326.49926,286.66729 325.568,286.29898 C 325.1333,286.14956 324.71368,285.93696 324.36976,285.62824 C 322.81805,285.06953 321.92727,283.41936 320.29848,283.01199 C 319.58779,282.64075 319.21632,281.82892 318.45559,281.53047 C 317.44533,280.9046 316.26687,280.43866 315.55467,279.43804 C 314.9945,278.54539 315.19953,277.19556 316.1202,276.62161 C 316.59581,276.41325 317.14929,276.62779 317.50085,276.97238 z " + id="path4788" /> + <path + style="fill:#5b6879;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.23043478" + d="M 487.89301,308.72039 C 488.3326,300.80774 491.4635,295.31127 491.4635,295.31127 C 491.4635,295.31127 501.13452,293.11331 499.81575,297.50923 C 498.49697,301.90515 494.98024,306.74065 497.1782,306.74065 C 499.37615,306.74065 505.53044,305.42188 505.53044,305.42188 C 505.53044,305.42188 512.78213,307.83806 512.78213,310.03602 C 512.78213,312.23398 487.45342,308.72039 487.89301,308.72039 z " + id="path4956" + sodipodi:nodetypes="ccsscsc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3927);opacity:0.27391304" + d="M 292.19051,471.87988 C 294.6394,467.05863 286.53648,469.6405 284.16343,463.44555 C 280.55878,454.03548 311.62618,435.19934 312.40474,435.78326 C 313.79552,436.82635 332.5711,458.20965 330.65877,456.47117 C 328.74645,454.73269 302.01065,468.12376 292.19051,471.87988 z " + id="path3921" + sodipodi:nodetypes="csssc" + clip-path="url(#clipPath3953)" /> + <use + x="0" + y="0" + xlink:href="#path4956" + id="use4958" + style="opacity:1;filter:url(#filter5032)" /> + <path + style="fill:#080000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter5304)" + d="M 1501.9565,338.98683 C 1498.1548,339.12763 1478.721,343.40924 1476.0457,341.8604 C 1473.3704,340.31156 1471.2584,342.14201 1471.2584,342.14201 L 1465.063,340.17075 C 1465.063,340.17075 1447.6033,353.2655 1437.4655,357.20801 C 1427.3276,361.15051 1417.7347,368.3163 1417.7347,368.3163 C 1417.7347,368.3163 1450.1378,357.63042 1451.8275,356.9264 C 1453.5171,356.22238 1466.3302,350.87184 1467.8791,350.59023 C 1469.4279,350.30862 1483.5689,346.80325 1485.5401,346.66244 C 1487.5114,346.52164 1501.9565,339.26844 1501.9565,338.98683 z " + id="path5282" + sodipodi:nodetypes="csccscsssc" /> + <path + sodipodi:nodetypes="csssc" + id="path3942" + d="M 292.19051,471.87988 C 294.6394,467.05863 286.53648,469.6405 284.16343,463.44555 C 280.55878,454.03548 311.62618,435.19934 312.40474,435.78326 C 313.79552,436.82635 322.74618,448.20609 320.83385,446.46761 C 318.92153,444.72913 302.01065,468.12376 292.19051,471.87988 z " + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3927);opacity:0.33913043" + clip-path="url(#clipPath3946)" /> + <path + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#b2d1fd;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3982)" + d="M 323.69746,231.50388 L 405.14932,213.56953" + id="path3960" + sodipodi:nodetypes="cc" /> + <path + id="path4075" + d="M 294.07695,144.22375 C 265.79267,135.13235 244.57947,133.11205 231.44749,135.13235 C 218.3155,137.15265 208.21398,132.10185 198.11245,132.10185 C 188.01093,132.10185 163.76727,134.12215 163.76727,134.12215 C 163.76727,134.12215 179.92971,139.17295 195.082,146.24405 C 210.23428,153.31505 239.52871,169.47755 239.52871,169.47755 C 239.52871,169.47755 263.77237,155.33535 270.84344,152.30495 C 277.9145,149.27445 296.09725,143.21355 294.07695,144.22375 z " + style="opacity:0.92173911;color:#000000;fill:url(#linearGradient4101);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4097)" /> + </g> +</svg> diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/perf-canvaskit-with-puppeteer.js b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/perf-canvaskit-with-puppeteer.js index 903702ad3ee..402f4c14dce 100644 --- a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/perf-canvaskit-with-puppeteer.js +++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/perf-canvaskit-with-puppeteer.js @@ -33,9 +33,14 @@ const opts = [ description: 'The Lottie JSON file to process.' }, { + name: 'input_skp', + typeLabel: '{underline file}', + description: 'The SKP file to process.' + }, + { name: 'assets', typeLabel: '{underline file}', - description: 'Any assets needed by the lottie file (e.g. images/fonts).' + description: 'A directory containing any assets needed by the lottie file (e.g. images/fonts).' }, { name: 'output', @@ -59,6 +64,13 @@ const opts = [ type: Number, }, { + name: 'query_params', + description: 'The query params to be added to the testing page URL. Useful for passing' + + 'options to the perf html page.', + type: String, + multiple: true + }, + { name: 'help', alias: 'h', type: Boolean, @@ -130,6 +142,12 @@ if (options.input_lottie) { const lottieJSON = fs.readFileSync(options.input_lottie, 'utf8'); app.get('/static/lottie.json', (req, res) => res.send(lottieJSON)); } +if (options.input_skp) { + const skpBytes = fs.readFileSync(options.input_skp, 'binary'); + app.get('/static/test.skp', (req, res) => { + res.send(new Buffer(skpBytes, 'binary')); + }); +} if (options.assets) { app.use('/static/assets/', express.static(options.assets)); console.log('assets served from', options.assets); @@ -141,7 +159,13 @@ let hash = "#cpu"; if (options.use_gpu) { hash = "#gpu"; } -const targetURL = `http://localhost:${options.port}/${hash}`; +let query_param_string = '?'; +if (options.query_params) { + for (const string of options.query_params) { + query_param_string += string + '&'; + } +} +const targetURL = `http://localhost:${options.port}/${query_param_string}${hash}`; const viewPort = {width: 1000, height: 1000}; // Drive chrome to load the web page from the server we have running. @@ -154,6 +178,11 @@ async function driveBrowser() { '--no-sandbox', '--disable-setuid-sandbox', '--window-size=' + viewPort.width + ',' + viewPort.height, + // The following two params allow Chrome to run at an unlimited fps. Note, if there is + // already a chrome instance running, these arguments will have NO EFFECT, as the existing + // Chrome instance will be used instead of puppeteer spinning up a new one. + '--disable-frame-rate-limit', + '--disable-gpu-vsync', ]; if (options.use_gpu) { browser_args.push('--ignore-gpu-blacklist'); diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/render-skp.html b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/render-skp.html new file mode 100644 index 00000000000..ef1ed254580 --- /dev/null +++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/render-skp.html @@ -0,0 +1,157 @@ +<!-- This benchmark aims to accurately measure the time it takes for CanvasKit to render + an SKP from our test corpus. It is very careful to measure the time between frames. This form + of measurement makes sure we are capturing the GPU draw time. CanvasKit.flush() returns after + it has sent all the instructions to the GPU, but we don't know the GPU is done until the next + frame is requested. Thus, we need to keep track of the time between frames in order to + accurately calculate draw time. Keeping track of the drawPicture and drawPicture+flush is still + useful for telling us how much time we are spending in WASM land and if our drawing is CPU + bound or GPU bound. If total_frame_ms is close to with_flush_ms, we are CPU bound; if + total_frame_ms >> with_flush_ms, we are GPU bound. +--> +<!DOCTYPE html> +<html> +<head> + <title>CanvasKit SKP Perf</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <script src="/static/canvaskit.js" type="text/javascript" charset="utf-8"></script> + <style type="text/css" media="screen"> + body { + margin: 0; + padding: 0; + } + </style> +</head> +<body> + <main> + <button id="start_bench">Start Benchmark</button> + <br> + <canvas id=anim width=1000 height=1000 style="height: 1000px; width: 1000px;"></canvas> + </main> + <script type="text/javascript" charset="utf-8"> + const WIDTH = 1000; + const HEIGHT = 1000; + // Run this number of frames before starting to measure things. This allows us to make sure + // the noise from the first few renders (e.g shader compilation, caches) is removed from the + // data we capture. + const WARM_UP_FRAMES = 10; + const MAX_FRAMES = 201; // This should be sufficient to have low noise. + + const SKP_PATH = '/static/test.skp'; + (function() { + + const loadKit = CanvasKitInit({ + locateFile: (file) => '/static/' + file, + }); + + const loadSKP = fetch(SKP_PATH).then((resp) => { + return resp.arrayBuffer(); + }); + + Promise.all([loadKit, loadSKP]).then((values) => { + const [CanvasKit, skpBytes] = values; + const loadStart = performance.now(); + const skp = CanvasKit.MakeSkPicture(skpBytes); + const loadTime = performance.now() - loadStart; + console.log('loaded skp', skp, loadTime); + if (!skp) { + window._error = 'could not read skp'; + return; + } + + const surface = getSurface(CanvasKit); + if (!surface) { + console.error('Could not make surface', window._error); + return; + } + const canvas = surface.getCanvas(); + + document.getElementById('start_bench').addEventListener('click', () => { + const clearColor = CanvasKit.WHITE; + const totalFrame = new Float32Array(MAX_FRAMES); + const withFlush = new Float32Array(MAX_FRAMES); + const withoutFlush = new Float32Array(MAX_FRAMES); + let warmUp = true; + let idx = 0; + + let previousFrame; + + function drawFrame() { + const start = performance.now(); + canvas.clear(clearColor); + canvas.drawPicture(skp); + const afterDraw = performance.now(); + surface.flush(); + const end = performance.now(); + + if (warmUp) { + idx++; + if (idx >= WARM_UP_FRAMES) { + idx = -1; + warmUp = false; + } + window.requestAnimationFrame(drawFrame); + return; + } + if (idx >= 0) { + // Fill out total time the previous frame took to draw. + totalFrame[idx] = start - previousFrame; + } + previousFrame = start; + idx++; + // If we have maxed out the frames we are measuring or have completed the animation, + // we stop benchmarking. + if (idx >= withFlush.length) { + window._perfData = { + total_frame_ms: Array.from(totalFrame).slice(0, idx), + with_flush_ms: Array.from(withFlush).slice(0, idx), + without_flush_ms: Array.from(withoutFlush).slice(0, idx), + skp_load_ms: loadTime, + }; + window._perfDone = true; + return; + } + + // We can fill out this frame's intermediate steps. + withFlush[idx] = end - start; + withoutFlush[idx] = afterDraw - start; + window.requestAnimationFrame(drawFrame); + } + window.requestAnimationFrame(drawFrame); + }); + console.log('Perf is ready'); + window._perfReady = true; + }); + } + )(); + + // TODO(kjlubick) make this configurable to return a WEBGL 1 or WEBGL 2 surface. + function getSurface(CanvasKit) { + let surface; + if (window.location.hash.indexOf('gpu') !== -1) { + surface = CanvasKit.MakeWebGLCanvasSurface('anim'); + if (!surface) { + window._error = 'Could not make GPU surface'; + return null; + } + let c = document.getElementById('anim'); + // If CanvasKit was unable to instantiate a WebGL context, it will fallback + // to CPU and add a ck-replaced class to the canvas element. + if (c.classList.contains('ck-replaced')) { + window._error = 'fell back to CPU'; + return null; + } + } else { + surface = CanvasKit.MakeSWCanvasSurface('anim'); + if (!surface) { + window._error = 'Could not make CPU surface'; + return null; + } + } + return surface; + } + + </script> +</body> +</html> diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/skottie-frames.html b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/skottie-frames.html index f6bbf1a6837..19728d3cc40 100644 --- a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/skottie-frames.html +++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/skottie-frames.html @@ -36,7 +36,7 @@ would display the animation (e.g. using clock time to determine where to seek, n const loadKit = CanvasKitInit({ locateFile: (file) => '/static/' + file, - }).ready(); + }); const loadLottie = fetch(LOTTIE_JSON_PATH).then((resp) => { return resp.text() @@ -118,7 +118,7 @@ would display the animation (e.g. using clock time to determine where to seek, n function getSurface(CanvasKit) { let surface; if (window.location.hash.indexOf('gpu') !== -1) { - surface = CanvasKit.MakeWebGLCanvasSurface('anim', WIDTH, HEIGHT); + surface = CanvasKit.MakeWebGLCanvasSurface('anim'); if (!surface) { window._error = 'Could not make GPU surface'; return null; @@ -131,7 +131,7 @@ would display the animation (e.g. using clock time to determine where to seek, n return null; } } else { - surface = CanvasKit.MakeSWCanvasSurface('anim', WIDTH, HEIGHT); + surface = CanvasKit.MakeSWCanvasSurface('anim'); if (!surface) { window._error = 'Could not make CPU surface'; return null; diff --git a/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.cpp b/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.cpp index 4abbd9d667d..970c67ec0c1 100644 --- a/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.cpp +++ b/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.cpp @@ -317,12 +317,14 @@ bool VulkanWindowContext::createSwapchain(int width, int height, fDestroySwapchainKHR(fDevice, swapchainCreateInfo.oldSwapchain, nullptr); } - this->createBuffers(swapchainCreateInfo.imageFormat, colorType); + this->createBuffers(swapchainCreateInfo.imageFormat, colorType, + swapchainCreateInfo.imageSharingMode); return true; } -void VulkanWindowContext::createBuffers(VkFormat format, SkColorType colorType) { +void VulkanWindowContext::createBuffers(VkFormat format, SkColorType colorType, + VkSharingMode sharingMode) { fGetSwapchainImagesKHR(fDevice, fSwapchain, &fImageCount, nullptr); SkASSERT(fImageCount); fImages = new VkImage[fImageCount]; @@ -342,6 +344,7 @@ void VulkanWindowContext::createBuffers(VkFormat format, SkColorType colorType) info.fFormat = format; info.fLevelCount = 1; info.fCurrentQueueFamily = fPresentQueueIndex; + info.fSharingMode = sharingMode; if (fSampleCount == 1) { GrBackendRenderTarget backendRT(fWidth, fHeight, fSampleCount, info); @@ -525,7 +528,9 @@ void VulkanWindowContext::swapBuffers() { GrFlushInfo info; info.fNumSemaphores = 1; info.fSignalSemaphores = &beSemaphore; - surface->flush(SkSurface::BackendSurfaceAccess::kPresent, info); + GrBackendSurfaceMutableState presentState(VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, fPresentQueueIndex); + surface->flush(info, &presentState); + surface->getContext()->submit(); // Submit present operation to present queue const VkPresentInfoKHR presentInfo = diff --git a/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.h b/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.h index 2db9e79ae62..5e245aff700 100644 --- a/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.h +++ b/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.h @@ -61,7 +61,7 @@ private: BackbufferInfo* getAvailableBackbuffer(); bool createSwapchain(int width, int height, const DisplayParams& params); - void createBuffers(VkFormat format, SkColorType colorType); + void createBuffers(VkFormat format, SkColorType colorType, VkSharingMode); void destroyBuffers(); VkInstance fInstance = VK_NULL_HANDLE; diff --git a/chromium/third_party/skia/tools/sk_app/Window.cpp b/chromium/third_party/skia/tools/sk_app/Window.cpp index bf125a83200..c8c6cd278dc 100644 --- a/chromium/third_party/skia/tools/sk_app/Window.cpp +++ b/chromium/third_party/skia/tools/sk_app/Window.cpp @@ -89,7 +89,7 @@ void Window::onPaint() { this->visitLayers([](Layer* layer) { layer->onPrePaint(); }); this->visitLayers([=](Layer* layer) { layer->onPaint(backbuffer.get()); }); - backbuffer->flush(); + backbuffer->flushAndSubmit(); fWindowContext->swapBuffers(); } diff --git a/chromium/third_party/skia/tools/sk_app/Window.h b/chromium/third_party/skia/tools/sk_app/Window.h index 0648e970ce8..f2d40360fc8 100644 --- a/chromium/third_party/skia/tools/sk_app/Window.h +++ b/chromium/third_party/skia/tools/sk_app/Window.h @@ -61,6 +61,9 @@ public: #ifdef SK_METAL kMetal_BackendType, #endif +#ifdef SK_DIRECT3D + kDirect3D_BackendType, +#endif kRaster_BackendType, kLast_BackendType = kRaster_BackendType diff --git a/chromium/third_party/skia/tools/sk_app/win/D3D12WindowContext_win.cpp b/chromium/third_party/skia/tools/sk_app/win/D3D12WindowContext_win.cpp new file mode 100644 index 00000000000..55df2820a27 --- /dev/null +++ b/chromium/third_party/skia/tools/sk_app/win/D3D12WindowContext_win.cpp @@ -0,0 +1,243 @@ +/* + * Copyright 2020 Google LLC + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "tools/sk_app/WindowContext.h" +#include "tools/sk_app/win/WindowContextFactory_win.h" + +#include "tools/gpu/d3d/D3DTestUtils.h" + +#include "include/core/SkSurface.h" +#include "include/gpu/d3d/GrD3DBackendContext.h" + +#include <d3d12.h> +#include <dxgi1_4.h> +#include <wrl/client.h> + +#define GR_D3D_CALL_ERRCHECK(X) \ + do { \ + HRESULT result = X; \ + SkASSERT(SUCCEEDED(result)); \ + if (!SUCCEEDED(result)) { \ + SkDebugf("Failed Direct3D call. Error: 0x%08x\n", result); \ + } \ + } while(false) + +using namespace Microsoft::WRL; + +namespace sk_app { + +class D3D12WindowContext : public WindowContext { +public: + D3D12WindowContext(HWND hwnd, const DisplayParams& params); + ~D3D12WindowContext() override; + void initializeContext(); + void destroyContext(); + void setupSurfaces(int width, int height); + + bool isValid() override { + return fDevice.get() != nullptr; + } + + sk_sp<SkSurface> getBackbufferSurface() override; + void swapBuffers() override; + + void resize(int width, int height) override; + void setDisplayParams(const DisplayParams& params) override; +private: + static constexpr int kNumFrames = 2; + + HWND fWindow; + gr_cp<ID3D12Device> fDevice; + gr_cp<ID3D12CommandQueue> fQueue; + gr_cp<IDXGISwapChain3> fSwapChain; + gr_cp<ID3D12Resource> fBuffers[kNumFrames]; + sk_sp<SkSurface> fSurfaces[kNumFrames]; + + // Synchronization objects. + unsigned int fBufferIndex; + HANDLE fFenceEvent; + gr_cp<ID3D12Fence> fFence; + uint64_t fFenceValues[kNumFrames]; +}; + +D3D12WindowContext::D3D12WindowContext(HWND hwnd, const DisplayParams& params) + : WindowContext(params) + , fWindow(hwnd) { + + this->initializeContext(); +} + +D3D12WindowContext::~D3D12WindowContext() { + this->destroyContext(); +} + +void D3D12WindowContext::initializeContext() { + GrD3DBackendContext backendContext; + sk_gpu_test::CreateD3DBackendContext(&backendContext); + fDevice = backendContext.fDevice; + fQueue = backendContext.fQueue; + + fContext = GrContext::MakeDirect3D(backendContext, fDisplayParams.fGrContextOptions); + SkASSERT(fContext); + + // Make the swapchain + RECT windowRect; + GetWindowRect(fWindow, &windowRect); + unsigned int width = windowRect.right - windowRect.left; + unsigned int height = windowRect.bottom - windowRect.top; + + UINT dxgiFactoryFlags = 0; + SkDEBUGCODE(dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG;) + + gr_cp<IDXGIFactory4> factory; + GR_D3D_CALL_ERRCHECK(CreateDXGIFactory2(dxgiFactoryFlags, IID_PPV_ARGS(&factory))); + + DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {}; + swapChainDesc.BufferCount = kNumFrames; + swapChainDesc.Width = width; + swapChainDesc.Height = height; + swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; + swapChainDesc.SampleDesc.Count = 1; // TODO: support MSAA + + gr_cp<IDXGISwapChain1> swapChain; + GR_D3D_CALL_ERRCHECK(factory->CreateSwapChainForHwnd( + fQueue.get(), fWindow, &swapChainDesc, nullptr, nullptr, &swapChain)); + + // We don't support fullscreen transitions. + GR_D3D_CALL_ERRCHECK(factory->MakeWindowAssociation(fWindow, DXGI_MWA_NO_ALT_ENTER)); + + GR_D3D_CALL_ERRCHECK(swapChain->QueryInterface(IID_PPV_ARGS(&fSwapChain))); + + fBufferIndex = fSwapChain->GetCurrentBackBufferIndex(); + + this->setupSurfaces(width, height); + + for (int i = 0; i < kNumFrames; ++i) { + fFenceValues[i] = 1; + } + GR_D3D_CALL_ERRCHECK(fDevice->CreateFence(fFenceValues[fBufferIndex], D3D12_FENCE_FLAG_NONE, + IID_PPV_ARGS(&fFence))); + + fFenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); + SkASSERT(fFenceEvent); + + fWidth = width; + fHeight = height; +} + +void D3D12WindowContext::setupSurfaces(int width, int height) { + // set up base resource info + GrD3DTextureResourceInfo info(nullptr, + D3D12_RESOURCE_STATE_PRESENT, + DXGI_FORMAT_R8G8B8A8_UNORM, + 1, + 0); + for (int i = 0; i < kNumFrames; ++i) { + GR_D3D_CALL_ERRCHECK(fSwapChain->GetBuffer(i, IID_PPV_ARGS(&fBuffers[i]))); + + SkASSERT(fBuffers[i]->GetDesc().Width == (UINT64)width && + fBuffers[i]->GetDesc().Height == (UINT64)height); + + // TODO: support MSAA + info.fResource = fBuffers[i]; + GrBackendRenderTarget backendRT(width, height, 1, info); + fSurfaces[i] = SkSurface::MakeFromBackendRenderTarget( + fContext.get(), backendRT, kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, + fDisplayParams.fColorSpace, &fDisplayParams.fSurfaceProps); + } +} + +void D3D12WindowContext::destroyContext() { + CloseHandle(fFenceEvent); + fFence.reset(nullptr); + + for (int i = 0; i < kNumFrames; ++i) { + fSurfaces[i].reset(nullptr); + fBuffers[i].reset(nullptr); + } + + fSwapChain.reset(nullptr); + fQueue.reset(nullptr); + fDevice.reset(nullptr); +} + +sk_sp<SkSurface> D3D12WindowContext::getBackbufferSurface() { + // Update the frame index. + const UINT64 currentFenceValue = fFenceValues[fBufferIndex]; + fBufferIndex = fSwapChain->GetCurrentBackBufferIndex(); + + // If the last frame for this buffer index is not done, wait until it is ready. + if (fFence->GetCompletedValue() < fFenceValues[fBufferIndex]) { + GR_D3D_CALL_ERRCHECK(fFence->SetEventOnCompletion(fFenceValues[fBufferIndex], fFenceEvent)); + WaitForSingleObjectEx(fFenceEvent, INFINITE, FALSE); + } + + // Set the fence value for the next frame. + fFenceValues[fBufferIndex] = currentFenceValue + 1; + + return fSurfaces[fBufferIndex]; +} + +void D3D12WindowContext::swapBuffers() { + SkSurface* surface = fSurfaces[fBufferIndex].get(); + + GrFlushInfo info; + surface->flush(SkSurface::BackendSurfaceAccess::kPresent, info); + fContext->submit(); + + GR_D3D_CALL_ERRCHECK(fSwapChain->Present(1, 0)); + + // Schedule a Signal command in the queue. + GR_D3D_CALL_ERRCHECK(fQueue->Signal(fFence.get(), fFenceValues[fBufferIndex])); +} + +void D3D12WindowContext::resize(int width, int height) { + // Clean up any outstanding resources in command lists + fContext->flush({}); + fContext->submit(true); + + // release the previous surface and backbuffer resources + for (int i = 0; i < kNumFrames; ++i) { + // Let present complete + if (fFence->GetCompletedValue() < fFenceValues[i]) { + GR_D3D_CALL_ERRCHECK(fFence->SetEventOnCompletion(fFenceValues[i], fFenceEvent)); + WaitForSingleObjectEx(fFenceEvent, INFINITE, FALSE); + } + fSurfaces[i].reset(nullptr); + fBuffers[i].reset(nullptr); + } + + GR_D3D_CALL_ERRCHECK(fSwapChain->ResizeBuffers(0, width, height, + DXGI_FORMAT_R8G8B8A8_UNORM, 0)); + + this->setupSurfaces(width, height); + + fWidth = width; + fHeight = height; +} + +void D3D12WindowContext::setDisplayParams(const DisplayParams& params) { + this->destroyContext(); + fDisplayParams = params; + this->initializeContext(); +} + +namespace window_context_factory { + +std::unique_ptr<WindowContext> MakeD3D12ForWin(HWND hwnd, const DisplayParams& params) { + std::unique_ptr<WindowContext> ctx(new D3D12WindowContext(hwnd, params)); + if (!ctx->isValid()) { + return nullptr; + } + return ctx; +} + +} + +} //namespace sk_app diff --git a/chromium/third_party/skia/tools/sk_app/win/WindowContextFactory_win.h b/chromium/third_party/skia/tools/sk_app/win/WindowContextFactory_win.h index 33dd6d413b8..c05a4f0acf5 100644 --- a/chromium/third_party/skia/tools/sk_app/win/WindowContextFactory_win.h +++ b/chromium/third_party/skia/tools/sk_app/win/WindowContextFactory_win.h @@ -26,6 +26,10 @@ std::unique_ptr<WindowContext> MakeGLForWin(HWND, const DisplayParams&); std::unique_ptr<WindowContext> MakeANGLEForWin(HWND, const DisplayParams&); +#ifdef SK_DIRECT3D +std::unique_ptr<WindowContext> MakeD3D12ForWin(HWND, const DisplayParams&); +#endif + #ifdef SK_DAWN std::unique_ptr<WindowContext> MakeDawnD3D12ForWin(HWND, const DisplayParams&); #endif diff --git a/chromium/third_party/skia/tools/sk_app/win/Window_win.cpp b/chromium/third_party/skia/tools/sk_app/win/Window_win.cpp index 9afe0886b40..de001bfbb04 100644 --- a/chromium/third_party/skia/tools/sk_app/win/Window_win.cpp +++ b/chromium/third_party/skia/tools/sk_app/win/Window_win.cpp @@ -377,6 +377,12 @@ bool Window_win::attach(BackendType attachType) { window_context_factory::MakeVulkanForWin(fHWnd, fRequestedDisplayParams); break; #endif +#ifdef SK_DIRECT3D + case kDirect3D_BackendType: + fWindowContext = + window_context_factory::MakeD3D12ForWin(fHWnd, fRequestedDisplayParams); + break; +#endif } this->onBackendCreated(); diff --git a/chromium/third_party/skia/tools/skiaserve/Response.cpp b/chromium/third_party/skia/tools/skiaserve/Response.cpp index d74963a62d5..6ad5c3bfeb0 100644 --- a/chromium/third_party/skia/tools/skiaserve/Response.cpp +++ b/chromium/third_party/skia/tools/skiaserve/Response.cpp @@ -25,7 +25,7 @@ static SkString generate_template(SkString source) { "<head>\n" " <title>SkDebugger</title>\n" " <meta charset='utf-8' />\n" - " <meta http-equiv='X-UA-Compatible' content='IE=egde,chrome=1'>\n" + " <meta http-equiv='X-UA-Compatible' content='IE=edge'>\n" " <meta name='viewport' content='width=device-width, initial-scale=1.0'>\n" " <script src='%s/res/js/core.js' type='text/javascript' charset='utf-8'></script>\n" " <link href='%s/res/vul/elements.html' rel='import' />\n" diff --git a/chromium/third_party/skia/tools/skottie-wasm-perf/skottie-wasm-perf.html b/chromium/third_party/skia/tools/skottie-wasm-perf/skottie-wasm-perf.html index f7fd4a1e485..ac29945eb0e 100644 --- a/chromium/third_party/skia/tools/skottie-wasm-perf/skottie-wasm-perf.html +++ b/chromium/third_party/skia/tools/skottie-wasm-perf/skottie-wasm-perf.html @@ -1,17 +1,17 @@ <!DOCTYPE html> <html> <head> - <title>Skottie-WASM Perf</title> - <meta charset="utf-8" /> - <meta http-equiv="X-UA-Compatible" content="IE=egde,chrome=1"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <script src="res/canvaskit.js" type="text/javascript" charset="utf-8"></script> - <style type="text/css" media="screen"> - body { - margin: 0; - padding: 0; - } - </style> + <title>Skottie-WASM Perf</title> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <script src="res/canvaskit.js" type="text/javascript" charset="utf-8"></script> + <style type="text/css" media="screen"> + body { + margin: 0; + padding: 0; + } + </style> </head> <body> <main> @@ -26,7 +26,7 @@ CanvasKitInit({ locateFile: (file) => '/res/'+file, - }).ready().then((CanvasKit) => { + }).then((CanvasKit) => { CK = CanvasKit; Bench(CK, lottieJSON); }); diff --git a/chromium/third_party/skia/tools/skottie2movie.cpp b/chromium/third_party/skia/tools/skottie2movie.cpp index ca887b5d729..e9da0d111c6 100644 --- a/chromium/third_party/skia/tools/skottie2movie.cpp +++ b/chromium/third_party/skia/tools/skottie2movie.cpp @@ -146,6 +146,7 @@ int main(int argc, char** argv) { SkSurface::RescaleGamma::kSrc, kNone_SkFilterQuality, read_pixels_cb, &asyncRec); + surf->getContext()->submit(); } else { SkPixmap pm; SkAssertResult(surf->peekPixels(&pm)); diff --git a/chromium/third_party/skia/tools/skottie_ios_app/SkiaGLContext.mm b/chromium/third_party/skia/tools/skottie_ios_app/SkiaGLContext.mm index 4b12f38f98d..e6e4e048806 100644 --- a/chromium/third_party/skia/tools/skottie_ios_app/SkiaGLContext.mm +++ b/chromium/third_party/skia/tools/skottie_ios_app/SkiaGLContext.mm @@ -87,7 +87,7 @@ static sk_sp<SkSurface> make_gl_surface(GrContext* grContext, int width, int hei [viewController draw:rect toCanvas:(surface->getCanvas()) atSize:CGSize{(CGFloat)width, (CGFloat)height}]; - surface->flush(); + surface->flushAndSubmit(); } if (next) { [NSTimer scheduledTimerWithTimeInterval:std::max(0.0, next - SkTime::GetNSecs() * 1e-9) diff --git a/chromium/third_party/skia/tools/skottie_ios_app/SkiaMetalContext.mm b/chromium/third_party/skia/tools/skottie_ios_app/SkiaMetalContext.mm index b49e360110d..f67d547885f 100644 --- a/chromium/third_party/skia/tools/skottie_ios_app/SkiaMetalContext.mm +++ b/chromium/third_party/skia/tools/skottie_ios_app/SkiaMetalContext.mm @@ -55,7 +55,7 @@ return; } [viewController draw:rect toCanvas:surface->getCanvas() atSize:size]; - surface->flush(); + surface->flushAndSubmit(); surface = nullptr; id<MTLCommandBuffer> commandBuffer = [fQueue commandBuffer]; diff --git a/chromium/third_party/skia/tools/skp/page_sets/skia_css3gradients_desktop.py b/chromium/third_party/skia/tools/skp/page_sets/skia_css3gradients_desktop.py index 594faf15600..9eaa54a4541 100644 --- a/chromium/third_party/skia/tools/skp/page_sets/skia_css3gradients_desktop.py +++ b/chromium/third_party/skia/tools/skp/page_sets/skia_css3gradients_desktop.py @@ -37,7 +37,8 @@ class SkiaCss3gradientsDesktopPageSet(story.StorySet): urls_list = [ # Why: http://code.google.com/p/chromium/issues/detail?id=168448 - 'https://www.webkit.org/blog/1424/css3-gradients/', + # and https://bugs.chromium.org/p/skia/issues/detail?id=10390 + 'https://www.w3schools.com/css/css3_gradients.asp', ] for url in urls_list: diff --git a/chromium/third_party/skia/tools/skpbench/README.md b/chromium/third_party/skia/tools/skpbench/README.md new file mode 100644 index 00000000000..830c1568e2d --- /dev/null +++ b/chromium/third_party/skia/tools/skpbench/README.md @@ -0,0 +1,67 @@ +# skpbench + +skpbench is a benchmarking tool for replaying skp or mksp files on android devices. +it achieves a lower variance in framerate by controlling the clock speed and stopping +all other processes that could cause interference. + +## Build + +skpbench consists of the skpbench binary which must be built for the phone you intend to run on, +and skpbench.py which runs on the machine the phone is connected to via ADB and is the entry point. + +The to build skia for android are at https://skia.org/user/build#android and reproduced here. + +Download the Android NDK + +``` +cipd auth-login +python2 infra/bots/assets/android_ndk_linux/download.py -t /tmp/ndk + +``` + +After this is set up once, build skpbench for your target cpu (assumed to be arm64 here for a Pixel 3) + +``` +bin/gn gen out/arm64 --args='ndk="/tmp/ndk" target_cpu="arm64" is_debug=false' +ninja -C out/arm64 skpbench +``` + +## Benchmark an SKP on a connected device. + +First, copy the built skpbench binary and an example skp file to the device. + +``` +adb push out/arm64/skpbench /data/local/tmp +adb push /home/nifong/Downloads/foo.skp /data/local/tmp/skps/ +``` + +Run skpbench.py (in my case on a Pixel 3) + +``` +python tools/skpbench/skpbench.py \ + --adb \ + --force \ + --config gles \ + /data/local/tmp/skpbench \ + /data/local/tmp/skps/foo.skp +``` + +`--adb` specifies that it should use adb to the only connected device and run skpbench there. +`--force` is necessary because we don't yet have a configuration to monitor vitals on the Pixel 3. +`--config gles` specifies Open GL ES is the backend GPU config to use. + +Additional documentation of arguments is printed by `python tools/skpbench/skpbench.py --help` + +Output appears in the following format +``` + accum median max min stddev samples sample_ms clock metric config bench + 0.1834 0.1832 0.1897 0.1707 1.59% 101 50 cpu ms gles foo.skp +``` + +`accum` is the time taken to draw all frames, divided by the number of frames. +`metric` specifies that the unit is ms (milliseconds per frame) + +## Production + +skpbench is run as a tryjob from gerrit, where it uploads the results to perf.skia.org. +TODO(nifong, csmartdalton): elaborate on this section.
\ No newline at end of file diff --git a/chromium/third_party/skia/tools/skpbench/skpbench.cpp b/chromium/third_party/skia/tools/skpbench/skpbench.cpp index 8a0dda48a0b..e0c0fcb5776 100644 --- a/chromium/third_party/skia/tools/skpbench/skpbench.cpp +++ b/chromium/third_party/skia/tools/skpbench/skpbench.cpp @@ -60,8 +60,7 @@ */ static DEFINE_bool(ddl, false, "record the skp into DDLs before rendering"); -static DEFINE_int(ddlNumAdditionalThreads, 0, - "number of DDL recording threads in addition to main one"); +static DEFINE_int(ddlNumRecordingThreads, 0, "number of DDL recording threads (0=num_cores)"); static DEFINE_int(ddlTilingWidthHeight, 0, "number of tiles along one edge when in DDL mode"); static DEFINE_bool(comparableDDL, false, "render in a way that is comparable to 'comparableSKP'"); @@ -201,7 +200,8 @@ private: std::vector<SkDocumentPage> fFrames; }; -static void ddl_sample(GrContext* context, DDLTileHelper* tiles, GpuSync& gpuSync, Sample* sample, +static void ddl_sample(GrContext* context, DDLTileHelper* tiles, GpuSync& gpuSync, + Sample* sample, SkTaskGroup* recordingTaskGroup, SkTaskGroup* gpuTaskGroup, std::chrono::high_resolution_clock::time_point* startStopTime) { using clock = std::chrono::high_resolution_clock; @@ -220,12 +220,18 @@ static void ddl_sample(GrContext* context, DDLTileHelper* tiles, GpuSync& gpuSyn // through a DDL. tiles->drawAllTilesDirectly(context); } else { - // TODO: Here we create all the DDLs, wait, and then draw them all. This should be updated - // to use the GPUDDLSink method of having a separate GPU thread. - tiles->createDDLsInParallel(); - tiles->precompileAndDrawAllTiles(context); + tiles->kickOffThreadedWork(recordingTaskGroup, gpuTaskGroup, context); + recordingTaskGroup->wait(); + } + + if (gpuTaskGroup) { + gpuTaskGroup->add([&]{ + flush_with_sync(context, gpuSync); + }); + gpuTaskGroup->wait(); + } else { + flush_with_sync(context, gpuSync); } - flush_with_sync(context, gpuSync); *startStopTime = clock::now(); @@ -235,8 +241,9 @@ static void ddl_sample(GrContext* context, DDLTileHelper* tiles, GpuSync& gpuSyn } } -static void run_ddl_benchmark(GrContext* context, sk_sp<SkSurface> dstSurface, - SkPicture* inputPicture, std::vector<Sample>* samples) { +static void run_ddl_benchmark(sk_gpu_test::TestContext* testContext, GrContext *context, + sk_sp<SkSurface> dstSurface, SkPicture* inputPicture, + std::vector<Sample>* samples) { using clock = std::chrono::high_resolution_clock; const Sample::duration sampleDuration = std::chrono::milliseconds(FLAGS_sampleMs); const clock::duration benchDuration = std::chrono::milliseconds(FLAGS_duration); @@ -262,12 +269,26 @@ static void run_ddl_benchmark(GrContext* context, sk_sp<SkSurface> dstSurface, tiles.createSKPPerTile(compressedPictureData.get(), promiseImageHelper); - SkTaskGroup::Enabler enabled(FLAGS_ddlNumAdditionalThreads); + // In comparable modes, there is no GPU thread. The following pointers are all null. + // Otherwise, we transfer testContext onto the GPU thread until after the bench. + std::unique_ptr<SkExecutor> gpuThread; + std::unique_ptr<SkTaskGroup> gpuTaskGroup; + std::unique_ptr<SkExecutor> recordingThreadPool; + std::unique_ptr<SkTaskGroup> recordingTaskGroup; + if (!FLAGS_comparableDDL && !FLAGS_comparableSKP) { + gpuThread = SkExecutor::MakeFIFOThreadPool(1, false); + gpuTaskGroup = std::make_unique<SkTaskGroup>(*gpuThread); + recordingThreadPool = SkExecutor::MakeFIFOThreadPool(FLAGS_ddlNumRecordingThreads, false); + recordingTaskGroup = std::make_unique<SkTaskGroup>(*recordingThreadPool); + testContext->makeNotCurrent(); + gpuTaskGroup->add([=]{ testContext->makeCurrent(); }); + } clock::time_point startStopTime = clock::now(); GpuSync gpuSync; - ddl_sample(context, &tiles, gpuSync, nullptr, &startStopTime); + ddl_sample(context, &tiles, gpuSync, nullptr, recordingTaskGroup.get(), + gpuTaskGroup.get(), &startStopTime); clock::duration cumulativeDuration = std::chrono::milliseconds(0); @@ -277,16 +298,26 @@ static void run_ddl_benchmark(GrContext* context, sk_sp<SkSurface> dstSurface, do { tiles.resetAllTiles(); - ddl_sample(context, &tiles, gpuSync, &sample, &startStopTime); + ddl_sample(context, &tiles, gpuSync, &sample, recordingTaskGroup.get(), + gpuTaskGroup.get(), &startStopTime); } while (sample.fDuration < sampleDuration); cumulativeDuration += sample.fDuration; } while (cumulativeDuration < benchDuration || 0 == samples->size() % 2); + // Move the context back to this thread now that we're done benching. + if (gpuTaskGroup) { + gpuTaskGroup->add([=]{ + testContext->makeNotCurrent(); + }); + gpuTaskGroup->wait(); + testContext->makeCurrent(); + } + if (!FLAGS_png.isEmpty()) { // The user wants to see the final result dstSurface->draw(tiles.composeDDL()); - dstSurface->flush(); + dstSurface->flushAndSubmit(); } tiles.resetAllTiles(); @@ -296,6 +327,7 @@ static void run_ddl_benchmark(GrContext* context, sk_sp<SkSurface> dstSurface, GrFlushInfo flushInfo; flushInfo.fFlags = kSyncCpu_GrFlushFlag; context->flush(flushInfo); + context->submit(true); promiseImageHelper.deleteAllFromGPU(nullptr, context); @@ -335,6 +367,7 @@ static void run_benchmark(GrContext* context, SkSurface* surface, SkpProducer* s GrFlushInfo flushInfo; flushInfo.fFlags = kSyncCpu_GrFlushFlag; surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo); + context->submit(true); } static void run_gpu_time_benchmark(sk_gpu_test::GpuTimer* gpuTimer, GrContext* context, @@ -377,8 +410,10 @@ static void run_gpu_time_benchmark(sk_gpu_test::GpuTimer* gpuTimer, GrContext* c using QueryStatus = sk_gpu_test::GpuTimer::QueryStatus; case QueryStatus::kInvalid: exitf(ExitErr::kUnavailable, "GPU timer failed"); + break; case QueryStatus::kPending: exitf(ExitErr::kUnavailable, "timer query still not ready after fence sync"); + break; case QueryStatus::kDisjoint: if (FLAGS_verbosity >= 4) { fprintf(stderr, "discarding timer query due to disjoint operations.\n"); @@ -402,6 +437,7 @@ static void run_gpu_time_benchmark(sk_gpu_test::GpuTimer* gpuTimer, GrContext* c GrFlushInfo flushInfo; flushInfo.fFlags = kSyncCpu_GrFlushFlag; surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo); + context->submit(true); } void print_result(const std::vector<Sample>& samples, const char* config, const char* bench) { @@ -577,7 +613,7 @@ int main(int argc, char** argv) { } if (!FLAGS_gpuClock) { if (FLAGS_ddl) { - run_ddl_benchmark(ctx, surface, skp.get(), &samples); + run_ddl_benchmark(testCtx, ctx, surface, skp.get(), &samples); } else if (!mskp) { auto s = std::make_unique<StaticSkp>(skp); run_benchmark(ctx, surface.get(), s.get(), &samples); @@ -621,6 +657,7 @@ static void flush_with_sync(GrContext* context, GpuSync& gpuSync) { flushInfo.fFinishedContext = gpuSync.newFlushTracker(context); context->flush(flushInfo); + context->submit(); } static void draw_skp_and_flush_with_sync(GrContext* context, SkSurface* surface, diff --git a/chromium/third_party/skia/tools/skpbench/skpbench.py b/chromium/third_party/skia/tools/skpbench/skpbench.py index 8c53e9aed45..8c148188808 100755 --- a/chromium/third_party/skia/tools/skpbench/skpbench.py +++ b/chromium/third_party/skia/tools/skpbench/skpbench.py @@ -73,9 +73,9 @@ __argparse.add_argument('-a', '--resultsfile', help="optional file to append results into") __argparse.add_argument('--ddl', action='store_true', help="record the skp into DDLs before rendering") -__argparse.add_argument('--ddlNumAdditionalThreads', +__argparse.add_argument('--ddlNumRecordingThreads', type=int, default=0, - help="number of DDL recording threads in addition to main one") + help="number of DDL recording threads (0=num_cores)") __argparse.add_argument('--ddlTilingWidthHeight', type=int, default=0, help="number of tiles along one edge when in DDL mode") __argparse.add_argument('--gpuThreads', @@ -144,9 +144,9 @@ class SKPBench: # DDL parameters if FLAGS.ddl: ARGV.extend(['--ddl', 'true']) - if FLAGS.ddlNumAdditionalThreads: - ARGV.extend(['--ddlNumAdditionalThreads', - str(FLAGS.ddlNumAdditionalThreads)]) + if FLAGS.ddlNumRecordingThreads: + ARGV.extend(['--ddlNumRecordingThreads', + str(FLAGS.ddlNumRecordingThreads)]) if FLAGS.ddlTilingWidthHeight: ARGV.extend(['--ddlTilingWidthHeight', str(FLAGS.ddlTilingWidthHeight)]) diff --git a/chromium/third_party/skia/tools/skqp/bad_gms.txt b/chromium/third_party/skia/tools/skqp/bad_gms.txt index 551ba444af8..bf0c1f3b676 100644 --- a/chromium/third_party/skia/tools/skqp/bad_gms.txt +++ b/chromium/third_party/skia/tools/skqp/bad_gms.txt @@ -1,5 +1,4 @@ arcs_as_paths -atlastext bigbitmaprect_i bigbitmaprect_s blurcircles2 diff --git a/chromium/third_party/skia/tools/valgrind.supp b/chromium/third_party/skia/tools/valgrind.supp index 1e3a3e84106..57f7586ecfb 100644 --- a/chromium/third_party/skia/tools/valgrind.supp +++ b/chromium/third_party/skia/tools/valgrind.supp @@ -317,3 +317,19 @@ fun:_Z12GrClearImageRK11GrImageInfoPvm8SkRGBA4fIL11SkAlphaType3EE ... } +{ + make_get_error_with_random_oom1 + Memcheck:Leak + match-leak-kinds: definite + ... + fun:_Z30make_get_error_with_random_oom12GrGLFunctionIFjvEE + ... +} +{ + make_get_error_with_random_oom2 + Memcheck:Leak + match-leak-kinds: definite + ... + fun:make_get_error_with_random_oom + ... +} diff --git a/chromium/third_party/skia/tools/viewer/GMSlide.cpp b/chromium/third_party/skia/tools/viewer/GMSlide.cpp index 24d8421b304..1f904eb9dce 100644 --- a/chromium/third_party/skia/tools/viewer/GMSlide.cpp +++ b/chromium/third_party/skia/tools/viewer/GMSlide.cpp @@ -21,10 +21,15 @@ GMSlide::GMSlide(std::unique_ptr<skiagm::GM> gm) : fGM(std::move(gm)) { GMSlide::~GMSlide() = default; void GMSlide::draw(SkCanvas* canvas) { + SkString msg; + + fGM->setMode(skiagm::GM::kSample_Mode); + + fGM->gpuSetup(canvas->getGrContext(), &msg); // Do we care about timing the draw of the background (once)? // Does the GM ever rely on drawBackground to lazily compute something? fGM->drawBackground(canvas); - fGM->drawContent(canvas); + fGM->drawContent(canvas, &msg); } bool GMSlide::animate(double nanos) { return fGM->animate(nanos); } diff --git a/chromium/third_party/skia/tools/viewer/ImGuiLayer.cpp b/chromium/third_party/skia/tools/viewer/ImGuiLayer.cpp index 31b3a54eaae..768e2cce629 100644 --- a/chromium/third_party/skia/tools/viewer/ImGuiLayer.cpp +++ b/chromium/third_party/skia/tools/viewer/ImGuiLayer.cpp @@ -53,7 +53,7 @@ ImGuiLayer::ImGuiLayer() { io.Fonts->GetTexDataAsAlpha8(&pixels, &w, &h); SkImageInfo info = SkImageInfo::MakeA8(w, h); SkPixmap pmap(info, pixels, info.minRowBytes()); - SkMatrix localMatrix = SkMatrix::MakeScale(1.0f / w, 1.0f / h); + SkMatrix localMatrix = SkMatrix::Scale(1.0f / w, 1.0f / h); auto fontImage = SkImage::MakeFromRaster(pmap, nullptr, nullptr); auto fontShader = fontImage->makeShader(&localMatrix); fFontPaint.setShader(fontShader); diff --git a/chromium/third_party/skia/tools/viewer/SKPSlide.cpp b/chromium/third_party/skia/tools/viewer/SKPSlide.cpp index 1c03a5e4df0..b4655090641 100644 --- a/chromium/third_party/skia/tools/viewer/SKPSlide.cpp +++ b/chromium/third_party/skia/tools/viewer/SKPSlide.cpp @@ -11,7 +11,12 @@ #include "include/core/SkStream.h" #include "src/core/SkOSFile.h" -SKPSlide::SKPSlide(const SkString& name, const SkString& path) : fPath(path) { +SKPSlide::SKPSlide(const SkString& name, const SkString& path) + : SKPSlide(name, SkStream::MakeFromFile(path.c_str())) { +} + +SKPSlide::SKPSlide(const SkString& name, std::unique_ptr<SkStream> stream) + : fStream(std::move(stream)) { fName = name; } @@ -33,25 +38,18 @@ void SKPSlide::draw(SkCanvas* canvas) { } } -static sk_sp<SkPicture> read_picture(const char path[]) { - std::unique_ptr<SkStream> stream = SkStream::MakeFromFile(path); - if (!stream) { - SkDebugf("Could not read %s.\n", path); - return nullptr; - } - - auto pic = SkPicture::MakeFromStream(stream.get()); - if (!pic) { - SkDebugf("Could not read %s as an SkPicture.\n", path); - } - return pic; -} - void SKPSlide::load(SkScalar, SkScalar) { - fPic = read_picture(fPath.c_str()); - if (fPic) { - fCullRect = fPic->cullRect().roundOut(); + if (!fStream) { + SkDebugf("No skp stream for slide %s.\n", fName.c_str()); + return; + } + fStream->rewind(); + fPic = SkPicture::MakeFromStream(fStream.get()); + if (!fPic) { + SkDebugf("Could parse SkPicture from skp stream for slide %s.\n", fName.c_str()); + return; } + fCullRect = fPic->cullRect().roundOut(); } void SKPSlide::unload() { diff --git a/chromium/third_party/skia/tools/viewer/SKPSlide.h b/chromium/third_party/skia/tools/viewer/SKPSlide.h index e20225038cb..5e88ae0a39e 100644 --- a/chromium/third_party/skia/tools/viewer/SKPSlide.h +++ b/chromium/third_party/skia/tools/viewer/SKPSlide.h @@ -14,6 +14,7 @@ class SKPSlide : public Slide { public: SKPSlide(const SkString& name, const SkString& path); + SKPSlide(const SkString& name, std::unique_ptr<SkStream>); ~SKPSlide() override; SkISize getDimensions() const override { return fCullRect.size(); } @@ -23,9 +24,9 @@ public: void unload() override; private: - SkString fPath; + std::unique_ptr<SkStream> fStream; sk_sp<const SkPicture> fPic; - SkIRect fCullRect; + SkIRect fCullRect; }; #endif diff --git a/chromium/third_party/skia/tools/viewer/SkRiveSlide.cpp b/chromium/third_party/skia/tools/viewer/SkRiveSlide.cpp new file mode 100644 index 00000000000..de29104c01d --- /dev/null +++ b/chromium/third_party/skia/tools/viewer/SkRiveSlide.cpp @@ -0,0 +1,69 @@ +/* + * Copyright 2020 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "tools/viewer/SkRiveSlide.h" + +#include "include/core/SkCanvas.h" +#include "include/core/SkStream.h" + +#if defined(SK_ENABLE_SKRIVE) + +SkRiveSlide::SkRiveSlide(const SkString& name, const SkString& path) + : fPath(path) { + fName = name; +} + +SkRiveSlide::~SkRiveSlide() = default; + +void SkRiveSlide::load(SkScalar w, SkScalar h) { + fWinSize = {w , h}; + fRive = skrive::SkRive::Builder().make(SkFILEStream::Make(fPath.c_str())); + fRiveBounds = SkRect::MakeEmpty(); + + if (fRive) { + SkDebugf("Loaded Rive animation: %zu artboards\n", fRive->artboards().size()); + for (const auto& ab : fRive->artboards()) { + const auto& pos = ab->getTranslation(); + const auto& size = ab->getSize(); + + fRiveBounds.join(SkRect::MakeXYWH(pos.x, pos.y, size.x, size.y)); + } + } else { + SkDebugf("Failed to load Rive animation: %s\n", fPath.c_str()); + } +} + +void SkRiveSlide::unload() { + fRive.reset(); +} + +void SkRiveSlide::resize(SkScalar w, SkScalar h) { + fWinSize = {w , h}; +} + +SkISize SkRiveSlide::getDimensions() const { + // We always scale to fill the window. + return fWinSize.toCeil(); +} + +void SkRiveSlide::draw(SkCanvas* canvas) { + if (!fRive) { + return; + } + + // Scale the Rive artboards to fill our window. + SkAutoCanvasRestore acr(canvas, true); + canvas->concat(SkMatrix::MakeRectToRect(fRiveBounds, + SkRect::MakeSize(fWinSize), + SkMatrix::kCenter_ScaleToFit )); + + for (const auto& ab : fRive->artboards()) { + ab->render(canvas); + } +} + +#endif // defined(SK_ENABLE_SKRIVE) diff --git a/chromium/third_party/skia/tools/viewer/SkRiveSlide.h b/chromium/third_party/skia/tools/viewer/SkRiveSlide.h new file mode 100644 index 00000000000..820902e76e1 --- /dev/null +++ b/chromium/third_party/skia/tools/viewer/SkRiveSlide.h @@ -0,0 +1,41 @@ +/* + * Copyright 2020 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkRiveSlide_DEFINED +#define SkRiveSlide_DEFINED + +#include "tools/viewer/Slide.h" + +#if defined(SK_ENABLE_SKRIVE) + +#include "experimental/skrive/include/SkRive.h" + +class SkRiveSlide final : public Slide { +public: + SkRiveSlide(const SkString& name, const SkString& path); + ~SkRiveSlide() override; + +private: + void load(SkScalar winWidth, SkScalar winHeight) override; + void unload() override; + void resize(SkScalar, SkScalar) override; + + SkISize getDimensions() const override; + + void draw(SkCanvas*) override; + + const SkString fPath; + + sk_sp<skrive::SkRive> fRive; + SkRect fRiveBounds; + SkSize fWinSize; + + using INHERITED = Slide; +}; + +#endif // defined(SK_ENABLE_SKRIVE) +#endif // SkRiveSlide_DEFINED diff --git a/chromium/third_party/skia/tools/viewer/SkSLSlide.cpp b/chromium/third_party/skia/tools/viewer/SkSLSlide.cpp index f564df25a94..81a628cd28c 100644 --- a/chromium/third_party/skia/tools/viewer/SkSLSlide.cpp +++ b/chromium/third_party/skia/tools/viewer/SkSLSlide.cpp @@ -10,12 +10,9 @@ #include "include/core/SkCanvas.h" #include "include/effects/SkGradientShader.h" #include "include/effects/SkPerlinNoiseShader.h" -#include "include/gpu/GrContext.h" #include "src/core/SkEnumerate.h" -#include "src/gpu/GrContextPriv.h" -#include "src/gpu/GrShaderUtils.h" #include "tools/Resources.h" -#include "tools/viewer/ImGuiLayer.h" +#include "tools/viewer/Viewer.h" #include <algorithm> #include "imgui.h" @@ -41,10 +38,10 @@ SkSLSlide::SkSLSlide() { fSkSL = - "in fragmentProcessor fp;\n" + "in shader child;\n" "\n" "void main(float2 p, inout half4 color) {\n" - " color = sample(fp, p);\n" + " color = sample(child, p);\n" "}\n"; fCodeIsDirty = true; @@ -80,10 +77,10 @@ void SkSLSlide::unload() { fShaders.reset(); } -bool SkSLSlide::rebuild(GrContextOptions::ShaderErrorHandler* errorHandler) { +bool SkSLSlide::rebuild() { auto [effect, errorText] = SkRuntimeEffect::Make(fSkSL); if (!effect) { - errorHandler->compileError(fSkSL.c_str(), errorText.c_str()); + Viewer::ShaderErrorHandler()->compileError(fSkSL.c_str(), errorText.c_str()); return false; } @@ -105,10 +102,6 @@ bool SkSLSlide::rebuild(GrContextOptions::ShaderErrorHandler* errorHandler) { } void SkSLSlide::draw(SkCanvas* canvas) { - GrContextOptions::ShaderErrorHandler* errorHandler = GrShaderUtils::DefaultShaderErrorHandler(); - if (auto grContext = canvas->getGrContext()) { - errorHandler = grContext->priv().getShaderErrorHandler(); - } canvas->clear(SK_ColorWHITE); ImGui::Begin("SkSL", nullptr, ImGuiWindowFlags_AlwaysVerticalScrollbar); @@ -122,7 +115,7 @@ void SkSLSlide::draw(SkCanvas* canvas) { } if (fCodeIsDirty || !fEffect) { - this->rebuild(errorHandler); + this->rebuild(); } if (!fEffect) { diff --git a/chromium/third_party/skia/tools/viewer/SkSLSlide.h b/chromium/third_party/skia/tools/viewer/SkSLSlide.h index a778350ef11..4287c398b9d 100644 --- a/chromium/third_party/skia/tools/viewer/SkSLSlide.h +++ b/chromium/third_party/skia/tools/viewer/SkSLSlide.h @@ -11,7 +11,6 @@ #include "tools/viewer/Slide.h" #include "include/effects/SkRuntimeEffect.h" -#include "include/gpu/GrContextOptions.h" class SkSLSlide : public Slide { public: @@ -26,7 +25,7 @@ public: void unload() override; private: - bool rebuild(GrContextOptions::ShaderErrorHandler*); + bool rebuild(); SkString fSkSL; bool fCodeIsDirty; diff --git a/chromium/third_party/skia/tools/viewer/SkottieSlide.cpp b/chromium/third_party/skia/tools/viewer/SkottieSlide.cpp index 9467c52c0c4..18561356dde 100644 --- a/chromium/third_party/skia/tools/viewer/SkottieSlide.cpp +++ b/chromium/third_party/skia/tools/viewer/SkottieSlide.cpp @@ -96,7 +96,12 @@ void SkottieSlide::load(SkScalar w, SkScalar h) { }; auto logger = sk_make_sp<Logger>(); - skottie::Animation::Builder builder; + + uint32_t flags = 0; + if (fPreferGlyphPaths) { + flags |= skottie::Animation::Builder::kPreferEmbeddedFonts; + } + skottie::Animation::Builder builder(flags); auto resource_provider = skresources::DataURIResourceProviderProxy::Make( @@ -221,9 +226,11 @@ bool SkottieSlide::onChar(SkUnichar c) { switch (c) { case 'I': fShowAnimationStats = !fShowAnimationStats; - break; - default: - break; + return true; + case 'G': + fPreferGlyphPaths = !fPreferGlyphPaths; + this->load(fWinSize.width(), fWinSize.height()); + return true; } return INHERITED::onChar(c); diff --git a/chromium/third_party/skia/tools/viewer/SkottieSlide.h b/chromium/third_party/skia/tools/viewer/SkottieSlide.h index dd0a49f66b1..aec76a32cac 100644 --- a/chromium/third_party/skia/tools/viewer/SkottieSlide.h +++ b/chromium/third_party/skia/tools/viewer/SkottieSlide.h @@ -53,7 +53,8 @@ private: bool fShowAnimationInval = false, fShowAnimationStats = false, fShowUI = false, - fDraggingProgress = false; + fDraggingProgress = false, + fPreferGlyphPaths = false; typedef Slide INHERITED; }; diff --git a/chromium/third_party/skia/tools/viewer/SvgSlide.cpp b/chromium/third_party/skia/tools/viewer/SvgSlide.cpp index 3779ffd3f7f..c420843464c 100644 --- a/chromium/third_party/skia/tools/viewer/SvgSlide.cpp +++ b/chromium/third_party/skia/tools/viewer/SvgSlide.cpp @@ -14,18 +14,26 @@ #include "include/core/SkStream.h" SvgSlide::SvgSlide(const SkString& name, const SkString& path) - : fPath(path) { + : SvgSlide(name, SkStream::MakeFromFile(path.c_str())) { +} + +SvgSlide::SvgSlide(const SkString& name, std::unique_ptr<SkStream> stream) + : fStream(std::move(stream)) { fName = name; } void SvgSlide::load(SkScalar w, SkScalar h) { - fWinSize = SkSize::Make(w, h); + if (!fStream) { + SkDebugf("No svg stream for slide %s.\n", fName.c_str()); + return; + } - if (const auto svgStream = SkStream::MakeFromFile(fPath.c_str())) { - fDom = SkSVGDOM::MakeFromStream(*svgStream); - if (fDom) { - fDom->setContainerSize(fWinSize); - } + fWinSize = SkSize::Make(w, h); + + fStream->rewind(); + fDom = SkSVGDOM::MakeFromStream(*fStream); + if (fDom) { + fDom->setContainerSize(fWinSize); } } diff --git a/chromium/third_party/skia/tools/viewer/SvgSlide.h b/chromium/third_party/skia/tools/viewer/SvgSlide.h index ccc840ed8c8..6a15a307b0c 100644 --- a/chromium/third_party/skia/tools/viewer/SvgSlide.h +++ b/chromium/third_party/skia/tools/viewer/SvgSlide.h @@ -15,6 +15,7 @@ class SkSVGDOM; class SvgSlide final : public Slide { public: SvgSlide(const SkString& name, const SkString& path); + SvgSlide(const SkString& name, std::unique_ptr<SkStream>); void load(SkScalar winWidth, SkScalar winHeight) override; void unload() override; @@ -24,9 +25,8 @@ public: void draw(SkCanvas*) override; private: - const SkString fPath; - - SkSize fWinSize = SkSize::MakeEmpty(); + std::unique_ptr<SkStream> fStream; + SkSize fWinSize = SkSize::MakeEmpty(); sk_sp<SkSVGDOM> fDom; typedef Slide INHERITED; diff --git a/chromium/third_party/skia/tools/viewer/Viewer.cpp b/chromium/third_party/skia/tools/viewer/Viewer.cpp index 6d41aad1ce7..45d4fbd177b 100644 --- a/chromium/third_party/skia/tools/viewer/Viewer.cpp +++ b/chromium/third_party/skia/tools/viewer/Viewer.cpp @@ -50,9 +50,16 @@ #include "imgui.h" #include "misc/cpp/imgui_stdlib.h" // For ImGui support of std::string +#ifdef SK_VULKAN +#include "spirv-tools/libspirv.hpp" +#endif + #if defined(SK_ENABLE_SKOTTIE) #include "tools/viewer/SkottieSlide.h" #endif +#if defined(SK_ENABLE_SKRIVE) + #include "tools/viewer/SkRiveSlide.h" +#endif class CapturingShaderErrorHandler : public GrContextOptions::ShaderErrorHandler { public: @@ -72,6 +79,8 @@ public: static CapturingShaderErrorHandler gShaderErrorHandler; +GrContextOptions::ShaderErrorHandler* Viewer::ShaderErrorHandler() { return &gShaderErrorHandler; } + using namespace sk_app; static std::map<GpuPathRenderers, std::string> gPathRendererNames; @@ -83,15 +92,34 @@ Application* Application::Create(int argc, char** argv, void* platformData) { static DEFINE_string(slide, "", "Start on this sample."); static DEFINE_bool(list, false, "List samples?"); -#if defined(SK_VULKAN) -# define BACKENDS_STR "\"sw\", \"gl\", and \"vk\"" -#elif defined(SK_METAL) && defined(SK_BUILD_FOR_MAC) -# define BACKENDS_STR "\"sw\", \"gl\", and \"mtl\"" -#elif defined(SK_DAWN) -# define BACKENDS_STR "\"sw\", \"gl\", and \"dawn\"" +#ifdef SK_GL +#define GL_BACKEND_STR ", \"gl\"" +#else +#define GL_BACKEND_STR +#endif +#ifdef SK_VULKAN +#define VK_BACKEND_STR ", \"vk\"" +#else +#define VK_BACKEND_STR +#endif +#ifdef SK_METAL +#define MTL_BACKEND_STR ", \"mtl\"" +#else +#define MTL_BACKEND_STR +#endif +#ifdef SK_DIRECT3D +#define D3D_BACKEND_STR ", \"d3d\"" #else -# define BACKENDS_STR "\"sw\" and \"gl\"" +#define D3D_BACKEND_STR #endif +#ifdef SK_DAWN +#define DAWN_BACKEND_STR ", \"dawn\"" +#else +#define DAWN_BACKEND_STR +#endif +#define BACKENDS_STR_EVALUATOR(sw, gl, vk, mtl, d3d, dawn) sw gl vk mtl d3d dawn +#define BACKENDS_STR BACKENDS_STR_EVALUATOR( \ + "\"sw\"", GL_BACKEND_STR, VK_BACKEND_STR, MTL_BACKEND_STR, D3D_BACKEND_STR, DAWN_BACKEND_STR) static DEFINE_string2(backend, b, "sw", "Backend to use. Allowed values are " BACKENDS_STR "."); @@ -116,10 +144,13 @@ static DEFINE_string2(match, m, nullptr, static DEFINE_string(skps, "/data/local/tmp/skps", "Directory to read skps from."); static DEFINE_string(lotties, "/data/local/tmp/lotties", "Directory to read (Bodymovin) jsons from."); + static DEFINE_string(rives, "/data/local/tmp/rives", + "Directory to read Rive (Flare) files from."); #else static DEFINE_string(jpgs, "jpgs", "Directory to read jpgs from."); static DEFINE_string(skps, "skps", "Directory to read skps from."); static DEFINE_string(lotties, "lotties", "Directory to read (Bodymovin) jsons from."); + static DEFINE_string(rives, "rives", "Directory to read Rive (Flare) files from."); #endif static DEFINE_string(svgs, "", "Directory to read SVGs from, or a single SVG file."); @@ -153,6 +184,9 @@ const char* kBackendTypeStrings[sk_app::Window::kBackendTypeCount] = { #ifdef SK_METAL "Metal", #endif +#ifdef SK_DIRECT3D + "Direct3D", +#endif "Raster" }; @@ -177,6 +211,12 @@ static sk_app::Window::BackendType get_backend_type(const char* str) { return sk_app::Window::kMetal_BackendType; } else #endif +#ifdef SK_DIRECT3D + if (0 == strcmp(str, "d3d")) { + return sk_app::Window::kDirect3D_BackendType; + } else +#endif + if (0 == strcmp(str, "gl")) { return sk_app::Window::kNativeGL_BackendType; } else if (0 == strcmp(str, "sw")) { @@ -666,6 +706,12 @@ void Viewer::initSlides() { return sk_make_sp<SkottieSlide>(name, path);} }, #endif + #if defined(SK_ENABLE_SKRIVE) + { ".flr", "skrive-dir", FLAGS_rives, + [](const SkString& name, const SkString& path) -> sk_sp<Slide> { + return sk_make_sp<SkRiveSlide>(name, path);} + }, + #endif #if defined(SK_XML) { ".svg", "svg-dir", FLAGS_svgs, [](const SkString& name, const SkString& path) -> sk_sp<Slide> { @@ -1133,7 +1179,7 @@ SkMatrix Viewer::computeMatrix() { void Viewer::setBackend(sk_app::Window::BackendType backendType) { fPersistentCache.reset(); - fCachedGLSL.reset(); + fCachedShaders.reset(); fBackendType = backendType; fWindow->detach(); @@ -1422,7 +1468,7 @@ void Viewer::drawSlide(SkSurface* surface) { // Force a flush so we can time that, too fStatsLayer.beginTiming(fFlushTimer); - slideSurface->flush(); + slideSurface->flushAndSubmit(); fStatsLayer.endTiming(fFlushTimer); // If we rendered offscreen, snap an image and push the results to the window's canvas @@ -1647,6 +1693,35 @@ static bool ImGui_DragQuad(SkPoint* pts) { return dc.fDragging; } +static SkSL::String build_sksl_highlight_shader() { + return SkSL::String("out half4 sk_FragColor;\n" + "void main() { sk_FragColor = half4(1, 0, 1, 0.5); }"); +} + +static SkSL::String build_metal_highlight_shader(const SkSL::String& inShader) { + // Metal fragment shaders need a lot of non-trivial boilerplate that we don't want to recompute + // here. So keep all shader code, but right before `return *_out;`, swap out the sk_FragColor. + size_t pos = inShader.rfind("return *_out;\n"); + if (pos == std::string::npos) { + return inShader; + } + + SkSL::String replacementShader = inShader; + replacementShader.insert(pos, "_out->sk_FragColor = float4(1.0, 0.0, 1.0, 0.5); "); + return replacementShader; +} + +static SkSL::String build_glsl_highlight_shader(const GrShaderCaps& shaderCaps) { + const char* versionDecl = shaderCaps.versionDeclString(); + SkSL::String highlight = versionDecl ? versionDecl : ""; + if (shaderCaps.usesPrecisionModifiers()) { + highlight.append("precision mediump float;\n"); + } + highlight.appendf("out vec4 sk_FragColor;\n" + "void main() { sk_FragColor = vec4(1, 0, 1, 0.5); }"); + return highlight; +} + void Viewer::drawImGui() { // Support drawing the ImGui demo window. Superfluous, but gives a good idea of what's possible if (fShowImGuiTestWindow) { @@ -1684,6 +1759,10 @@ void Viewer::drawImGui() { ImGui::SameLine(); ImGui::RadioButton("Metal", &newBackend, sk_app::Window::kMetal_BackendType); #endif +#if defined(SK_DIRECT3D) + ImGui::SameLine(); + ImGui::RadioButton("Direct3D", &newBackend, sk_app::Window::kDirect3D_BackendType); +#endif if (newBackend != fBackendType) { fDeferredActions.push_back([=]() { this->setBackend(static_cast<sk_app::Window::BackendType>(newBackend)); @@ -2147,30 +2226,22 @@ void Viewer::drawImGui() { } } - bool backendIsGL = Window::kNativeGL_BackendType == fBackendType -#if SK_ANGLE && defined(SK_BUILD_FOR_WIN) - || Window::kANGLE_BackendType == fBackendType + if (ImGui::CollapsingHeader("Shaders")) { + bool sksl = params.fGrContextOptions.fShaderCacheStrategy == + GrContextOptions::ShaderCacheStrategy::kSkSL; +#if defined(SK_VULKAN) + const bool isVulkan = fBackendType == sk_app::Window::kVulkan_BackendType; +#else + const bool isVulkan = false; #endif - ; - - // HACK: If we get here when SKSL caching isn't enabled, and we're on a backend other - // than GL, we need to force it on. Just do that on the first frame after the backend - // switch, then resume normal operation. - if (!backendIsGL && - params.fGrContextOptions.fShaderCacheStrategy != - GrContextOptions::ShaderCacheStrategy::kSkSL) { - params.fGrContextOptions.fShaderCacheStrategy = - GrContextOptions::ShaderCacheStrategy::kSkSL; - paramsChanged = true; - fPersistentCache.reset(); - } else if (ImGui::CollapsingHeader("Shaders")) { - // To re-load shaders from the currently active programs, we flush all caches on one - // frame, then set a flag to poll the cache on the next frame. + + // To re-load shaders from the currently active programs, we flush all + // caches on one frame, then set a flag to poll the cache on the next frame. static bool gLoadPending = false; if (gLoadPending) { auto collectShaders = [this](sk_sp<const SkData> key, sk_sp<SkData> data, int hitCount) { - CachedGLSL& entry(fCachedGLSL.push_back()); + CachedShader& entry(fCachedShaders.push_back()); entry.fKey = key; SkMD5 hash; hash.write(key->bytes(), key->size()); @@ -2179,37 +2250,47 @@ void Viewer::drawImGui() { entry.fKeyString.appendf("%02x", digest.data[i]); } - SkReader32 reader(data->data(), data->size()); + SkReadBuffer reader(data->data(), data->size()); entry.fShaderType = GrPersistentCacheUtils::GetType(&reader); GrPersistentCacheUtils::UnpackCachedShaders(&reader, entry.fShader, entry.fInputs, kGrShaderTypeCount); }; - fCachedGLSL.reset(); + fCachedShaders.reset(); fPersistentCache.foreach(collectShaders); gLoadPending = false; + +#if defined(SK_VULKAN) + if (isVulkan && !sksl) { + spvtools::SpirvTools tools(SPV_ENV_VULKAN_1_0); + for (auto& entry : fCachedShaders) { + for (int i = 0; i < kGrShaderTypeCount; ++i) { + const SkSL::String& spirv(entry.fShader[i]); + std::string disasm; + tools.Disassemble((const uint32_t*)spirv.c_str(), spirv.size() / 4, + &disasm); + entry.fShader[i].assign(disasm); + } + } + } +#endif } // Defer actually doing the load/save logic so that we can trigger a save when we // start or finish hovering on a tree node in the list below: bool doLoad = ImGui::Button("Load"); ImGui::SameLine(); - bool doSave = ImGui::Button("Save"); - if (backendIsGL) { - ImGui::SameLine(); - bool sksl = params.fGrContextOptions.fShaderCacheStrategy == - GrContextOptions::ShaderCacheStrategy::kSkSL; - if (ImGui::Checkbox("SkSL", &sksl)) { - params.fGrContextOptions.fShaderCacheStrategy = sksl - ? GrContextOptions::ShaderCacheStrategy::kSkSL - : GrContextOptions::ShaderCacheStrategy::kBackendSource; - paramsChanged = true; - doLoad = true; - fDeferredActions.push_back([=]() { fPersistentCache.reset(); }); - } + bool doSave = ImGui::Button("Save"); ImGui::SameLine(); + if (ImGui::Checkbox("SkSL", &sksl)) { + params.fGrContextOptions.fShaderCacheStrategy = + sksl ? GrContextOptions::ShaderCacheStrategy::kSkSL + : GrContextOptions::ShaderCacheStrategy::kBackendSource; + paramsChanged = true; + doLoad = true; + fDeferredActions.push_back([=]() { fPersistentCache.reset(); }); } ImGui::BeginChild("##ScrollingRegion"); - for (auto& entry : fCachedGLSL) { + for (auto& entry : fCachedShaders) { bool inTreeNode = ImGui::TreeNode(entry.fKeyString.c_str()); bool hovered = ImGui::IsItemHovered(); if (hovered != entry.fHovered) { @@ -2234,30 +2315,35 @@ void Viewer::drawImGui() { fWindow->getGrContext()->priv().getGpu()->resetShaderCacheForTesting(); gLoadPending = true; } + // We don't support updating SPIRV shaders. We could re-assemble them (with edits), + // but I'm not sure anyone wants to do that. + if (isVulkan && !sksl) { + doSave = false; + } if (doSave) { - // The hovered item (if any) gets a special shader to make it identifiable - auto shaderCaps = ctx->priv().caps()->shaderCaps(); - bool sksl = params.fGrContextOptions.fShaderCacheStrategy == - GrContextOptions::ShaderCacheStrategy::kSkSL; - - SkSL::String highlight; - if (!sksl) { - highlight = shaderCaps->versionDeclString(); - if (shaderCaps->usesPrecisionModifiers()) { - highlight.append("precision mediump float;\n"); - } - } - const char* f4Type = sksl ? "half4" : "vec4"; - highlight.appendf("out %s sk_FragColor;\n" - "void main() { sk_FragColor = %s(1, 0, 1, 0.5); }", - f4Type, f4Type); - fPersistentCache.reset(); fWindow->getGrContext()->priv().getGpu()->resetShaderCacheForTesting(); - for (auto& entry : fCachedGLSL) { + for (auto& entry : fCachedShaders) { SkSL::String backup = entry.fShader[kFragment_GrShaderType]; if (entry.fHovered) { - entry.fShader[kFragment_GrShaderType] = highlight; + // The hovered item (if any) gets a special shader to make it + // identifiable. + SkSL::String& fragShader = entry.fShader[kFragment_GrShaderType]; + switch (entry.fShaderType) { + case SkSetFourByteTag('S', 'K', 'S', 'L'): { + fragShader = build_sksl_highlight_shader(); + break; + } + case SkSetFourByteTag('G', 'L', 'S', 'L'): { + fragShader = build_glsl_highlight_shader( + *ctx->priv().caps()->shaderCaps()); + break; + } + case SkSetFourByteTag('M', 'S', 'L', ' '): { + fragShader = build_metal_highlight_shader(fragShader); + break; + } + } } auto data = GrPersistentCacheUtils::PackCachedShaders(entry.fShaderType, diff --git a/chromium/third_party/skia/tools/viewer/Viewer.h b/chromium/third_party/skia/tools/viewer/Viewer.h index 41c478e7bcb..47913ae660d 100644 --- a/chromium/third_party/skia/tools/viewer/Viewer.h +++ b/chromium/third_party/skia/tools/viewer/Viewer.h @@ -11,6 +11,7 @@ #include "gm/gm.h" #include "include/core/SkExecutor.h" #include "include/core/SkFont.h" +#include "include/gpu/GrContextOptions.h" #include "src/core/SkScan.h" #include "src/sksl/SkSLString.h" #include "src/sksl/ir/SkSLProgram.h" @@ -45,6 +46,8 @@ public: bool onPinch(skui::InputState state, float scale, float x, float y) override; bool onFling(skui::InputState state) override; + static GrContextOptions::ShaderErrorHandler* ShaderErrorHandler(); + struct SkFontFields { bool fTypeface = false; bool fSize = false; @@ -193,7 +196,7 @@ private: SkFontFields fFontOverrides; bool fPixelGeometryOverrides = false; - struct CachedGLSL { + struct CachedShader { bool fHovered = false; sk_sp<const SkData> fKey; @@ -205,7 +208,7 @@ private: }; sk_gpu_test::MemoryCache fPersistentCache; - SkTArray<CachedGLSL> fCachedGLSL; + SkTArray<CachedShader> fCachedShaders; }; #endif |