From b2437e3a75326d4c61b688939893b22b641885b0 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Wed, 11 Feb 2026 20:21:05 +0100 Subject: [PATCH 01/42] add/data/any-imports [1.2.3-add-data-any-imports.0] start --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7f61bee..e1e6baf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fantasy-maphub", "name_full": "Fantasy MapHub Generators", - "version": "1.2.2", + "version": "1.2.3-add-data-any-imports.0", "description": "An offline-first hub that bundles several Watabou map generators into one consistent web app: same UI patterns, local assets, and modern import/export. It adds OpenAPI docs, proto-first serialization (including pure protobuf files), and a PWA build so everything works without an internet connection.", "license": "MPL-2.0", "author": "mail@sunsung.fun", From 60760b8e42649e754ffd043db1f999166c57b0d2 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Wed, 11 Feb 2026 21:51:20 +0100 Subject: [PATCH 02/42] =?UTF-8?q?add/data/any-imports=20[1.2.3-add-data-an?= =?UTF-8?q?y-imports.0]=20=20=D0=BD=D0=B0=20=D0=B1=D1=83=D0=B4=D1=83=D1=89?= =?UTF-8?q?=D0=B5=D0=B5=20=D0=B4=D0=BB=D1=8F=20=D0=B5=D0=B4=D0=B8=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D1=84=D1=80=D0=B5=D0=B9=D0=BC=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/Cave.js | 1 + src/js/Dwellings.js | 1 + src/js/ToyTown2.js | 1 + src/js/Village.js | 1 + src/js/mfcg.js | 1 + 5 files changed, 5 insertions(+) diff --git a/src/js/Cave.js b/src/js/Cave.js index 7a3ba29..9eb581b 100644 --- a/src/js/Cave.js +++ b/src/js/Cave.js @@ -8,6 +8,7 @@ import * as DataCave from "./shared/data/Cave.js"; import * as DataGlade from "./shared/data/Glade.js"; const params = FuncProto.initParams(JSON.parse(String.raw`{{EMBED_PARAMETERS_JSON_CAVE}}`)); +const isFrame = typeof window.parent.pingFrame === "function" var $lime_init = function (A, r) { var C = function (r, C) { diff --git a/src/js/Dwellings.js b/src/js/Dwellings.js index 58bde10..29d1991 100644 --- a/src/js/Dwellings.js +++ b/src/js/Dwellings.js @@ -10,6 +10,7 @@ import * as DataProto from "./struct/data.js"; import * as FuncBin from "./shared/data/bin-verify.js"; const params = FuncProto.initParams(JSON.parse(String.raw`{{EMBED_PARAMETERS_JSON_DWELLINGS}}`)); +const isFrame = typeof window.parent.pingFrame === "function" var $lime_init = function (K, v) { var B = function (v, B) { diff --git a/src/js/ToyTown2.js b/src/js/ToyTown2.js index e019b01..4f0b124 100644 --- a/src/js/ToyTown2.js +++ b/src/js/ToyTown2.js @@ -11,6 +11,7 @@ import * as DataProto from "./struct/data.js"; const params = FuncProto.initParams(JSON.parse(String.raw`{{EMBED_PARAMETERS_JSON_VIEWER}}`)); let GetParamName = new URLSearchParams(window.location.search).get('name') || ''; +const isFrame = typeof window.parent.pingFrame === "function" if (params !== null) (function (S, u) { S.lime = S.lime || {}; diff --git a/src/js/Village.js b/src/js/Village.js index 22bc638..3d7eaff 100644 --- a/src/js/Village.js +++ b/src/js/Village.js @@ -10,6 +10,7 @@ import * as DataProto from "./struct/data.js"; import * as FuncBin from "./shared/data/bin-verify.js"; const params = FuncProto.initParams(JSON.parse(String.raw`{{EMBED_PARAMETERS_JSON_VILLAGE}}`)); +const isFrame = typeof window.parent.pingFrame === "function" var $lime_init = function (E, u) { var A = function (u, A) { diff --git a/src/js/mfcg.js b/src/js/mfcg.js index c981e59..b952e50 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -12,6 +12,7 @@ import {paletteProtoBytesFromObj} from "./shared/data/mfcg.js"; import {exportBin} from "./shared/data/bin-verify.js"; const params = FuncProto.initParams(JSON.parse(String.raw`{{EMBED_PARAMETERS_JSON_MFCG}}`)); +const isFrame = typeof window.parent.pingFrame === "function" var $lime_init = function (A, t) { var E = function (t, E) { From a31f98a7fe8934087d3b73482329875122a5d253 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Wed, 11 Feb 2026 22:30:10 +0100 Subject: [PATCH 03/42] =?UTF-8?q?add/data/any-imports=20[1.2.3-add-data-an?= =?UTF-8?q?y-imports.0]=20=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BD=D0=BE=D1=80=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=BC=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- protobuf/data/dwellings/obj.proto | 1 + src/js/Dwellings.js | 243 ++++++++++++++++++++++++++++++ src/js/ToyTown2.js | 2 +- src/js/shared/data/Dwellings.js | 92 ++++++++++- 5 files changed, 339 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d9207a6..278c1f0 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ When deploying to a server, it’s enough to move the contents of the `dist` fol This project is built based on predefined values and page templates; to make changes, it’s enough to interact with these files: --[package.json](./package.json) --[static.config.mjs](./static.config.mjs) --[pages.config.mjs](./pages.config.mjs) +- [package.json](./package.json) +- [static.config.mjs](./static.config.mjs) +- [pages.config.mjs](./pages.config.mjs) If needed, you can “cut out” only one specific generator — at the code level they are self-contained and independent of their neighbors. diff --git a/protobuf/data/dwellings/obj.proto b/protobuf/data/dwellings/obj.proto index 79eb6d5..be27947 100644 --- a/protobuf/data/dwellings/obj.proto +++ b/protobuf/data/dwellings/obj.proto @@ -20,4 +20,5 @@ message DwellingsObj { repeated DwellingsPlanObj floors = 1; DwellingsEdgeObj exit = 2; DwellingsEdgeObj spiral = 3; + reserved 4 to 19; } diff --git a/src/js/Dwellings.js b/src/js/Dwellings.js index 29d1991..9a1c9fc 100644 --- a/src/js/Dwellings.js +++ b/src/js/Dwellings.js @@ -6711,6 +6711,222 @@ var $lime_init = function (K, v) { for(var b=[],c=0;cb.maxI&&(b.maxI=c); + d>b.maxJ&&(b.maxJ=d) + }; + sb._edgeFromJson=function(a,b,c,d){ + var g=a.cell; + var f=d.cell(g.i-b,g.j-c); + var e=sb.json2dir(a.dir); + if(f==null||e==null)return null; + return d.cellNdir2edge(f,e) + }; + sb._cellFromJson=function(a,b,c,d){ + return d.cell(a.i-b,a.j-c) + }; + sb.importFromFile=function(a,b){ + var u8=b instanceof Uint8Array?b:(b.b instanceof Uint8Array?b.b.subarray(0,b.length):b); + var msg=DataDwellings.decodeDwellingsFile(a,u8); + return sb.importFromProtoJson(sb.proto2json(msg),a) + }; + sb.importFromProtoJson=function(a,b){ + if(a==null||a.floors==null||a.floors.length==0)throw new Error("empty"); + var c={minI:Infinity,minJ:Infinity,maxI:-Infinity,maxJ:-Infinity}; + var d=0,g=a.floors; + for(d=0;d Date: Thu, 12 Feb 2026 19:27:05 +0100 Subject: [PATCH 04/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.0]=20=20=D0=BC=D0=B5=D1=80=D0=B4=D0=B6=20=D1=81=20?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D1=8B=D0=BC=20?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4722076..c745ec4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fantasy-maphub", "name_full": "Fantasy MapHub Generators", - "version": "1.2.3", + "version": "1.2.4-add-data-any-imports.0", "description": "An offline-first hub that bundles several Watabou map generators into one consistent web app: same UI patterns, local assets, and modern import/export. It adds OpenAPI docs, proto-first serialization (including pure protobuf files), and a PWA build so everything works without an internet connection.", "license": "MPL-2.0", "author": "mail@sunsung.fun", From 4248e839ef3d3c38dbcd8ddf539da84acbbc1041 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Thu, 12 Feb 2026 19:32:36 +0100 Subject: [PATCH 05/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.0]=20=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D0=BC=D0=B5=D1=80=D0=B4=D0=B6?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/Dwellings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/Dwellings.js b/src/js/Dwellings.js index fb43815..1ac81fd 100644 --- a/src/js/Dwellings.js +++ b/src/js/Dwellings.js @@ -6756,7 +6756,7 @@ var $lime_init = function (K, v) { sb.importFromFile=function(a,b){ var u8=b instanceof Uint8Array?b:(b.b instanceof Uint8Array?b.b.subarray(0,b.length):b); var msg=DataDwellings.decodeDwellingsFile(a,u8); - return sb.importFromProtoJson(sb.proto2json(msg),a) + return sb.importFromProtoJson(msg,a) }; sb.importFromProtoJson=function(a,b){ if(a==null||a.floors==null||a.floors.length==0)throw new Error("empty"); From 37cd88b170d4310b501a9cf4c9e882c365081f7a Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Thu, 12 Feb 2026 21:51:53 +0100 Subject: [PATCH 06/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.0]=20=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82/=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=20=D0=B4=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D1=81=D1=82=D1=8C=D1=8E=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D0=BE=D0=BD=D1=87=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/Dwellings.js | 95 +++++++++++++- src/js/shared/data/Dwellings.js | 218 +++++++++++++++++++++++++++----- 2 files changed, 277 insertions(+), 36 deletions(-) diff --git a/src/js/Dwellings.js b/src/js/Dwellings.js index 1ac81fd..512d6cf 100644 --- a/src/js/Dwellings.js +++ b/src/js/Dwellings.js @@ -6579,7 +6579,7 @@ var $lime_init = function (K, v) { a.basement!=null&&b.push(sb.plan2proto(a.basement,a.chimneys)); var c=new DataProto.data.DwellingsObj({floors:b,exit:sb.edge2proto(a.floors[0].entrance.door)}); a.floors[0].spiral!=null&&(c.spiral=sb.edge2proto(a.floors[0].spiral.entrance)); - a.name!=null&&a.name!=""; + a.name!=null&&a.name!=""&&(c.embedName=a.name); var e=ib.get("architecture"); if(e!=null){var f=DataProto.data.DwellingsArchitectureType[e];f!==void 0&&(c.embedArchitecture=f)} return c @@ -6735,6 +6735,15 @@ var $lime_init = function (K, v) { b=="doorway"?ad.DOORWAY: b=="regular"?ad.REGULAR:null }; + sb._typeFromId=function(a){ + if(a==null)return null; + var b=(""+a).toLowerCase(); + for(var c=Object.keys(Z),d=0;d0){ + for(var ci2=0;ci20){ + room.clutter=new Hd(room); + var shapes=[]; + for(var gi=0;gi0){ + for(var pp=0;pp v != null && typeof v === "object" && !Array.isArray(v); + + const toEnum = (E, v, fallback) => { + let n = enumToNumber(E, v, null); + if (n == null && typeof v === "string") { + const t = v.trim(); + n = enumToNumber(E, t, null); + if (n == null) n = enumToNumber(E, t.toLowerCase(), null); + if (n == null) n = enumToNumber(E, t.toUpperCase(), null); + } + if (n == null && typeof v === "number" && Number.isFinite(v)) n = v | 0; + if (n == null || E[n] === undefined) return fallback; + return n | 0; + }; + + const toCell = (c) => { + if (c == null) return null; + if (Array.isArray(c)) { + if (c.length < 2) return null; + return { i: (c[0] | 0), j: (c[1] | 0) }; + } + if (isObj(c)) { + if (c.i != null && c.j != null) return { i: (c.i | 0), j: (c.j | 0) }; + if (c.x != null && c.y != null) return { i: (c.x | 0), j: (c.y | 0) }; + } + return null; + }; + + const toPoint = (p) => { + if (p == null) return null; + if (Array.isArray(p)) { + if (p.length < 2) return null; + const x = Number(p[0]); + const y = Number(p[1]); + if (!Number.isFinite(x) || !Number.isFinite(y)) return null; + return { x, y }; + } + if (isObj(p)) { + const x = Number(p.x); + const y = Number(p.y); + if (!Number.isFinite(x) || !Number.isFinite(y)) return null; + return { x, y }; + } + return null; + }; + + const toEdge = (e) => { + if (e == null) return null; + const out = {}; + const cell = toCell(e.cell); + if (cell) out.cell = cell; + if (e.dir != null) out.dir = toEnum(DataProto.data.DwellingsDirectionType, e.dir, 0); + return out; + }; + + const toLight = (l) => { + if (l == null) return null; + const out = {}; + const pos = toPoint(l.pos); + if (pos) out.pos = pos; + if (l.radius != null) out.radius = Number(l.radius); + if (l.power != null) out.power = Number(l.power); + if (l.on != null) out.on = !!l.on; + return out; + }; + + const toProp = (p) => { + if (p == null) return null; + const out = {}; + if (p.kind != null) out.kind = toEnum(DataProto.data.DwellingsPropType, p.kind, 0); + const pos = toPoint(p.pos); + if (pos) out.pos = pos; + const wall = toEdge(p.wall); + if (wall) out.wall = wall; + const fe = toEdge(p.fromEdge); + if (fe) out.fromEdge = fe; + const te = toEdge(p.toEdge); + if (te) out.toEdge = te; + return out; + }; + + const toPolygon = (poly) => { + if (poly == null) return null; + const out = {}; + const pts = Array.isArray(poly.points) ? poly.points : null; + if (pts) { + out.points = []; + for (let i = 0; i < pts.length; i++) { + const pt = toPoint(pts[i]); + if (pt) out.points.push(pt); + } + } + return out; + }; + + const toDecorGroup = (g) => { + if (g == null) return null; + const out = {}; + const polys = Array.isArray(g.polygons) ? g.polygons : null; + if (polys) { + out.polygons = []; + for (let i = 0; i < polys.length; i++) { + const pl = toPolygon(polys[i]); + if (pl) out.polygons.push(pl); + } + } + return out; + }; + + const out = {}; + + if (src.exit != null) out.exit = toEdge(src.exit); + if (src.spiral != null) out.spiral = toEdge(src.spiral); + + if (src.embedName != null) out.embedName = String(src.embedName); + if (src.embedArchitecture != null) out.embedArchitecture = toEnum(DataProto.data.DwellingsArchitectureType, src.embedArchitecture, 0); + + if (Array.isArray(src.floors)) { out.floors = []; - for (let fi = 0; fi < obj.floors.length; fi++) { - let fp = obj.floors[fi]; - let floor = { level: fp.level | 0 }; + for (let fi = 0; fi < src.floors.length; fi++) { + const fp = src.floors[fi] || {}; + const floor = { level: (fp.level | 0) }; + if (Array.isArray(fp.rooms)) { floor.rooms = []; for (let ri = 0; ri < fp.rooms.length; ri++) { - let rm = fp.rooms[ri]; - let room = {}; - if (rm.name != null) room.name = rm.name; + const rm = fp.rooms[ri] || {}; + const room = {}; + + if (rm.name != null) room.name = String(rm.name); + if (Array.isArray(rm.cells)) { room.cells = []; for (let ci = 0; ci < rm.cells.length; ci++) { - let c = rm.cells[ci]; - room.cells.push({ i: c.i | 0, j: c.j | 0 }); + const cell = toCell(rm.cells[ci]); + if (cell) room.cells.push(cell); + } + } + + if (rm.embedTypeId != null) room.embedTypeId = String(rm.embedTypeId); + + if (rm.embedLight != null) { + const light = toLight(rm.embedLight); + if (light) room.embedLight = light; + } + + if (Array.isArray(rm.embedProps)) { + room.embedProps = []; + for (let pi = 0; pi < rm.embedProps.length; pi++) { + const pr = toProp(rm.embedProps[pi]); + if (pr) room.embedProps.push(pr); } } + + if (Array.isArray(rm.embedDecor)) { + room.embedDecor = []; + for (let gi = 0; gi < rm.embedDecor.length; gi++) { + const gr = toDecorGroup(rm.embedDecor[gi]); + if (gr) room.embedDecor.push(gr); + } + } + floor.rooms.push(room); } } + if (Array.isArray(fp.doors)) { floor.doors = []; for (let di = 0; di < fp.doors.length; di++) { - let d = fp.doors[di]; - let door = {}; - if (d.edge != null) door.edge = dwellingsEdgeToProto(d.edge); - if (d.type != null) door.type = enumToNumber(DataProto.data.DwellingsDoorType, d.type, null); + const d = fp.doors[di] || {}; + const door = {}; + if (d.edge != null) { + const ed = toEdge(d.edge); + if (ed) door.edge = ed; + } + if (d.type != null) door.type = toEnum(DataProto.data.DwellingsDoorType, d.type, 0); floor.doors.push(door); } } + if (Array.isArray(fp.windows)) { floor.windows = []; - for (let wi = 0; wi < fp.windows.length; wi++) floor.windows.push(dwellingsEdgeToProto(fp.windows[wi])); + for (let wi = 0; wi < fp.windows.length; wi++) { + const ed = toEdge(fp.windows[wi]); + if (ed) floor.windows.push(ed); + } } + if (Array.isArray(fp.stairs)) { floor.stairs = []; for (let si = 0; si < fp.stairs.length; si++) { - let st = fp.stairs[si]; - let stair = { up: !!st.up }; - if (st.cell != null) stair.cell = { i: st.cell.i | 0, j: st.cell.j | 0 }; - if (st.dir != null) stair.dir = enumToNumber(DataProto.data.DwellingsDirectionType, st.dir, null); + const st = fp.stairs[si] || {}; + const stair = { up: !!st.up }; + const cell = toCell(st.cell); + if (cell) stair.cell = cell; + if (st.dir != null) stair.dir = toEnum(DataProto.data.DwellingsDirectionType, st.dir, 0); + if (st.embedTrapdoor != null) stair.embedTrapdoor = !!st.embedTrapdoor; floor.stairs.push(stair); } } + + if (Array.isArray(fp.embedChimneys)) { + floor.embedChimneys = []; + for (let ci = 0; ci < fp.embedChimneys.length; ci++) { + const cell = toCell(fp.embedChimneys[ci]); + if (cell) floor.embedChimneys.push(cell); + } + } + out.floors.push(floor); } } + return out; } From 037532a2807a5c50f1aa1e9340cefa67fc3c1295 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Thu, 12 Feb 2026 22:24:17 +0100 Subject: [PATCH 07/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.1]=20=20=D0=BD=D0=B8=D1=87=D0=B5=D0=B3=D0=BE=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BB=D0=BE=D0=BC=D0=B0=D0=BB=D0=BE=20=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8C=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=BD=D0=B0=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/js/mfcg.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c745ec4..5102ba3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fantasy-maphub", "name_full": "Fantasy MapHub Generators", - "version": "1.2.4-add-data-any-imports.0", + "version": "1.2.4-add-data-any-imports.1", "description": "An offline-first hub that bundles several Watabou map generators into one consistent web app: same UI patterns, local assets, and modern import/export. It adds OpenAPI docs, proto-first serialization (including pure protobuf files), and a PWA build so everything works without an internet connection.", "license": "MPL-2.0", "author": "mail@sunsung.fun", diff --git a/src/js/mfcg.js b/src/js/mfcg.js index c4059e3..60b2ac3 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -16661,13 +16661,13 @@ var $lime_init = function (A, t) { d.addItem("Reroll all", (G = this.model, l(G, G.rerollDistricts))) }, exportPNG: function (a) { - if (a) + if (a){ for (a = this.labels.iterator(); a.hasNext();) { - var b = - a.next(); + var b = a.next(); b.set_filters([]); b.addOutline() - } else { + } + } else { a = !1; null == a && (a = !0); a = 2 * K.getStrokeWidth(K.strokeThick, a); From 32ca4161e8cf91a525c2d908bd7a7e25e6659665 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Fri, 13 Feb 2026 00:39:52 +0100 Subject: [PATCH 08/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.1]=20=20=D0=B2=D1=8B=D1=80=D0=B5=D0=B7=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=88=D0=BF=D0=B0=D1=80=D0=B3=D0=B0=D0=BB=D0=BA=D0=B8=20=D1=81?= =?UTF-8?q?=20=D1=81=D0=B8=D0=B4=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/Village.js | 2 +- src/js/mfcg.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/Village.js b/src/js/Village.js index 2efd5e0..cdf7c27 100644 --- a/src/js/Village.js +++ b/src/js/Village.js @@ -9467,7 +9467,7 @@ var $lime_init = function (E, u) { embedProps: Hh._structFromJs({ name: a.name, pop: a.pop, - seed: a.bp.seed, + //seed: a.bp.seed, numbered: a.bp.numbered, realW: a.realW, realH: a.realH diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 60b2ac3..a8c7a14 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -7924,6 +7924,7 @@ var $lime_init = function (A, t) { if (a == null || typeof a !== "object" || Array.isArray(a)) return new DataProto.default.google.protobuf.Struct({fields: {}}); var b = {}, c = Object.keys(a), d = 0; for (; d < c.length;) { + if(c[d++] === "blueprint" || c[d++] === "url") continue; var f = c[d++], h = a[f]; h === null || h === void 0 || (b[f] = lg.jsToValue(h)) } From bda099efd5097c20a6da4a4a278f97de013d2158 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 00:05:36 +0100 Subject: [PATCH 09/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.1]=20=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D0=B0=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/mfcg.js | 182 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 178 insertions(+), 4 deletions(-) diff --git a/src/js/mfcg.js b/src/js/mfcg.js index a8c7a14..4bae7fe 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -8,6 +8,7 @@ import * as DataMfcg from "./shared/data/mfcg.js"; import * as FuncBin from "./shared/data/bin-verify.js"; import * as DataProto from "./struct/data.js"; +import * as DataGeo from "./shared/data/data.js"; import {paletteProtoBytesFromObj} from "./shared/data/mfcg.js"; import {exportBin} from "./shared/data/bin-verify.js"; @@ -7889,6 +7890,113 @@ var $lime_init = function (A, t) { var bb = FuncBin.exportBin(c, DataProto.data.DataType.geo); a = a.name, ge.saveBinary(Td.fromArrayBuffer(bb), "" + a + ".mf.pb", "application/x-protobuf") }; + be.importFromFile = function (a, b) { + var c = be.decodeImportFile(a, b); + return be.applyImportPayload(c.payload, c.state, c.url) + }; + be.applyImportPayload = function (a, b, c) { + var d = null; + null == b && null != a && typeof a === "object" && (b = a.state); + null == c && null != a && typeof a === "object" && (c = a.url); + "string" == typeof a ? d = a : null != a && "object" == typeof a && (Object.prototype.hasOwnProperty.call(a, "model") ? d = a.model : Object.prototype.hasOwnProperty.call(a, "data") && (d = a.data)); + if (null == d) throw new Error("This file does not include MFCG editor state. Export a new map from MFCG to continue editing."); + var f = null; + try { + f = pd.run(d) + } catch (h) { + throw new Error("An error occurred while restoring the map: " + (h && h.message ? h.message : String(h))); + } + if (null == f) throw new Error("An error occurred while restoring the map."); + if (null != b && "object" == typeof b) { + ba.init(); + ba.data = b; + ba.so.data = ba.data; + ba.so.flush() + } + if (null != c && "object" == typeof c) za.data = c, za.update(); + K.restore(); + Ub.instance = f; + bb.switchScene(Ec); + Bb.newModel.dispatch(f); + return f + }; + be.decodeImportFile = function (a, b) { + var c = null, d = DataGeo.bytesToUtf8Text(b); + try { + c = JSON.parse(d) + } catch (h) { + try { + console.error("MFCG import JSON parse failed:", h); + } catch (k) { + } + } + if (null != c) return be.extractPayloadFromJson(c); + var f = DataGeo.toUint8Array(b); + if (null == f) throw new Error("Invalid data buffer."); + var k = null; + try { + k = FuncBin.importBin(f) + } catch (n) { + try { + console.error("MFCG import bin decode failed:", n); + } catch (p) { + } + } + if (null != k) { + if (k.number != DataProto.data.DataType.geo) throw DataGeo.createTypeMismatchError(DataProto.data.DataType.geo, k.number); + f = new Uint8Array(k.buffer) + } + var p = null; + try { + p = DataProto.data.GeoObj.decode(f) + } catch (n2) { + try { + console.error("MFCG import proto decode failed:", n2); + } catch (p2) { + } + } + if (null == p) { + var g2 = be.stripLengthDelimited(f); + if (null != g2) try { + p = DataProto.data.GeoObj.decode(g2) + } catch (m2) { + try { + console.error("MFCG import length-delimited proto decode failed:", m2); + } catch (p3) { + } + } + } + if (null == p) throw new Error("An error occurred while parsing: file could not be recognized or decoded."); + return be.extractPayloadFromProto(p) + }; + be.extractPayloadFromJson = function (a) { + var b = null; + if (null != a && "object" == typeof a) { + b = a.embedProps; + null == b && null != a.embedEditorPayload && (b = a.embedEditorPayload.props) + } + var c = null, d = null, f = null; + null != b && "object" == typeof b && (c = b.mfcgPayload, d = b.state, f = b.url); + return {payload: c, state: d, url: f} + }; + be.extractPayloadFromProto = function (a) { + var b = null; + a.embedProps != null && Object.hasOwnProperty.call(a, "embedProps") && (b = lg.structToJson(a.embedProps)); + null == b && a.embedEditorPayload != null && a.embedEditorPayload.props != null && (b = lg.structToJson(a.embedEditorPayload.props)); + var c = null, d = null, f = null; + null != b && "object" == typeof b && (c = b.mfcgPayload, d = b.state, f = b.url); + return {payload: c, state: d, url: f} + }; + be.stripLengthDelimited = function (a) { + for (var b = 0, c = 0, d = 0; b < a.length && 35 > d;) { + var f = a[b++]; + c |= (f & 127) << d; + if (0 == (f & 128)) break; + d += 7 + } + if (!(0 >= b || b >= a.length || 0 >= c || b + c > a.length)) return a.subarray(b, b + c); + return null + }; var lg = function () { }; g.JsonExporter = lg, @@ -7924,8 +8032,8 @@ var $lime_init = function (A, t) { if (a == null || typeof a !== "object" || Array.isArray(a)) return new DataProto.default.google.protobuf.Struct({fields: {}}); var b = {}, c = Object.keys(a), d = 0; for (; d < c.length;) { - if(c[d++] === "blueprint" || c[d++] === "url") continue; - var f = c[d++], h = a[f]; + var f = c[d++]; + var h = a[f]; h === null || h === void 0 || (b[f] = lg.jsToValue(h)) } return new DataProto.default.google.protobuf.Struct({fields: b}) @@ -8062,13 +8170,54 @@ var $lime_init = function (A, t) { b.props = lg.toStruct(c); return b }, + lg.makeMfcgPayload = function (a) { + if (a == null) return null; + try { + var b = Bd.USE_CACHE; + var c = null; + var d = []; + if (a.cells != null && a.cells.length) { + for (var f = 0; f < a.cells.length;) { + var h = a.cells[f++]; + if (h != null && Object.prototype.hasOwnProperty.call(h, "view") && h.view != null) { + d.push({obj: h, view: h.view}); + h.view = null + } + } + } + Bd.USE_CACHE = !0; + var k = Bd.run(a); + Bd.USE_CACHE = b; + for (var n = 0; n < d.length;) { + var p = d[n++]; + p.obj.view = p.view + } + return {rev: 1, model: k} + } catch (c) { + Bd.USE_CACHE = b; + for (var g2 = 0; g2 < d.length;) { + var m2 = d[g2++]; + m2.obj.view = m2.view + } + hb.trace("Unable to serialize map: " + (c && c.message ? c.message : String(c)), { + className: "JsonExporter", + methodName: "makeMfcgPayload" + }); + return null + } + }, lg.enrichRoot = function (a, b) { if (a == null) return; var c = lg.makeTransform(); a.embedExportTransform = c; a.embedUid = "root"; a.embedEditorPayload = lg.makeEditorPayload(b); - a.embedProps == null && (a.embedProps = lg.toStruct({generator: "mfcg", version: A.current.meta.h.version, blueprint: b != null ? b.bp : null, state: ba.data, url: za.data})); + if (a.embedProps == null) { + var d = {generator: "mfcg", version: A.current.meta.h.version, blueprint: b != null ? b.bp : null, state: ba.data, url: za.data}; + var f = lg.makeMfcgPayload(b); + f != null && (d.mfcgPayload = f); + a.embedProps = lg.toStruct(d) + } lg.enrichGeoObj(a, {uid: "root", transform: c}) }, lg.toJsonObject = function (a) { @@ -13603,6 +13752,10 @@ var $lime_init = function (A, t) { c.set_width(96); c.action.add(l(this, this.onExport)); b.add(c); + c = new fb("Import"); + c.set_width(96); + c.click.add(l(this, this.onImport)); + b.add(c); this.add(b); Bb.newModel.add(l(this, this.onNewModel)); Bb.titleChanged.add(l(this, this.onTitleChanged)); @@ -13695,6 +13848,27 @@ var $lime_init = function (A, t) { be.asPROTO(); } }, + onImport: function () { + var a = this, + b = new Gf; + b.addEventListener("select", function (c) { + b.addEventListener("complete", l(a, a.onImportLoaded)); + b.load() + }); + b.browse([new Th("Map", "*.json;*.pb;")]) + }, + onImportLoaded: function (a) { + try { + var b = va.__cast(a.target, Gf); + be.importFromFile(b.name, b.data) + } catch (c) { + try { + console.error("MFCG import failed:", c); + } catch (d) { + } + q.show(c && c.message ? c.message : String(c)); + } + }, onNewModel: function (a) { this.model = a; this.txtName.set_text(a.name); @@ -52201,4 +52375,4 @@ var $lime_init = function (A, t) { if (params !== null) { console.debug(params); $lime_init("undefined" !== typeof exports ? exports : "function" === typeof define && define.amd ? {} : "undefined" !== typeof window ? window : "undefined" !== typeof self ? self : this, "undefined" !== typeof window ? window : "undefined" !== typeof global ? global : "undefined" !== typeof self ? self : this); -} \ No newline at end of file +} From c2daf3a0b9401407a0ed0f902ec40caded37c0c0 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 00:09:07 +0100 Subject: [PATCH 10/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.1]=20=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8C=D1=8E=20=D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82!=20=D1=94=D1=82=D0=BE=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=BD=D0=B0=D1=87=D0=B0?= =?UTF-8?q?=D0=BB=D0=BE,=20=D0=BD=D0=BE=20=D0=BE=D0=BD=D0=BE=20=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D0=BD=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5?= =?UTF-8?q?=D1=82!!!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/mfcg.js | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 4bae7fe..40b4383 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -7922,15 +7922,23 @@ var $lime_init = function (A, t) { }; be.decodeImportFile = function (a, b) { var c = null, d = DataGeo.bytesToUtf8Text(b); - try { - c = JSON.parse(d) - } catch (h) { - try { - console.error("MFCG import JSON parse failed:", h); - } catch (k) { + var f = null != a ? String(a).toLowerCase() : ""; + var k = f.endsWith(".pb") || f.endsWith(".mf.pb"); + if (!k) { + var h = d != null ? String(d).trim() : ""; + var n = 0 < h.length && ("{" == h.charAt(0) || "[" == h.charAt(0)); + if (n || f.endsWith(".json") || f.endsWith(".mf.json")) { + try { + c = JSON.parse(d) + } catch (p) { + try { + console.error("MFCG import JSON parse failed:", p); + } catch (g2) { + } + } + if (null != c) return be.extractPayloadFromJson(c) } } - if (null != c) return be.extractPayloadFromJson(c); var f = DataGeo.toUint8Array(b); if (null == f) throw new Error("Invalid data buffer."); var k = null; From 083350d3817d66835487363d08505ba387bdd8bb Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 11:35:44 +0100 Subject: [PATCH 11/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.1]=20=20=D0=B5=D1=81=D1=82=D1=8C=20=D0=B8=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=20=D1=81=D0=B5=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/Village.js | 27 +++++++++++++------ src/js/mfcg.js | 68 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 70 insertions(+), 25 deletions(-) diff --git a/src/js/Village.js b/src/js/Village.js index cdf7c27..56d1236 100644 --- a/src/js/Village.js +++ b/src/js/Village.js @@ -9411,6 +9411,21 @@ var $lime_init = function (E, u) { var d = FuncBin.exportBin(c, DataProto.data.DataType.geo); return Sd.saveBinary(wd.fromArrayBuffer(d), a.name + ".vg.pb", "application/x-protobuf"), b }, + Hh._blueprintForExport = function (a) { + if (a == null) return null; + return { + seed: a.seed, + tags: a.tags, + width: a.width, + height: a.height, + treeSeed: a.treeSeed, + name: a.name, + pop: a.pop, + numbered: a.numbered, + varSeed: a.varSeed, + style: a.style + } + }, Hh.getData = function (a) { Ua.CX = 0, Ua.CY = 0, Ua.SCALE = .7; var b = new La; @@ -9455,6 +9470,7 @@ var $lime_init = function (E, u) { }; Hh.getProto = function (a) { Ua.CX = 0, Ua.CY = 0, Ua.SCALE = .7; + var blueprint = Hh._blueprintForExport(a.bp); var b = [], c = { type: DataProto.data.GeoType.Feature, @@ -9465,12 +9481,7 @@ var $lime_init = function (E, u) { wallThickness: Ua.SCALE, embedUid: "meta", embedProps: Hh._structFromJs({ - name: a.name, - pop: a.pop, - //seed: a.bp.seed, - numbered: a.bp.numbered, - realW: a.realW, - realH: a.realH + blueprint: blueprint }) }, d = Fc.rect(a.realW, a.realH), @@ -9718,7 +9729,7 @@ var $lime_init = function (E, u) { shapeModels: k, props: Hh._structFromJs({generator: "vg", version: params.meta.ver_app}) }, - embedProps: Hh._structFromJs({generator: "vg", version: params.meta.ver_app, name: a.name}) + embedProps: Hh._structFromJs({generator: "vg", version: params.meta.ver_app, blueprint: blueprint}) }; if (a.water != null) { @@ -50129,4 +50140,4 @@ var $lime_init = function (E, u) { if (params !== null) { console.debug(params); $lime_init("undefined" !== typeof exports ? exports : "function" === typeof define && define.amd ? {} : "undefined" !== typeof window ? window : "undefined" !== typeof self ? self : this, "undefined" !== typeof window ? window : "undefined" !== typeof global ? global : "undefined" !== typeof self ? self : this); -} \ No newline at end of file +} diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 40b4383..786fb7d 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -7892,21 +7892,55 @@ var $lime_init = function (A, t) { }; be.importFromFile = function (a, b) { var c = be.decodeImportFile(a, b); - return be.applyImportPayload(c.payload, c.state, c.url) + return be.applyImportPayload(c.payload, c.state, c.url, c.blueprint, c.generator) }; - be.applyImportPayload = function (a, b, c) { - var d = null; + be.goToVillageFromBlueprint = function (a) { + if (a == null || "object" != typeof a) return !1; + var b = FuncProto.paramsUrlString(params.routes.village); + var c = []; + var d = a.seed; + d != null && c.push("seed=" + encodeURIComponent("" + d)); + var f = a.tags; + Array.isArray(f) && (f = f.join(",")); + f != null && "" !== f && c.push("tags=" + encodeURIComponent("" + f)); + var h = a.width; + h != null && 0 != h && c.push("width=" + encodeURIComponent("" + h)); + var k = a.height; + k != null && 0 != k && c.push("height=" + encodeURIComponent("" + k)); + var p = a.treeSeed; + p != null && d != null && p !== d && c.push("trees=" + encodeURIComponent("" + p)); + var l = a.name; + l != null && "" !== l && c.push("name=" + encodeURIComponent("" + l)); + var m = a.pop; + m != null && 0 != m && c.push("pop=" + encodeURIComponent("" + m)); + var n = a.varSeed; + n != null && 0 != n && c.push("roads=" + encodeURIComponent("" + n)); + var q = a.numbered; + Array.isArray(q) && q.length && c.push("marked=" + encodeURIComponent(q.join(","))); + var r = a.style; + r != null && "" !== r && c.push("style=" + encodeURIComponent("" + r)); + b = c.length ? b + "?" + c.join("&") : b; + window.open(b, "_self"); + return !0 + }; + be.applyImportPayload = function (a, b, c, d, f) { + var e = null; null == b && null != a && typeof a === "object" && (b = a.state); null == c && null != a && typeof a === "object" && (c = a.url); - "string" == typeof a ? d = a : null != a && "object" == typeof a && (Object.prototype.hasOwnProperty.call(a, "model") ? d = a.model : Object.prototype.hasOwnProperty.call(a, "data") && (d = a.data)); - if (null == d) throw new Error("This file does not include MFCG editor state. Export a new map from MFCG to continue editing."); - var f = null; + null == d && null != a && typeof a === "object" && (d = a.blueprint); + null == f && null != a && typeof a === "object" && (f = a.generator); + "string" == typeof a ? e = a : null != a && "object" == typeof a && (Object.prototype.hasOwnProperty.call(a, "model") ? e = a.model : Object.prototype.hasOwnProperty.call(a, "data") && (e = a.data)); + if (null == e) { + if (d != null && ("vg" == f || "village" == f) && be.goToVillageFromBlueprint(d)) return null; + throw new Error("This file does not include MFCG editor state. Export a new map from MFCG to continue editing."); + } + var h = null; try { - f = pd.run(d) + h = pd.run(e) } catch (h) { throw new Error("An error occurred while restoring the map: " + (h && h.message ? h.message : String(h))); } - if (null == f) throw new Error("An error occurred while restoring the map."); + if (null == h) throw new Error("An error occurred while restoring the map."); if (null != b && "object" == typeof b) { ba.init(); ba.data = b; @@ -7915,10 +7949,10 @@ var $lime_init = function (A, t) { } if (null != c && "object" == typeof c) za.data = c, za.update(); K.restore(); - Ub.instance = f; + Ub.instance = h; bb.switchScene(Ec); - Bb.newModel.dispatch(f); - return f + Bb.newModel.dispatch(h); + return h }; be.decodeImportFile = function (a, b) { var c = null, d = DataGeo.bytesToUtf8Text(b); @@ -7983,17 +8017,17 @@ var $lime_init = function (A, t) { b = a.embedProps; null == b && null != a.embedEditorPayload && (b = a.embedEditorPayload.props) } - var c = null, d = null, f = null; - null != b && "object" == typeof b && (c = b.mfcgPayload, d = b.state, f = b.url); - return {payload: c, state: d, url: f} + var c = null, d = null, f = null, h = null, k = null; + null != b && "object" == typeof b && (c = b.mfcgPayload, d = b.state, f = b.url, h = b.blueprint, k = b.generator); + return {payload: c, state: d, url: f, blueprint: h, generator: k} }; be.extractPayloadFromProto = function (a) { var b = null; a.embedProps != null && Object.hasOwnProperty.call(a, "embedProps") && (b = lg.structToJson(a.embedProps)); null == b && a.embedEditorPayload != null && a.embedEditorPayload.props != null && (b = lg.structToJson(a.embedEditorPayload.props)); - var c = null, d = null, f = null; - null != b && "object" == typeof b && (c = b.mfcgPayload, d = b.state, f = b.url); - return {payload: c, state: d, url: f} + var c = null, d = null, f = null, h = null, k = null; + null != b && "object" == typeof b && (c = b.mfcgPayload, d = b.state, f = b.url, h = b.blueprint, k = b.generator); + return {payload: c, state: d, url: f, blueprint: h, generator: k} }; be.stripLengthDelimited = function (a) { for (var b = 0, c = 0, d = 0; b < a.length && 35 > d;) { From d70d1b99550a51933e4f4524287cbf00e4119142 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 11:54:41 +0100 Subject: [PATCH 12/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.1]=20=20=D0=BF=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=BE=D1=82=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protobuf/data/geo/editor.proto | 93 +--------------------------------- protobuf/data/geo/enum.proto | 16 ------ protobuf/data/geo/obj.proto | 8 +-- 3 files changed, 3 insertions(+), 114 deletions(-) diff --git a/protobuf/data/geo/editor.proto b/protobuf/data/geo/editor.proto index 5b31229..bffdc42 100644 --- a/protobuf/data/geo/editor.proto +++ b/protobuf/data/geo/editor.proto @@ -7,99 +7,8 @@ import "data/geo/enum.proto"; // // // // -message EditorPoint2DObj { - double x = 1; - double y = 2; -} - -message EditorPolylineObj { - repeated EditorPoint2DObj points = 1; - bool closed = 2; -} - -message EditorBezierObj { - repeated EditorPoint2DObj control_points = 1; - - bool closed = 2; - uint32 segments = 3; -} - -message EditorArcObj { - EditorPoint2DObj center = 1; - double radius = 2; - double start_angle_rad = 3; - double end_angle_rad = 4; - bool ccw = 5; -} - -message EditorLinkObj { - string a_uid = 1; - string b_uid = 2; - EditorLinkType type = 3; - google.protobuf.Struct props = 4; -} - -message EditorLayerStateObj { - string layer_id = 1; - bool visible = 2; - bool locked = 3; - int32 z_index = 4; -} - -message EditorGroupObj { - string group_uid = 1; - string name = 2; - repeated string member_uids = 3; - google.protobuf.Struct props = 4; -} - -message EditorRoadModelObj { - string target_uid = 1; - EditorPolylineObj centerline = 2; - double width = 3; - bool closed = 4; - google.protobuf.Struct props = 5; -} - -message EditorShapeModelObj { - string target_uid = 1; - - oneof model { - EditorPolylineObj polyline = 2; - EditorBezierObj bezier = 3; - EditorArcObj arc = 4; - } - - google.protobuf.Struct props = 10; -} - -message EditorSnapNodeObj { - string node_uid = 1; - EditorPoint2DObj pos = 2; - repeated string incident_uids = 3; - google.protobuf.Struct props = 4; -} - -message EditorConstraintObj { - string constraint_uid = 1; - EditorConstraintType type = 2; - repeated string target_uids = 3; - google.protobuf.Struct params = 4; -} - message EditorPayloadObj { uint32 payload_rev = 1; EditorCoordSpaceType coord_space = 2; - - repeated EditorLayerStateObj layers = 10; - repeated EditorGroupObj groups = 11; - repeated EditorLinkObj links = 12; - - repeated EditorRoadModelObj road_models = 20; - repeated EditorShapeModelObj shape_models = 21; - - repeated EditorSnapNodeObj snap_nodes = 30; - repeated EditorConstraintObj constraints = 31; - - google.protobuf.Struct props = 40; + google.protobuf.Struct props = 3; } diff --git a/protobuf/data/geo/enum.proto b/protobuf/data/geo/enum.proto index 81aac73..7e854f2 100644 --- a/protobuf/data/geo/enum.proto +++ b/protobuf/data/geo/enum.proto @@ -64,19 +64,3 @@ enum EditorCoordSpaceType { export = 2; } -enum EditorLinkType { - EDITOR_LINK_TYPE_UNSPECIFIED = 0; - EDITOR_LINK_TYPE_PARENT_CHILD = 1; - EDITOR_LINK_TYPE_GROUP_MEMBER = 2; - EDITOR_LINK_TYPE_ATTACH = 3; - EDITOR_LINK_TYPE_OVER_UNDER = 4; - EDITOR_LINK_TYPE_ALONG = 5; -} - -enum EditorConstraintType { - EDITOR_CONSTRAINT_TYPE_UNSPECIFIED = 0; - EDITOR_CONSTRAINT_TYPE_SNAP = 1; - EDITOR_CONSTRAINT_TYPE_FIXED_LENGTH = 2; - EDITOR_CONSTRAINT_TYPE_PARALLEL = 3; - EDITOR_CONSTRAINT_TYPE_PERPENDICULAR = 4; -} diff --git a/protobuf/data/geo/obj.proto b/protobuf/data/geo/obj.proto index e3de48d..c088565 100644 --- a/protobuf/data/geo/obj.proto +++ b/protobuf/data/geo/obj.proto @@ -13,15 +13,11 @@ message GeoObj { GeoType type = 1; GeoObj geometry = 2; google.protobuf.ListValue coordinates = 3; - reserved 4 to 8; - string embed_uid = 9; + reserved 4 to 9; repeated GeoObj features = 10; repeated GeoObj geometries = 11; - reserved 12 to 16; - repeated GeoPartObj embed_parts = 17; - GeoTransformObj embed_export_transform = 18; - GeoBBoxObj embed_bbox = 19; + reserved 12 to 19; optional GeoGeneratorType generator = 20; optional GeoFeatureType id = 21; From ecd499982020f4eb32685960e560bb4a922a5e2e Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 12:10:47 +0100 Subject: [PATCH 13/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.1]=20=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82-=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=20=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=D1=8E=20=D1=80=D0=B0=D0=B1=D0=BE=D1=87?= =?UTF-8?q?=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/Village.js | 331 +++------------------------------------------- src/js/mfcg.js | 128 +----------------- 2 files changed, 25 insertions(+), 434 deletions(-) diff --git a/src/js/Village.js b/src/js/Village.js index 56d1236..96c9266 100644 --- a/src/js/Village.js +++ b/src/js/Village.js @@ -9479,64 +9479,37 @@ var $lime_init = function (E, u) { generator: DataProto.data.GeoGeneratorType.vg, version: params.meta.ver_app, wallThickness: Ua.SCALE, - embedUid: "meta", embedProps: Hh._structFromJs({ blueprint: blueprint }) }, d = Fc.rect(a.realW, a.realH), - f = { - scale: Ua.SCALE, - cx: Ua.CX, - cy: Ua.CY, - invertY: !0, - precisionPow10: 3 - }, - h = [], - k = [], - p = 0, - l = null; + p = 0; b.push(c); - var m = [Ua.arrPoly(d)], - n = Hh._bboxFromNested(m); + var m = [Ua.arrPoly(d)]; b.push({ type: DataProto.data.GeoType.Polygon, id: DataProto.data.GeoFeatureType.earth, coordinates: Hh._listValueFromNested(m), - embedUid: "earth", - embedBbox: Hh._bboxToProto(n), embedProps: Hh._structFromJs({kind: "earth"}) }); - l = Hh._bboxMerge(l, n); - - var q = a.network.roads, z = q, A = [], B = null, C = 0, D; + var q = a.network.roads, z = q, A = [], D; for (q = q.keys(); q.hasNext();) { var E = q.next(), F = z.get(E), G = E; if (F.type != wb.SQUARE) { D = F.type == wb.HIGHWAY ? 0 < x.widthLargeRoad ? x.widthLargeRoad : x.strokeNormal : 0 < x.widthSmallRoad ? x.widthSmallRoad : x.strokeNormal; - var H = Ua.arrPoly(G), I = Hh._bboxFromNested(H), J = "roads:" + C++; + var H = Ua.arrPoly(G); A.push({ type: DataProto.data.GeoType.LineString, width: D * Ua.SCALE, coordinates: Hh._listValueFromNested(H), - embedUid: J, - embedBbox: Hh._bboxToProto(I), embedProps: Hh._structFromJs({kind: "road", roadType: F.type, widthWorld: D}) }); - B = Hh._bboxMerge(B, I); - l = Hh._bboxMerge(l, I); - h.push({ - targetUid: J, - centerline: Hh._editorPolylineFromWorld(G, !1), - width: D, - closed: !1, - props: Hh._structFromJs({roadType: F.type}) - }); } } @@ -9544,42 +9517,28 @@ var $lime_init = function (E, u) { type: DataProto.data.GeoType.GeometryCollection, id: DataProto.data.GeoFeatureType.roads, geometries: A, - embedUid: "roads", - embedBbox: Hh._bboxToProto(B), embedProps: Hh._structFromJs({kind: "roads"}) }; - A = [], B = null, C = 0; - q = 0; + A = [], q = 0; var L = a.piers; for (; q < L.length;) { var M = L[q]; ++q; - var N = Ua.arrPoly(M), O = Hh._bboxFromNested(N), P = "planks:" + C++; + var N = Ua.arrPoly(M); A.push({ type: DataProto.data.GeoType.LineString, width: 5 * Ua.SCALE, coordinates: Hh._listValueFromNested(N), - embedUid: P, - embedBbox: Hh._bboxToProto(O), embedProps: Hh._structFromJs({kind: "plank", widthWorld: 5}) }); - B = Hh._bboxMerge(B, O); - l = Hh._bboxMerge(l, O); - k.push({ - targetUid: P, - polyline: Hh._editorPolylineFromWorld(M, !1), - props: Hh._structFromJs({kind: "plank", widthWorld: 5}) - }); } var Q = { type: DataProto.data.GeoType.GeometryCollection, id: DataProto.data.GeoFeatureType.planks, geometries: A, - embedUid: "planks", - embedBbox: Hh._bboxToProto(B), embedProps: Hh._structFromJs({kind: "planks"}) }; @@ -9610,86 +9569,35 @@ var $lime_init = function (E, u) { V.push(ca); } - var da = []; q = 0, L = a.props; for (; q < L.length;) { var ea = L[q]; ++q; - ea instanceof Sf ? A.push(Ka.__cast(ea, Sf).pos) : ea instanceof Tf && (ca = Ka.__cast(ea, Tf), ea = Fc.regular(16, ca.r), Eb.asTranslate(ea, ca.pos.x, ca.pos.y), W.push(ea), da.push({pos: ca.pos, r: ca.r})); + ea instanceof Sf ? A.push(Ka.__cast(ea, Sf).pos) : ea instanceof Tf && (ca = Ka.__cast(ea, Tf), ea = Fc.regular(16, ca.r), Eb.asTranslate(ea, ca.pos.x, ca.pos.y), W.push(ea)); } - var fa = [], ga = null; for (q = 0; q < V.length;) { ca = V[q]; var ha = q++, ia = Ua.arrPoly(ca.rect), - ja = [ia], - ka = Hh._bboxFromNested(ja), - la = "buildings:" + ha; + ja = [ia]; X.push(ja); - fa.push({ - index: ha, - uid: la, - name: la, - bbox: Hh._bboxToProto(ka), - props: Hh._structFromJs({kind: "building", width: ca.width, depth: ca.depth, height: ca.height, large: ca.large}) - }); - ga = Hh._bboxMerge(ga, ka); - l = Hh._bboxMerge(l, ka); - k.push({ - targetUid: la, - polyline: Hh._editorPolylineFromWorld(ca.rect, !0), - props: Hh._structFromJs({kind: "building", width: ca.width, depth: ca.depth, height: ca.height, large: ca.large}) - }); } - var ma = []; - B = null; for (q = 0; q < W.length;) { ea = W[q]; ha = q++; ia = Ua.arrPoly(ea); ja = [ia]; - ka = Hh._bboxFromNested(ja); - la = "prisms:" + ha; Y.push(ja); - ma.push({ - index: ha, - uid: la, - name: la, - bbox: Hh._bboxToProto(ka), - props: Hh._structFromJs({kind: "prism", radius: da[ha] != null ? da[ha].r : null}) - }); - B = Hh._bboxMerge(B, ka); - l = Hh._bboxMerge(l, ka); - k.push({ - targetUid: la, - polyline: Hh._editorPolylineFromWorld(ea, !0), - props: Hh._structFromJs({kind: "prism", radius: da[ha] != null ? da[ha].r : null}) - }); - } - - var na2 = Ua.arrPoly(A), oa = Hh._bboxFromNested(na2), pa = [], qa = 0; - for (; qa < na2.length;) { - var ra = na2[qa], sa = qa++; - pa.push({ - index: sa, - uid: "trees:" + sa, - name: "trees:" + sa, - bbox: Hh._bboxToProto(Hh._bboxFromNested(ra)), - props: Hh._structFromJs({kind: "tree"}) - }); } - l = Hh._bboxMerge(l, oa); + var na2 = Ua.arrPoly(A); b.push({ type: DataProto.data.GeoType.MultiPolygon, id: DataProto.data.GeoFeatureType.buildings, coordinates: Hh._listValueFromNested(X), - embedUid: "buildings", - embedBbox: Hh._bboxToProto(ga), - embedParts: fa, embedProps: Hh._structFromJs({kind: "buildings"}) }); @@ -9697,9 +9605,6 @@ var $lime_init = function (E, u) { type: DataProto.data.GeoType.MultiPolygon, id: DataProto.data.GeoFeatureType.prisms, coordinates: Hh._listValueFromNested(Y), - embedUid: "prisms", - embedBbox: Hh._bboxToProto(B), - embedParts: ma, embedProps: Hh._structFromJs({kind: "prisms"}) }); @@ -9707,9 +9612,6 @@ var $lime_init = function (E, u) { type: DataProto.data.GeoType.MultiPoint, id: DataProto.data.GeoFeatureType.trees, coordinates: Hh._listValueFromNested(na2), - embedUid: "trees", - embedBbox: Hh._bboxToProto(oa), - embedParts: pa, embedProps: Hh._structFromJs({kind: "trees"}) }); @@ -9719,75 +9621,37 @@ var $lime_init = function (E, u) { var ta = { type: DataProto.data.GeoType.FeatureCollection, features: b, - embedUid: "root", - embedExportTransform: f, - embedBbox: Hh._bboxToProto(l), embedEditorPayload: { payloadRev: 1, coordSpace: DataProto.data.EditorCoordSpaceType.world, - roadModels: h, - shapeModels: k, props: Hh._structFromJs({generator: "vg", version: params.meta.ver_app}) }, embedProps: Hh._structFromJs({generator: "vg", version: params.meta.ver_app, blueprint: blueprint}) }; if (a.water != null) { - var ua = [], va = [], wa = null, ya = 0, za2 = a.water.patches; + var ua = [], ya = 0, za2 = a.water.patches; for (; ya < za2.length;) { var Aa = za2[ya]; ++ya; - var Ba = Ua.arrPoly(Aa), Ca = [Ba], Da = Hh._bboxFromNested(Ca), Ea = "water:" + (ya - 1); + var Ba = Ua.arrPoly(Aa), Ca = [Ba]; ua.push(Ca); - va.push({ - index: ya - 1, - uid: Ea, - name: Ea, - bbox: Hh._bboxToProto(Da), - props: Hh._structFromJs({kind: "water"}) - }); - wa = Hh._bboxMerge(wa, Da); - l = Hh._bboxMerge(l, Da); - k.push({ - targetUid: Ea, - polyline: Hh._editorPolylineFromWorld(Aa, !0), - props: Hh._structFromJs({kind: "water"}) - }); } ta.features.push({ type: DataProto.data.GeoType.MultiPolygon, id: DataProto.data.GeoFeatureType.water, coordinates: Hh._listValueFromNested(ua), - embedUid: "water", - embedBbox: Hh._bboxToProto(wa), - embedParts: va, embedProps: Hh._structFromJs({kind: "water"}) }); - var Fa = Ua.arrPoly(a.water.edgePoints), Ga = Hh._bboxFromNested(Fa), Ha = [], Ia = 0; - for (; Ia < Fa.length;) { - var Ja = Fa[Ia], Ka2 = Ia++; - Ha.push({ - index: Ka2, - uid: "extendable:" + Ka2, - name: "extendable:" + Ka2, - bbox: Hh._bboxToProto(Hh._bboxFromNested(Ja)), - props: Hh._structFromJs({kind: "extendable"}) - }); - } - + var Fa = Ua.arrPoly(a.water.edgePoints); ta.features.push({ type: DataProto.data.GeoType.MultiPoint, id: DataProto.data.GeoFeatureType.extendable, coordinates: Hh._listValueFromNested(Fa), - embedUid: "extendable", - embedBbox: Hh._bboxToProto(Ga), - embedParts: Ha, embedProps: Hh._structFromJs({kind: "extendable"}) }); - - l = Hh._bboxMerge(l, Ga); } if (a.network.square != null) { @@ -9801,56 +9665,28 @@ var $lime_init = function (E, u) { break } - var Na2 = [Ua.arrPoly(La2)], Oa2 = Hh._bboxFromNested(Na2); + var Na2 = [Ua.arrPoly(La2)]; ta.features.push({ type: DataProto.data.GeoType.MultiPolygon, id: DataProto.data.GeoFeatureType.squares, coordinates: Hh._listValueFromNested([Na2]), - embedUid: "squares", - embedBbox: Hh._bboxToProto(Oa2), - embedParts: [{ - index: 0, - uid: "squares:0", - name: "squares:0", - bbox: Hh._bboxToProto(Oa2), - props: Hh._structFromJs({kind: "square"}) - }], embedProps: Hh._structFromJs({kind: "squares"}) }); - - l = Hh._bboxMerge(l, Oa2); } if (a.palisade != null) { - var Pa2 = [], Qa2 = [], Ra2 = null, Sa2 = 0, Ta2 = a.palisade.segments; + var Pa2 = [], Sa2 = 0, Ta2 = a.palisade.segments; for (; Sa2 < Ta2.length;) { var Ua2 = Ta2[Sa2]; ++Sa2; - var Va2 = Ua.arrPoly(Ua2), Wa2 = Hh._bboxFromNested(Va2), Xa2 = "palisade:" + (Sa2 - 1); + var Va2 = Ua.arrPoly(Ua2); Pa2.push(Va2); - Qa2.push({ - index: Sa2 - 1, - uid: Xa2, - name: Xa2, - bbox: Hh._bboxToProto(Wa2), - props: Hh._structFromJs({kind: "palisade"}) - }); - Ra2 = Hh._bboxMerge(Ra2, Wa2); - l = Hh._bboxMerge(l, Wa2); - k.push({ - targetUid: Xa2, - polyline: Hh._editorPolylineFromWorld(Ua2, !1), - props: Hh._structFromJs({kind: "palisade"}) - }); } ta.features.push({ type: DataProto.data.GeoType.MultiLineString, id: DataProto.data.GeoFeatureType.palisade, coordinates: Hh._listValueFromNested(Pa2), - embedUid: "palisade", - embedBbox: Hh._bboxToProto(Ra2), - embedParts: Qa2, embedProps: Hh._structFromJs({kind: "palisade"}) }); } @@ -9863,48 +9699,22 @@ var $lime_init = function (E, u) { Ya2.push(db.resampleClosed(ba2, a.bp.minRoad)); } - var ca2 = 0, da2 = [], ea2, fa2, ga2 = null; + var ca2 = 0, da2 = [], ea2; for (; ca2 < Ya2.length;) { ea2 = Ya2[ca2]; - fa2 = ca2++; - var ha2 = [Ua.arrPoly(ea2)], ia2 = Hh._bboxFromNested(ha2), ja2 = "fields:" + fa2; + ca2++; + var ha2 = [Ua.arrPoly(ea2)]; da2.push(ha2); - ga2 = Hh._bboxMerge(ga2, ia2); - l = Hh._bboxMerge(l, ia2); - k.push({ - targetUid: ja2, - polyline: Hh._editorPolylineFromWorld(ea2, !0), - props: Hh._structFromJs({kind: "field"}) - }); - } - - var ka2 = []; - for (ca2 = 0; ca2 < da2.length;) { - var la2 = da2[ca2], ma2 = ca2++; - var na3 = Hh._bboxFromNested(la2); - ka2.push({ - index: ma2, - uid: "fields:" + ma2, - name: "fields:" + ma2, - bbox: Hh._bboxToProto(na3), - props: Hh._structFromJs({kind: "field"}) - }); } ta.features.push({ type: DataProto.data.GeoType.MultiPolygon, id: DataProto.data.GeoFeatureType.fields, coordinates: Hh._listValueFromNested(da2), - embedUid: "fields", - embedBbox: Hh._bboxToProto(ga2), - embedParts: ka2, embedProps: Hh._structFromJs({kind: "fields"}) }); } - ta.embedBbox = Hh._bboxToProto(l); - ta.embedEditorPayload.roadModels = h; - ta.embedEditorPayload.shapeModels = k; return DataProto.data.GeoObj.fromObject(ta) }; Hh.stringifyProto = function (a) { @@ -9922,42 +9732,13 @@ var $lime_init = function (E, u) { a.generator != null && (b.generator = DataProto.data.GeoGeneratorType[a.generator]); a.version != null && (b.version = a.version); - a.embedUid != null && (b.embedUid = a.embedUid); - - a.embedExportTransform != null && (b.embedExportTransform = { - scale: a.embedExportTransform.scale, - cx: a.embedExportTransform.cx, - cy: a.embedExportTransform.cy, - invertY: a.embedExportTransform.invertY, - precisionPow10: a.embedExportTransform.precisionPow10 - }); - - a.embedBbox != null && (b.embedBbox = { - minX: a.embedBbox.minX, - minY: a.embedBbox.minY, - maxX: a.embedBbox.maxX, - maxY: a.embedBbox.maxY - }); - - if (a.embedParts != null && a.embedParts.length) { - b.embedParts = []; - for (var c = 0; c < a.embedParts.length;) { - var d = a.embedParts[c++]; - var f = {index: d.index, uid: d.uid}; - d.name != null && (f.name = d.name); - d.bbox != null && (f.bbox = {minX: d.bbox.minX, minY: d.bbox.minY, maxX: d.bbox.maxX, maxY: d.bbox.maxY}); - d.props != null && (f.props = Hh._structToJson(d.props)); - b.embedParts.push(f); - } - } - a.embedProps != null && (b.embedProps = Hh._structToJson(a.embedProps)); a.embedEditorPayload != null && (b.embedEditorPayload = Hh._editorPayloadToJson(a.embedEditorPayload)); switch (a.type) { case DataProto.data.GeoType.FeatureCollection: b.features = []; - for (c = 0; c < a.features.length;) b.features.push(Hh.protoToGeoJson(a.features[c++])); + for (var c = 0; c < a.features.length;) b.features.push(Hh.protoToGeoJson(a.features[c++])); break; case DataProto.data.GeoType.GeometryCollection: b.geometries = []; @@ -10013,85 +9794,11 @@ var $lime_init = function (E, u) { return b }; - Hh._bboxAcc = function (a, b) { - if (b == null) return; - if (Array.isArray(b)) { - if (b.length === 2 && typeof b[0] === "number" && typeof b[1] === "number") { - var c = b[0], d = b[1]; - a.minX = Math.min(a.minX, c); - a.minY = Math.min(a.minY, d); - a.maxX = Math.max(a.maxX, c); - a.maxY = Math.max(a.maxY, d); - } else { - for (var f = 0; f < b.length;) Hh._bboxAcc(a, b[f++]); - } - } - }; - - Hh._bboxFromNested = function (a) { - var b = {minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity}; - Hh._bboxAcc(b, a); - return isFinite(b.minX) ? b : null - }; - - Hh._bboxMerge = function (a, b) { - if (a == null) return b; - if (b == null) return a; - return { - minX: Math.min(a.minX, b.minX), - minY: Math.min(a.minY, b.minY), - maxX: Math.max(a.maxX, b.maxX), - maxY: Math.max(a.maxY, b.maxY) - } - }; - - Hh._bboxToProto = function (a) { - return a == null ? null : {minX: a.minX, minY: a.minY, maxX: a.maxX, maxY: a.maxY} - }; - - Hh._editorPointsFromWorld = function (a) { - for (var b = [], c = 0; c < a.length;) { - var d = a[c++]; - b.push({x: d.x, y: d.y}); - } - return b - }; - - Hh._editorPolylineFromWorld = function (a, b) { - null == b && (b = !1); - return {points: Hh._editorPointsFromWorld(a), closed: b} - }; - Hh._editorPayloadToJson = function (a) { var b = {}; a.payloadRev != null && (b.payloadRev = a.payloadRev); a.coordSpace != null && (b.coordSpace = a.coordSpace); - if (a.roadModels != null && a.roadModels.length) { - b.roadModels = []; - for (var c = 0; c < a.roadModels.length;) { - var d = a.roadModels[c++], f = {targetUid: d.targetUid}; - d.centerline != null && (f.centerline = {points: d.centerline.points, closed: d.centerline.closed}); - d.width != null && (f.width = d.width); - d.closed != null && (f.closed = d.closed); - d.props != null && (f.props = Hh._structToJson(d.props)); - b.roadModels.push(f); - } - } - - if (a.shapeModels != null && a.shapeModels.length) { - b.shapeModels = []; - for (c = 0; c < a.shapeModels.length;) { - d = a.shapeModels[c++]; - f = {targetUid: d.targetUid}; - d.polyline != null && (f.polyline = {points: d.polyline.points, closed: d.polyline.closed}); - d.bezier != null && (f.bezier = d.bezier); - d.arc != null && (f.arc = d.arc); - d.props != null && (f.props = Hh._structToJson(d.props)); - b.shapeModels.push(f); - } - } - a.props != null && (b.props = Hh._structToJson(a.props)); return b }; diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 786fb7d..db29f9c 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -8098,77 +8098,6 @@ var $lime_init = function (A, t) { } return b }, - lg.makeTransform = function () { - var a = new DataProto.data.GeoTransformObj; - return a.scale = Wa.SCALE, a.cx = Wa.CX, a.cy = Wa.CY, a.invertY = !0, a.precisionPow10 = 3, a - }, - lg._bboxWalk = function (a, b) { - if (a == null) return; - if (Array.isArray(a)) { - if (2 <= a.length && typeof a[0] === "number" && typeof a[1] === "number") { - var c = a[0], d = a[1]; - c < b.minX && (b.minX = c); - d < b.minY && (b.minY = d); - c > b.maxX && (b.maxX = c); - d > b.maxY && (b.maxY = d); - return - } - for (c = 0; c < a.length;) d = a[c], ++c, lg._bboxWalk(d, b) - } - }, - lg.bboxFromCoords = function (a) { - var b = {minX: 1 / 0, minY: 1 / 0, maxX: -1 / 0, maxY: -1 / 0}; - lg._bboxWalk(a, b); - if (b.minX === 1 / 0) return null; - var c = new DataProto.data.GeoBBoxObj; - return c.minX = b.minX, c.minY = b.minY, c.maxX = b.maxX, c.maxY = b.maxY, c - }, - lg.mergeBbox = function (a, b) { - if (a == null) return b; - if (b == null) return a; - var c = new DataProto.data.GeoBBoxObj; - return c.minX = Math.min(a.minX, b.minX), c.minY = Math.min(a.minY, b.minY), c.maxX = Math.max(a.maxX, b.maxX), c.maxY = Math.max(a.maxY, b.maxY), c - }, - lg.computeBbox = function (a) { - if (a == null) return null; - var b = null; - if (a.coordinates != null && Object.hasOwnProperty.call(a, "coordinates")) { - var c = lg.listValueToJson(a.coordinates); - b = lg.bboxFromCoords(c) - } else if (a.geometry != null && Object.hasOwnProperty.call(a, "geometry")) b = lg.computeBbox(a.geometry); - else if (a.features != null && a.features.length) { - c = 0; - for (var d = a.features; c < d.length;) { - var f = d[c]; - ++c; - b = lg.mergeBbox(b, lg.computeBbox(f)) - } - } else if (a.geometries != null && a.geometries.length) { - c = 0; - for (d = a.geometries; c < d.length;) f = d[c], ++c, b = lg.mergeBbox(b, lg.computeBbox(f)) - } - return b - }, - lg.ensureParts = function (a) { - if (a == null) return; - if (!(a.type == DataProto.data.GeoType.MultiPolygon || a.type == DataProto.data.GeoType.MultiPoint || a.type == DataProto.data.GeoType.MultiLineString)) return; - if (a.coordinates == null || !Object.hasOwnProperty.call(a, "coordinates")) return; - if (a.embedParts != null && a.embedParts.length) return; - var b = lg.listValueToJson(a.coordinates); - if (!Array.isArray(b)) return; - a.embedParts = []; - for (var c = 0; c < b.length;) { - var d = c, f = b[c++]; - var h = new DataProto.data.GeoPartObj; - h.index = d; - h.uid = (a.embedUid != null && Object.hasOwnProperty.call(a, "embedUid") ? a.embedUid : "obj") + ":part:" + d; - a.name != null && Object.hasOwnProperty.call(a, "name") && (h.name = "" + a.name + " #" + (d + 1)); - var k = lg.bboxFromCoords(f); - k != null && (h.bbox = k); - h.props = lg.toStruct({parentUid: a.embedUid, index: d}); - a.embedParts.push(h) - } - }, lg.buildPropsForObj = function (a) { if (a == null) return null; var b = {geoType: DataProto.data.GeoType[a.type]}; @@ -8180,26 +8109,21 @@ var $lime_init = function (A, t) { a.wallThickness != null && Object.hasOwnProperty.call(a, "wallThickness") && (b.wallThickness = a.wallThickness); a.generator != null && Object.hasOwnProperty.call(a, "generator") && (b.generator = DataProto.data.GeoGeneratorType[a.generator]); a.version != null && Object.hasOwnProperty.call(a, "version") && (b.version = a.version); - a.embedUid != null && Object.hasOwnProperty.call(a, "embedUid") && (b.uid = a.embedUid); return b }, - lg.enrichGeoObj = function (a, b) { + lg.enrichGeoObj = function (a) { if (a == null) return; - a.embedExportTransform == null && b != null && b.transform != null && (a.embedExportTransform = b.transform); - (a.embedUid == null || "" === a.embedUid) && b != null && b.uid != null && (a.embedUid = b.uid); if (a.embedProps == null) { var c = lg.buildPropsForObj(a); c != null && (a.embedProps = lg.toStruct(c)) } - lg.ensureParts(a); - a.embedBbox == null && (a.embedBbox = lg.computeBbox(a)); - if (a.geometry != null && Object.hasOwnProperty.call(a, "geometry")) lg.enrichGeoObj(a.geometry, {uid: a.embedUid + "/geometry", transform: a.embedExportTransform}); + if (a.geometry != null && Object.hasOwnProperty.call(a, "geometry")) lg.enrichGeoObj(a.geometry); if (a.features != null && a.features.length) for (c = 0; c < a.features.length;) { - var d = a.features[c], f = d != null && d.id != null && Object.hasOwnProperty.call(d, "id") ? DataProto.data.GeoFeatureType[d.id] : "" + c; + var d = a.features[c]; ++c; - lg.enrichGeoObj(d, {uid: a.embedUid + "/features/" + f, transform: a.embedExportTransform}) + lg.enrichGeoObj(d) } - if (a.geometries != null && a.geometries.length) for (c = 0; c < a.geometries.length;) d = a.geometries[c], f = "" + c, ++c, lg.enrichGeoObj(d, {uid: a.embedUid + "/geometries/" + f, transform: a.embedExportTransform}) + if (a.geometries != null && a.geometries.length) for (c = 0; c < a.geometries.length;) d = a.geometries[c], ++c, lg.enrichGeoObj(d) }, lg.makeEditorPayload = function (a) { ba.init(); @@ -8250,9 +8174,6 @@ var $lime_init = function (A, t) { }, lg.enrichRoot = function (a, b) { if (a == null) return; - var c = lg.makeTransform(); - a.embedExportTransform = c; - a.embedUid = "root"; a.embedEditorPayload = lg.makeEditorPayload(b); if (a.embedProps == null) { var d = {generator: "mfcg", version: A.current.meta.h.version, blueprint: b != null ? b.bp : null, state: ba.data, url: za.data}; @@ -8260,7 +8181,7 @@ var $lime_init = function (A, t) { f != null && (d.mfcgPayload = f); a.embedProps = lg.toStruct(d) } - lg.enrichGeoObj(a, {uid: "root", transform: c}) + lg.enrichGeoObj(a) }, lg.toJsonObject = function (a) { var b = DataProto.data.GeoType[a.type], c = {type: b}; @@ -8273,48 +8194,11 @@ var $lime_init = function (A, t) { a.generator != null && Object.hasOwnProperty.call(a, "generator") && (c.generator = DataProto.data.GeoGeneratorType[a.generator]); a.version != null && Object.hasOwnProperty.call(a, "version") && (c.version = a.version); a.riverWidth != null && Object.hasOwnProperty.call(a, "riverWidth") && (c.riverWidth = a.riverWidth); - a.embedUid != null && Object.hasOwnProperty.call(a, "embedUid") && (c.embedUid = a.embedUid); - a.embedExportTransform != null && Object.hasOwnProperty.call(a, "embedExportTransform") && (c.embedExportTransform = {scale: a.embedExportTransform.scale, cx: a.embedExportTransform.cx, cy: a.embedExportTransform.cy, invertY: a.embedExportTransform.invertY, precisionPow10: a.embedExportTransform.precisionPow10}); - a.embedBbox != null && Object.hasOwnProperty.call(a, "embedBbox") && (c.embedBbox = {minX: a.embedBbox.minX, minY: a.embedBbox.minY, maxX: a.embedBbox.maxX, maxY: a.embedBbox.maxY}); a.embedProps != null && Object.hasOwnProperty.call(a, "embedProps") && (c.embedProps = lg.structToJson(a.embedProps)); - if (a.embedParts != null && a.embedParts.length) { - c.embedParts = []; - for (var d2 = 0; d2 < a.embedParts.length;) { - var f2 = a.embedParts[d2++]; - c.embedParts.push({ - index: f2.index, - uid: f2.uid, - name: f2.name, - bbox: f2.bbox != null ? {minX: f2.bbox.minX, minY: f2.bbox.minY, maxX: f2.bbox.maxX, maxY: f2.bbox.maxY} : null, - props: f2.props != null ? lg.structToJson(f2.props) : null - }) - } - } if (a.embedEditorPayload != null && Object.hasOwnProperty.call(a, "embedEditorPayload")) { var h2 = a.embedEditorPayload, k2 = {}; h2.payloadRev != null && Object.hasOwnProperty.call(h2, "payloadRev") && (k2.payloadRev = h2.payloadRev); h2.coordSpace != null && Object.hasOwnProperty.call(h2, "coordSpace") && (k2.coordSpace = DataProto.data.EditorCoordSpaceType[h2.coordSpace]); - h2.layers != null && h2.layers.length && (k2.layers = h2.layers.map(function (a2) { - return {layerId: a2.layerId, visible: a2.visible, locked: a2.locked, zIndex: a2.zIndex} - })); - h2.groups != null && h2.groups.length && (k2.groups = h2.groups.map(function (a2) { - return {groupUid: a2.groupUid, name: a2.name, memberUids: a2.memberUids, props: a2.props != null ? lg.structToJson(a2.props) : null} - })); - h2.links != null && h2.links.length && (k2.links = h2.links.map(function (a2) { - return {aUid: a2.aUid, bUid: a2.bUid, type: DataProto.data.EditorLinkType[a2.type], props: a2.props != null ? lg.structToJson(a2.props) : null} - })); - h2.roadModels != null && h2.roadModels.length && (k2.roadModels = h2.roadModels.map(function (a2) { - return {targetUid: a2.targetUid, centerline: a2.centerline != null ? {closed: a2.centerline.closed, points: a2.centerline.points} : null, width: a2.width, closed: a2.closed, props: a2.props != null ? lg.structToJson(a2.props) : null} - })); - h2.shapeModels != null && h2.shapeModels.length && (k2.shapeModels = h2.shapeModels.map(function (a2) { - return {targetUid: a2.targetUid, polyline: a2.polyline, bezier: a2.bezier, arc: a2.arc, props: a2.props != null ? lg.structToJson(a2.props) : null} - })); - h2.snapNodes != null && h2.snapNodes.length && (k2.snapNodes = h2.snapNodes.map(function (a2) { - return {nodeUid: a2.nodeUid, pos: a2.pos, incidentUids: a2.incidentUids, props: a2.props != null ? lg.structToJson(a2.props) : null} - })); - h2.constraints != null && h2.constraints.length && (k2.constraints = h2.constraints.map(function (a2) { - return {constraintUid: a2.constraintUid, type: DataProto.data.EditorConstraintType[a2.type], targetUids: a2.targetUids, params: a2.params != null ? lg.structToJson(a2.params) : null} - })); h2.props != null && Object.hasOwnProperty.call(h2, "props") && (k2.props = lg.structToJson(h2.props)); c.embedEditorPayload = k2 } From 8f559a8c87cfc099849dd6abaeb4238c67e60f71 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 12:18:21 +0100 Subject: [PATCH 14/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.1]=20=20=D0=BF=D0=B5=D1=80=D0=BD=D0=B5=D1=81=20=D0=BA?= =?UTF-8?q?=D0=BD=D0=BE=D0=BF=D0=BA=D1=83=20=D0=BD=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/mfcg.js | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/js/mfcg.js b/src/js/mfcg.js index db29f9c..2a48196 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -13678,10 +13678,6 @@ var $lime_init = function (A, t) { c.set_width(96); c.action.add(l(this, this.onExport)); b.add(c); - c = new fb("Import"); - c.set_width(96); - c.click.add(l(this, this.onImport)); - b.add(c); this.add(b); Bb.newModel.add(l(this, this.onNewModel)); Bb.titleChanged.add(l(this, this.onTitleChanged)); @@ -14196,6 +14192,27 @@ var $lime_init = function (A, t) { onWarp: function () { bb.switchScene(jd) }, + onImport: function () { + var a = this, + b = new Gf; + b.addEventListener("select", function (c) { + b.addEventListener("complete", l(a, a.onImportLoaded)); + b.load() + }); + b.browse([new Th("Map", "*.json;*.pb;")]) + }, + onImportLoaded: function (a) { + try { + var b = va.__cast(a.target, Gf); + be.importFromFile(b.name, b.data) + } catch (c) { + try { + console.error("MFCG import failed:", c); + } catch (d) { + } + q.show(c && c.message ? c.message : String(c)); + } + }, createOverlays: function () { ia.prototype.createOverlays.call(this); this.overlays.push(this.title = new qi(this)); @@ -14259,6 +14276,7 @@ var $lime_init = function (A, t) { c.addItem("PROTO", be.asPROTO); a.addItem("View in 3D", l(this, this.onViewIn3D)); + a.addItem("Import...", l(this, this.onImport)); a.addSubmenu("Export as", c); a.addItem("Permalink..", l(this, this.onPermalink)) From ac620b0767a688d1f2c67fe0999629c740d91883 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 12:34:19 +0100 Subject: [PATCH 15/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.1]=20=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BD?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=20=D0=B8=D0=BC?= =?UTF-8?q?=D0=BF=D0=BE=D1=80=D1=82=20=D0=B8=20=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D1=8E=20=D1=82=D0=B0=D0=B9=D0=BC=D0=BB=D0=B0=D0=B9?= =?UTF-8?q?=D0=BD=20=D0=B8=D0=B7=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/mfcg.js | 18 +- .../vanilla/Cave/PaletteCaveObj.json | 17 + .../vanilla/Cave/PaletteGladeObj.json | 29 + .../vanilla/Dwellings/DwellingsObj.json | 1091 +++ .../Dwellings/PaletteDwellingsObj.json | 24 + .../vanilla/ToyTown2/PaletteViewerObj.json | 23 + tests/data_tests/vanilla/Village/GeoObj.json | 3233 +++++++ .../vanilla/Village/PaletteVillageObj.json | 68 + tests/data_tests/vanilla/mfcg/GeoObj.json | 8415 +++++++++++++++++ .../vanilla/mfcg/PaletteMfcgObj.json | 15 + 10 files changed, 12928 insertions(+), 5 deletions(-) create mode 100644 tests/data_tests/vanilla/Cave/PaletteCaveObj.json create mode 100644 tests/data_tests/vanilla/Cave/PaletteGladeObj.json create mode 100644 tests/data_tests/vanilla/Dwellings/DwellingsObj.json create mode 100644 tests/data_tests/vanilla/Dwellings/PaletteDwellingsObj.json create mode 100644 tests/data_tests/vanilla/ToyTown2/PaletteViewerObj.json create mode 100644 tests/data_tests/vanilla/Village/GeoObj.json create mode 100644 tests/data_tests/vanilla/Village/PaletteVillageObj.json create mode 100644 tests/data_tests/vanilla/mfcg/GeoObj.json create mode 100644 tests/data_tests/vanilla/mfcg/PaletteMfcgObj.json diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 2a48196..b7afbf9 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -7965,12 +7965,17 @@ var $lime_init = function (A, t) { try { c = JSON.parse(d) } catch (p) { - try { - console.error("MFCG import JSON parse failed:", p); - } catch (g2) { - } + throw new Error("An error occurred while parsing: " + (p && p.message ? p.message : String(p))); + } + if (null != c) { + var t = DataGeo.detectLegacyRootType(c); + if (t != null && t !== DataProto.data.DataType.geo) throw DataGeo.createTypeMismatchError(DataProto.data.DataType.geo, t); + if (c == null || "object" != typeof c || Array.isArray(c)) throw new Error("An error occurred while parsing: file could not be recognized or decoded."); + var r = c.type != null && (c.features != null || c.geometries != null || c.geometry != null || c.coordinates != null); + if (!r) throw new Error("An error occurred while parsing: file could not be recognized or decoded."); + if (c.embedProps == null && c.embedEditorPayload == null) throw new Error("This format is too outdated and cannot be opened because it does not contain the necessary data."); + return be.extractPayloadFromJson(c) } - if (null != c) return be.extractPayloadFromJson(c) } } var f = DataGeo.toUint8Array(b); @@ -8009,6 +8014,9 @@ var $lime_init = function (A, t) { } } if (null == p) throw new Error("An error occurred while parsing: file could not be recognized or decoded."); + var r2 = p.type != null && (p.features != null || p.geometries != null || p.geometry != null || p.coordinates != null); + if (!r2) throw new Error("An error occurred while parsing: file could not be recognized or decoded."); + if (p.embedProps == null && p.embedEditorPayload == null) throw new Error("Этот формат слишком устаревший и не может быть открыт, так как в нем нет нужных данных."); return be.extractPayloadFromProto(p) }; be.extractPayloadFromJson = function (a) { diff --git a/tests/data_tests/vanilla/Cave/PaletteCaveObj.json b/tests/data_tests/vanilla/Cave/PaletteCaveObj.json new file mode 100644 index 0000000..af1a809 --- /dev/null +++ b/tests/data_tests/vanilla/Cave/PaletteCaveObj.json @@ -0,0 +1,17 @@ +{ + "colorPage": "#3D3D4C", + "colorFloor": "#050519", + "colorWater": "#202030", + "colorInk": "#DAE5E5", + "shadeAlpha": "0.3", + "shadowAlpha": "0.2", + "shadowDist": "2.0", + "strokeWall": "4.0", + "strokeDetail": "0.8", + "strokeHatch": "0.5", + "strokeGrid": "0.2", + "hatchingStrokes": "4", + "hatchingSize": "0.4", + "hatchingDistance": "0.2", + "hatchingStones": "0.3" +} \ No newline at end of file diff --git a/tests/data_tests/vanilla/Cave/PaletteGladeObj.json b/tests/data_tests/vanilla/Cave/PaletteGladeObj.json new file mode 100644 index 0000000..a9fc7fe --- /dev/null +++ b/tests/data_tests/vanilla/Cave/PaletteGladeObj.json @@ -0,0 +1,29 @@ +{ + "thicket": "#3C4C41", + "ground": "#F9EBA2", + "ink": "#4C2D41", + "marks": "#FAE8A1", + "tree": [ + "#83A866", + "#698C63", + "#ABC168" + ], + "treeDetails": "#4C2D41", + "treeVariance": "0.2", + "treeBands": "2", + "treeShape": "Palm", + "water": "#82CAD8", + "shallow": "#A9F2C1", + "sand": "#ADCC8E", + "shadowColor": "#B5B5CC", + "shadowLength": "0.8", + "shadowAngle": "30", + "road": "#CCB78E", + "roadOutline": "#CCB78E", + "roadWidth": "0.2", + "roadWiggle": "0.2", + "strokeNormal": "1.5", + "strokeThin": "0.5", + "strokeGrid": "0.3", + "grassLength": "9" +} \ No newline at end of file diff --git a/tests/data_tests/vanilla/Dwellings/DwellingsObj.json b/tests/data_tests/vanilla/Dwellings/DwellingsObj.json new file mode 100644 index 0000000..792b85d --- /dev/null +++ b/tests/data_tests/vanilla/Dwellings/DwellingsObj.json @@ -0,0 +1,1091 @@ +{ + "floors": [ + { + "level": 0, + "rooms": [ + { + "cells": [ + { + "i": 4, + "j": 5 + } + ] + }, + { + "name": "Hall", + "cells": [ + { + "i": 1, + "j": 2 + }, + { + "i": 0, + "j": 2 + }, + { + "i": 1, + "j": 3 + }, + { + "i": 0, + "j": 3 + } + ] + }, + { + "name": "Kitchen", + "cells": [ + { + "i": 5, + "j": 1 + }, + { + "i": 4, + "j": 1 + }, + { + "i": 5, + "j": 0 + }, + { + "i": 4, + "j": 0 + } + ] + }, + { + "name": "Library", + "cells": [ + { + "i": 3, + "j": 2 + }, + { + "i": 4, + "j": 2 + }, + { + "i": 5, + "j": 2 + }, + { + "i": 5, + "j": 3 + }, + { + "i": 6, + "j": 2 + }, + { + "i": 6, + "j": 3 + } + ] + }, + { + "name": "Living room", + "cells": [ + { + "i": 3, + "j": 3 + }, + { + "i": 3, + "j": 4 + }, + { + "i": 4, + "j": 3 + }, + { + "i": 4, + "j": 4 + }, + { + "i": 2, + "j": 4 + } + ] + }, + { + "cells": [ + { + "i": 2, + "j": 2 + }, + { + "i": 2, + "j": 3 + } + ] + }, + { + "name": "Bathroom", + "cells": [ + { + "i": 5, + "j": 5 + }, + { + "i": 5, + "j": 4 + } + ] + } + ], + "doors": [ + { + "edge": { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "w" + }, + "type": "NULL" + }, + { + "edge": { + "cell": { + "i": 1, + "j": 2 + }, + "dir": "s" + } + }, + { + "edge": { + "cell": { + "i": 4, + "j": 1 + }, + "dir": "e" + }, + "type": "REGULAR" + }, + { + "edge": { + "cell": { + "i": 3, + "j": 2 + }, + "dir": "n" + } + }, + { + "edge": { + "cell": { + "i": 5, + "j": 3 + }, + "dir": "e" + }, + "type": "REGULAR" + }, + { + "edge": { + "cell": { + "i": 2, + "j": 4 + }, + "dir": "w" + } + } + ], + "windows": [ + { + "cell": { + "i": 5, + "j": 5 + }, + "dir": "s" + }, + { + "cell": { + "i": 5, + "j": 4 + }, + "dir": "s" + }, + { + "cell": { + "i": 2, + "j": 4 + }, + "dir": "n" + }, + { + "cell": { + "i": 2, + "j": 4 + }, + "dir": "e" + }, + { + "cell": { + "i": 3, + "j": 4 + }, + "dir": "e" + }, + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "n" + }, + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e" + }, + { + "cell": { + "i": 5, + "j": 0 + }, + "dir": "w" + }, + { + "cell": { + "i": 4, + "j": 0 + }, + "dir": "w" + }, + { + "cell": { + "i": 4, + "j": 0 + }, + "dir": "n" + }, + { + "cell": { + "i": 4, + "j": 1 + }, + "dir": "n" + }, + { + "cell": { + "i": 0, + "j": 2 + }, + "dir": "n" + }, + { + "cell": { + "i": 0, + "j": 3 + }, + "dir": "n" + }, + { + "cell": { + "i": 0, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 1, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 5, + "j": 1 + }, + "dir": "s" + }, + { + "cell": { + "i": 5, + "j": 0 + }, + "dir": "s" + } + ], + "stairs": [ + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e", + "up": true + }, + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e", + "up": false + } + ] + }, + { + "level": 1, + "rooms": [ + { + "cells": [ + { + "i": 4, + "j": 5 + } + ] + }, + { + "cells": [ + { + "i": 5, + "j": 5 + } + ] + }, + { + "name": "Bedroom", + "cells": [ + { + "i": 3, + "j": 2 + }, + { + "i": 2, + "j": 2 + }, + { + "i": 3, + "j": 3 + }, + { + "i": 2, + "j": 3 + }, + { + "i": 1, + "j": 3 + }, + { + "i": 0, + "j": 3 + }, + { + "i": 1, + "j": 2 + }, + { + "i": 0, + "j": 2 + } + ] + }, + { + "name": "Room", + "cells": [ + { + "i": 2, + "j": 4 + }, + { + "i": 3, + "j": 4 + }, + { + "i": 4, + "j": 4 + }, + { + "i": 5, + "j": 4 + }, + { + "i": 4, + "j": 3 + }, + { + "i": 5, + "j": 3 + }, + { + "i": 4, + "j": 2 + }, + { + "i": 5, + "j": 2 + }, + { + "i": 6, + "j": 2 + }, + { + "i": 6, + "j": 3 + } + ] + } + ], + "doors": [ + { + "edge": { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "w" + }, + "type": "NULL" + }, + { + "edge": { + "cell": { + "i": 5, + "j": 5 + }, + "dir": "w" + }, + "type": "REGULAR" + }, + { + "edge": { + "cell": { + "i": 3, + "j": 3 + }, + "dir": "e" + }, + "type": "REGULAR" + } + ], + "windows": [ + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "n" + }, + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e" + }, + { + "cell": { + "i": 3, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 2, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 1, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 0, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 2, + "j": 4 + }, + "dir": "e" + }, + { + "cell": { + "i": 3, + "j": 4 + }, + "dir": "e" + }, + { + "cell": { + "i": 6, + "j": 3 + }, + "dir": "s" + }, + { + "cell": { + "i": 6, + "j": 2 + }, + "dir": "s" + }, + { + "cell": { + "i": 6, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 5, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 4, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 5, + "j": 5 + }, + "dir": "s" + } + ], + "stairs": [ + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e", + "up": false + }, + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e", + "up": true + } + ] + }, + { + "level": 2, + "rooms": [ + { + "cells": [ + { + "i": 4, + "j": 5 + } + ] + }, + { + "name": "Room", + "cells": [ + { + "i": 6, + "j": 2 + }, + { + "i": 5, + "j": 2 + }, + { + "i": 4, + "j": 2 + }, + { + "i": 5, + "j": 3 + }, + { + "i": 4, + "j": 3 + }, + { + "i": 5, + "j": 4 + }, + { + "i": 4, + "j": 4 + } + ] + }, + { + "name": "Bathroom", + "cells": [ + { + "i": 6, + "j": 3 + } + ] + }, + { + "name": "Room", + "cells": [ + { + "i": 3, + "j": 2 + }, + { + "i": 2, + "j": 2 + }, + { + "i": 3, + "j": 3 + }, + { + "i": 2, + "j": 3 + }, + { + "i": 3, + "j": 4 + }, + { + "i": 2, + "j": 4 + }, + { + "i": 1, + "j": 3 + }, + { + "i": 0, + "j": 3 + }, + { + "i": 1, + "j": 2 + }, + { + "i": 0, + "j": 2 + } + ] + } + ], + "doors": [ + { + "edge": { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "w" + }, + "type": "NULL" + }, + { + "edge": { + "cell": { + "i": 6, + "j": 2 + }, + "dir": "e" + }, + "type": "REGULAR" + }, + { + "edge": { + "cell": { + "i": 4, + "j": 2 + }, + "dir": "n" + }, + "type": "REGULAR" + } + ], + "windows": [ + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "n" + }, + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "s" + }, + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e" + }, + { + "cell": { + "i": 6, + "j": 3 + }, + "dir": "s" + }, + { + "cell": { + "i": 3, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 2, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 1, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 0, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 5, + "j": 4 + }, + "dir": "e" + }, + { + "cell": { + "i": 6, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 5, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 4, + "j": 2 + }, + "dir": "w" + }, + { + "cell": { + "i": 2, + "j": 4 + }, + "dir": "e" + }, + { + "cell": { + "i": 3, + "j": 4 + }, + "dir": "e" + }, + { + "cell": { + "i": 0, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 1, + "j": 3 + }, + "dir": "e" + } + ], + "stairs": [ + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e", + "up": false + }, + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e", + "up": true + } + ] + }, + { + "level": 3, + "rooms": [ + { + "cells": [ + { + "i": 4, + "j": 5 + } + ] + }, + { + "name": "Bedroom", + "cells": [ + { + "i": 6, + "j": 3 + }, + { + "i": 5, + "j": 3 + }, + { + "i": 6, + "j": 2 + }, + { + "i": 5, + "j": 2 + }, + { + "i": 4, + "j": 2 + }, + { + "i": 4, + "j": 3 + }, + { + "i": 4, + "j": 4 + }, + { + "i": 5, + "j": 4 + } + ] + } + ], + "doors": [ + { + "edge": { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "w" + }, + "type": "REGULAR" + } + ], + "windows": [ + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "n" + }, + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "s" + }, + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e" + }, + { + "cell": { + "i": 5, + "j": 4 + }, + "dir": "e" + }, + { + "cell": { + "i": 4, + "j": 2 + }, + "dir": "n" + }, + { + "cell": { + "i": 4, + "j": 3 + }, + "dir": "n" + }, + { + "cell": { + "i": 4, + "j": 4 + }, + "dir": "n" + } + ], + "stairs": [ + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e", + "up": false + } + ] + }, + { + "level": -1, + "rooms": [ + { + "cells": [ + { + "i": 4, + "j": 5 + } + ] + }, + { + "name": "Storage", + "cells": [ + { + "i": 5, + "j": 1 + }, + { + "i": 4, + "j": 1 + }, + { + "i": 5, + "j": 0 + }, + { + "i": 4, + "j": 0 + } + ] + }, + { + "name": "Cellar", + "cells": [ + { + "i": 4, + "j": 2 + }, + { + "i": 4, + "j": 3 + }, + { + "i": 5, + "j": 2 + }, + { + "i": 5, + "j": 3 + }, + { + "i": 6, + "j": 2 + }, + { + "i": 6, + "j": 3 + }, + { + "i": 5, + "j": 4 + }, + { + "i": 4, + "j": 4 + }, + { + "i": 5, + "j": 5 + } + ] + } + ], + "doors": [ + { + "edge": { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "w" + }, + "type": "NULL" + }, + { + "edge": { + "cell": { + "i": 4, + "j": 1 + }, + "dir": "e" + }, + "type": "REGULAR" + } + ], + "windows": [], + "stairs": [ + { + "cell": { + "i": 4, + "j": 5 + }, + "dir": "e", + "up": true + } + ] + } + ], + "exit": { + "cell": { + "i": 1, + "j": 2 + }, + "dir": "w" + } +} \ No newline at end of file diff --git a/tests/data_tests/vanilla/Dwellings/PaletteDwellingsObj.json b/tests/data_tests/vanilla/Dwellings/PaletteDwellingsObj.json new file mode 100644 index 0000000..9f0548f --- /dev/null +++ b/tests/data_tests/vanilla/Dwellings/PaletteDwellingsObj.json @@ -0,0 +1,24 @@ +{ + "colorInk": "#332018", + "colorPaper": "#DAEAF2", + "colorFloor": "#CCB38E", + "colorWalls": "#7F6959", + "colorProps": "#A58C74", + "colorWindows": "#B2A08E", + "colorStairs": "#B29D7C", + "colorRoof": "#99826B", + "colorLabels": "#B24747", + "strNormal10": "0.3", + "strGrid10": "0.2", + "alphaGrid": "0.5", + "alphaAO": "0.4", + "alphaLights": "0.4", + "fontRoom": { + "bold": false, + "face": null, + "size": 28, + "embedded": "ui_font", + "italic": false + }, + "hatching": "false" +} \ No newline at end of file diff --git a/tests/data_tests/vanilla/ToyTown2/PaletteViewerObj.json b/tests/data_tests/vanilla/ToyTown2/PaletteViewerObj.json new file mode 100644 index 0000000..5fe870d --- /dev/null +++ b/tests/data_tests/vanilla/ToyTown2/PaletteViewerObj.json @@ -0,0 +1,23 @@ +{ + "ground": "#FFFFFF", + "fields": "#E6EBF2", + "greens": "#E6EBF2", + "foliage": "#1E322F", + "roads": "#C1C6CC", + "water": "#1A2833", + "walls1": "#888877", + "walls2": "#333344", + "roofs1": "#FFFFFF", + "roofs2": "#CCDDFF", + "sky1": "#33AAFF", + "sky2": "#FBFFE8", + "sun": "#FFF9E5", + "sun_pos": "50.0", + "ambience": "0.4", + "windows": "#FFFFFF", + "lighted": "0.0", + "pitch": "1.0", + "roofedTowers": "false", + "towers": "Round", + "tree_shape": "Cone" +} \ No newline at end of file diff --git a/tests/data_tests/vanilla/Village/GeoObj.json b/tests/data_tests/vanilla/Village/GeoObj.json new file mode 100644 index 0000000..20bfd06 --- /dev/null +++ b/tests/data_tests/vanilla/Village/GeoObj.json @@ -0,0 +1,3233 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": "values", + "roadWidth": 7, + "generator": "vg", + "version": "1.6.6", + "wallThickness": 0.7 + }, + { + "type": "Polygon", + "id": "earth", + "coordinates": [ + [ + [ + -208.6, + 208.6 + ], + [ + 208.6, + 208.6 + ], + [ + 208.6, + -208.6 + ], + [ + -208.6, + -208.6 + ] + ] + ] + }, + { + "type": "MultiPolygon", + "id": "buildings", + "coordinates": [ + [ + [ + [ + 42.835, + -6.48 + ], + [ + 46.974, + -0.773 + ], + [ + 54.871, + -6.501 + ], + [ + 50.733, + -12.207 + ] + ] + ], + [ + [ + [ + 47.171, + 2.694 + ], + [ + 52.096, + 9.486 + ], + [ + 63.626, + 1.125 + ], + [ + 58.7, + -5.666 + ] + ] + ], + [ + [ + [ + 54.326, + 12.333 + ], + [ + 59.05, + 18.847 + ], + [ + 65.868, + 13.903 + ], + [ + 61.144, + 7.389 + ] + ] + ], + [ + [ + [ + 61.616, + 28.191 + ], + [ + 61.212, + 35.609 + ], + [ + 74.767, + 36.349 + ], + [ + 75.172, + 28.931 + ] + ] + ], + [ + [ + [ + 64.897, + 38.185 + ], + [ + 64.457, + 46.246 + ], + [ + 73.481, + 46.738 + ], + [ + 73.921, + 38.677 + ] + ] + ], + [ + [ + [ + 61.936, + 51.586 + ], + [ + 61.517, + 59.271 + ], + [ + 73.505, + 59.925 + ], + [ + 73.924, + 52.24 + ] + ] + ], + [ + [ + [ + 62.535, + 68.286 + ], + [ + 57.915, + 75.148 + ], + [ + 72.171, + 84.747 + ], + [ + 76.791, + 77.885 + ] + ] + ], + [ + [ + [ + 49.731, + 78.079 + ], + [ + 42.641, + 83.089 + ], + [ + 50.478, + 94.18 + ], + [ + 57.568, + 89.171 + ] + ] + ], + [ + [ + [ + 39.351, + 84.912 + ], + [ + 33.942, + 88.734 + ], + [ + 39.468, + 96.555 + ], + [ + 44.877, + 92.733 + ] + ] + ], + [ + [ + [ + 30.731, + 91.05 + ], + [ + 24.55, + 95.417 + ], + [ + 33.804, + 108.515 + ], + [ + 39.985, + 104.147 + ] + ] + ], + [ + [ + [ + 20.136, + 101.049 + ], + [ + 12.547, + 105.65 + ], + [ + 20.922, + 119.464 + ], + [ + 28.511, + 114.863 + ] + ] + ], + [ + [ + [ + 0.288, + 113.003 + ], + [ + -6.715, + 117.248 + ], + [ + -1.703, + 125.514 + ], + [ + 5.299, + 121.268 + ] + ] + ], + [ + [ + [ + -47.769, + 102.867 + ], + [ + -54.112, + 99.38 + ], + [ + -57.803, + 106.093 + ], + [ + -51.46, + 109.58 + ] + ] + ], + [ + [ + [ + -68.611, + 72.885 + ], + [ + -72.274, + 65.322 + ], + [ + -87.052, + 72.478 + ], + [ + -83.39, + 80.041 + ] + ] + ], + [ + [ + [ + -75.754, + 58.108 + ], + [ + -76.052, + 51.48 + ], + [ + -86.333, + 51.943 + ], + [ + -86.035, + 58.57 + ] + ] + ], + [ + [ + [ + -73.836, + 45.585 + ], + [ + -72.232, + 38.209 + ], + [ + -79.706, + 36.583 + ], + [ + -81.31, + 43.959 + ] + ] + ], + [ + [ + [ + -73.092, + 33.886 + ], + [ + -71.466, + 26.41 + ], + [ + -87.654, + 22.888 + ], + [ + -89.28, + 30.365 + ] + ] + ], + [ + [ + [ + -72.143, + 22.283 + ], + [ + -70.637, + 15.36 + ], + [ + -85.733, + 12.077 + ], + [ + -87.239, + 18.999 + ] + ] + ], + [ + [ + [ + -69.295, + 4.508 + ], + [ + -69.827, + -2.351 + ], + [ + -84.154, + -1.24 + ], + [ + -83.622, + 5.619 + ] + ] + ], + [ + [ + [ + -68.573, + -5.656 + ], + [ + -69.088, + -12.299 + ], + [ + -82.372, + -11.269 + ], + [ + -81.857, + -4.626 + ] + ] + ], + [ + [ + [ + -71.248, + -13.221 + ], + [ + -71.825, + -20.659 + ], + [ + -87.559, + -19.438 + ], + [ + -86.982, + -12 + ] + ] + ], + [ + [ + [ + -66.25, + -32.079 + ], + [ + -59.959, + -35.204 + ], + [ + -65.794, + -46.947 + ], + [ + -72.085, + -43.822 + ] + ] + ], + [ + [ + [ + -57.078, + -35.234 + ], + [ + -49.5, + -38.222 + ], + [ + -54.842, + -51.768 + ], + [ + -62.42, + -48.78 + ] + ] + ], + [ + [ + [ + -46.39, + -39.915 + ], + [ + -39.702, + -42.553 + ], + [ + -44.42, + -54.518 + ], + [ + -51.108, + -51.88 + ] + ] + ], + [ + [ + [ + -37.41, + -43.043 + ], + [ + -31.006, + -45.569 + ], + [ + -33.798, + -52.651 + ], + [ + -40.203, + -50.125 + ] + ] + ], + [ + [ + [ + -43.153, + -66.13 + ], + [ + -46.236, + -73.948 + ], + [ + -62.263, + -67.628 + ], + [ + -59.18, + -59.81 + ] + ] + ], + [ + [ + [ + -47.863, + -113.445 + ], + [ + -44.674, + -105.358 + ], + [ + -32.415, + -110.192 + ], + [ + -35.604, + -118.279 + ] + ] + ], + [ + [ + [ + -31.828, + -78.864 + ], + [ + -28.924, + -71.5 + ], + [ + -13.545, + -77.564 + ], + [ + -16.449, + -84.928 + ] + ] + ], + [ + [ + [ + -29.015, + -66.487 + ], + [ + -25.803, + -58.34 + ], + [ + -10.902, + -64.216 + ], + [ + -14.115, + -72.363 + ] + ] + ], + [ + [ + [ + -23.004, + -57.54 + ], + [ + -20.17, + -50.353 + ], + [ + -11.336, + -53.836 + ], + [ + -14.17, + -61.023 + ] + ] + ], + [ + [ + [ + 16.176, + -58.649 + ], + [ + 22.78, + -57.278 + ], + [ + 25.477, + -70.273 + ], + [ + 18.872, + -71.643 + ] + ] + ], + [ + [ + [ + 27.697, + -55.142 + ], + [ + 33.571, + -51.481 + ], + [ + 38.498, + -59.386 + ], + [ + 32.624, + -63.047 + ] + ] + ], + [ + [ + [ + 39.185, + -46.917 + ], + [ + 43.96, + -39.946 + ], + [ + 58.658, + -50.013 + ], + [ + 53.884, + -56.984 + ] + ] + ], + [ + [ + [ + 50.541, + -30.984 + ], + [ + 57.924, + -30.97 + ], + [ + 57.949, + -43.827 + ], + [ + 50.565, + -43.841 + ] + ] + ], + [ + [ + [ + 61.428, + -31.556 + ], + [ + 69.276, + -31.542 + ], + [ + 69.304, + -46.565 + ], + [ + 61.457, + -46.579 + ] + ] + ], + [ + [ + [ + 75.115, + -18.16 + ], + [ + 66.275, + -18.177 + ], + [ + 66.248, + -4.231 + ], + [ + 75.088, + -4.214 + ] + ] + ], + [ + [ + [ + -11.194, + -101.758 + ], + [ + -12.721, + -108.295 + ], + [ + -26.62, + -105.047 + ], + [ + -25.092, + -98.51 + ] + ] + ], + [ + [ + [ + -1.127, + -119.524 + ], + [ + 0.719, + -111.626 + ], + [ + 12.707, + -114.427 + ], + [ + 10.862, + -122.326 + ] + ] + ], + [ + [ + [ + 5.239, + -88.875 + ], + [ + 6.873, + -81.884 + ], + [ + 21.524, + -85.308 + ], + [ + 19.89, + -92.299 + ] + ] + ] + ] + }, + { + "type": "MultiPolygon", + "id": "prisms", + "coordinates": [] + }, + { + "type": "MultiPoint", + "id": "trees", + "coordinates": [ + [ + -1.854, + -130.259 + ], + [ + -95.437, + -44.479 + ], + [ + -100.441, + -26.793 + ], + [ + 76.195, + -33.454 + ], + [ + 8.995, + -100.654 + ], + [ + 20.241, + -114.139 + ], + [ + -5.957, + -54.225 + ], + [ + -76.813, + 98.356 + ], + [ + -36.665, + 125.644 + ], + [ + -123.944, + -17.036 + ], + [ + 79.716, + -51.149 + ], + [ + -70.342, + 89.643 + ], + [ + -56.744, + 117.364 + ], + [ + 23.216, + -106.601 + ], + [ + 23.028, + -123.312 + ], + [ + 82.236, + 6.388 + ], + [ + 28.702, + -113.061 + ], + [ + 57.587, + 31.156 + ], + [ + -44.172, + -123.312 + ], + [ + 77.966, + -69.052 + ], + [ + 6.458, + -128.266 + ], + [ + 30.091, + -101.694 + ], + [ + -84.225, + -73.058 + ], + [ + -19.139, + 119.359 + ], + [ + -86.316, + -37.444 + ], + [ + -64.543, + 81.523 + ], + [ + 0.321, + 99.014 + ], + [ + -53.656, + 124.843 + ], + [ + -105.698, + -45.861 + ], + [ + -29.727, + -129.365 + ], + [ + -44.75, + 120.765 + ], + [ + -120.856, + -9.557 + ], + [ + -64.543, + 14.323 + ], + [ + -111.184, + -39.401 + ], + [ + 14.688, + -107.189 + ], + [ + -25.64, + 112.119 + ], + [ + 15.036, + -128.012 + ], + [ + 69.239, + -73.957 + ], + [ + 88.708, + -1.703 + ], + [ + 38.963, + -111.679 + ], + [ + -45.692, + 132.697 + ], + [ + 32.265, + -85.315 + ], + [ + -58.205, + -100.654 + ], + [ + 82.236, + -60.812 + ], + [ + -95.437, + 22.721 + ], + [ + -34.935, + 116.285 + ], + [ + -43.822, + 111.378 + ], + [ + -60.968, + 24.089 + ], + [ + -93.824, + -33.26 + ], + [ + -23.962, + -120.903 + ], + [ + -66.879, + 99.014 + ], + [ + -52.512, + 94.411 + ], + [ + -114.578, + -31.596 + ], + [ + -33.241, + 107.607 + ], + [ + 69.857, + -52.877 + ], + [ + -60.968, + 91.289 + ], + [ + 73.658, + 6.134 + ], + [ + -104.309, + 32.706 + ], + [ + -27.651, + 130.623 + ], + [ + -66.879, + 31.814 + ], + [ + 65.346, + -63.059 + ], + [ + -69.681, + 115.905 + ], + [ + -27.025, + 122.543 + ], + [ + -65.161, + -73.957 + ], + [ + 73.658, + -61.066 + ], + [ + -102.162, + -54.916 + ], + [ + -62.859, + 108.797 + ], + [ + -7.332, + -71.178 + ], + [ + -37.243, + 135.571 + ], + [ + 81.888, + -39.989 + ], + [ + -34.962, + -122.116 + ], + [ + 80.744, + -76.757 + ], + [ + 33.959, + -93.993 + ], + [ + -9.147, + -80.484 + ], + [ + -81.689, + 88.296 + ], + [ + -104.309, + -34.494 + ], + [ + -29.727, + 139.435 + ], + [ + -96.927, + -62.165 + ], + [ + -120.854, + -25.79 + ], + [ + -4.765, + 106.28 + ], + [ + -33.241, + -93.993 + ], + [ + -111.184, + 27.799 + ], + [ + 87.441, + -46.939 + ], + [ + -86.316, + 96.956 + ], + [ + -111.95, + -80.835 + ], + [ + 61.243, + -54.225 + ], + [ + -56.744, + -84.236 + ], + [ + -71.965, + 106.28 + ], + [ + 32.238, + -122.116 + ], + [ + -67.293, + -68.055 + ], + [ + -68.991, + -56.882 + ], + [ + -90.42, + -54.721 + ], + [ + -77.823, + -53.767 + ], + [ + -76.066, + -63.564 + ], + [ + -92.613, + 44.713 + ], + [ + -91.342, + 65.286 + ], + [ + -90.707, + 75.572 + ], + [ + -103.219, + 44.683 + ], + [ + -102.584, + 54.97 + ], + [ + -101.948, + 65.256 + ], + [ + -101.313, + 75.542 + ], + [ + 90.422, + 15.718 + ], + [ + 75.752, + 26 + ], + [ + 84.581, + 30.626 + ], + [ + 100.011, + 15.136 + ], + [ + 102.145, + 25.098 + ], + [ + 98.331, + 5.536 + ], + [ + 95.551, + 32.314 + ], + [ + 105.584, + 34.587 + ], + [ + 80.618, + 76.672 + ], + [ + 83.082, + 66.455 + ], + [ + 90.596, + 74.706 + ], + [ + 32.203, + -76.483 + ], + [ + 37.627, + -84.613 + ], + [ + 42.018, + -71.445 + ], + [ + 47.441, + -79.575 + ], + [ + 51.296, + -65.603 + ], + [ + 56.72, + -73.733 + ] + ] + }, + { + "type": "GeometryCollection", + "id": "roads", + "geometries": [ + { + "type": "LineString", + "width": 1.4, + "coordinates": [ + [ + -25.212, + -40.224 + ], + [ + -26.496, + -43.48 + ], + [ + -27.78, + -46.736 + ], + [ + -29.064, + -49.992 + ], + [ + -30.348, + -53.248 + ], + [ + -31.632, + -56.504 + ], + [ + -32.915, + -59.76 + ], + [ + -34.199, + -63.016 + ], + [ + -35.483, + -66.272 + ], + [ + -36.767, + -69.528 + ], + [ + -38.051, + -72.784 + ], + [ + -39.335, + -76.04 + ], + [ + -40.619, + -79.296 + ], + [ + -41.903, + -82.552 + ], + [ + -43.187, + -85.808 + ], + [ + -44.471, + -89.064 + ], + [ + -45.755, + -92.32 + ], + [ + -47.039, + -95.576 + ], + [ + -48.323, + -98.832 + ], + [ + -49.606, + -102.088 + ], + [ + -50.89, + -105.344 + ], + [ + -52.174, + -108.6 + ], + [ + -53.458, + -111.856 + ], + [ + -54.742, + -115.112 + ], + [ + -56.026, + -118.368 + ], + [ + -57.31, + -121.624 + ] + ] + }, + { + "type": "LineString", + "width": 1.4, + "coordinates": [ + [ + 40.974, + -25.008 + ], + [ + 44.474, + -25.002 + ], + [ + 47.974, + -24.995 + ], + [ + 51.474, + -24.988 + ], + [ + 54.974, + -24.982 + ], + [ + 58.474, + -24.975 + ], + [ + 61.974, + -24.968 + ], + [ + 65.474, + -24.962 + ], + [ + 68.974, + -24.955 + ], + [ + 72.474, + -24.948 + ], + [ + 75.974, + -24.942 + ], + [ + 79.474, + -24.935 + ], + [ + 82.974, + -24.928 + ], + [ + 86.474, + -24.922 + ], + [ + 89.974, + -24.915 + ], + [ + 93.474, + -24.909 + ], + [ + 96.974, + -24.902 + ], + [ + 100.474, + -24.895 + ], + [ + 103.974, + -24.889 + ], + [ + 107.474, + -24.882 + ] + ] + }, + { + "type": "LineString", + "width": 1.4, + "coordinates": [ + [ + 6.637, + -51.909 + ], + [ + 5.841, + -55.317 + ], + [ + 5.044, + -58.725 + ], + [ + 4.248, + -62.133 + ], + [ + 3.451, + -65.542 + ], + [ + 2.655, + -68.95 + ], + [ + 1.858, + -72.358 + ], + [ + 1.062, + -75.766 + ], + [ + 0.265, + -79.174 + ], + [ + -0.531, + -82.582 + ], + [ + -1.328, + -85.991 + ], + [ + -2.124, + -89.399 + ], + [ + -2.921, + -92.807 + ], + [ + -3.718, + -96.215 + ], + [ + -4.514, + -99.623 + ], + [ + -5.311, + -103.031 + ], + [ + -6.107, + -106.44 + ], + [ + -6.904, + -109.848 + ], + [ + -7.7, + -113.256 + ], + [ + -8.497, + -116.664 + ], + [ + -9.293, + -120.072 + ], + [ + -10.09, + -123.48 + ], + [ + -10.886, + -126.888 + ], + [ + -11.683, + -130.297 + ], + [ + -12.479, + -133.705 + ], + [ + -13.276, + -137.113 + ] + ] + }, + { + "type": "LineString", + "width": 1.4, + "coordinates": [ + [ + 107.474, + -24.882 + ], + [ + 110.974, + -24.875 + ], + [ + 114.419, + -25.491 + ], + [ + 117.77, + -26.502 + ], + [ + 121.057, + -27.704 + ], + [ + 124.262, + -29.111 + ], + [ + 127.346, + -30.765 + ], + [ + 130.306, + -32.634 + ], + [ + 133.193, + -34.612 + ], + [ + 136.011, + -36.688 + ], + [ + 138.727, + -38.895 + ], + [ + 141.366, + -41.195 + ], + [ + 144.08, + -43.405 + ], + [ + 146.811, + -45.594 + ], + [ + 149.494, + -47.841 + ], + [ + 152.128, + -50.146 + ], + [ + 154.731, + -52.485 + ] + ] + }, + { + "type": "LineString", + "width": 1.4, + "coordinates": [ + [ + -57.31, + -121.624 + ], + [ + -58.594, + -124.88 + ], + [ + -59.768, + -128.178 + ], + [ + -60.992, + -131.457 + ], + [ + -62.261, + -134.719 + ], + [ + -63.602, + -137.951 + ], + [ + -65.176, + -141.078 + ], + [ + -67.052, + -144.032 + ], + [ + -68.67, + -147.136 + ], + [ + -70.133, + -150.315 + ], + [ + -71.372, + -153.589 + ], + [ + -72.185, + -156.993 + ], + [ + -72.729, + -160.45 + ], + [ + -72.837, + -163.949 + ], + [ + -72.361, + -167.416 + ], + [ + -71.323, + -170.759 + ], + [ + -69.818, + -173.918 + ], + [ + -67.977, + -176.895 + ], + [ + -65.963, + -179.758 + ], + [ + -63.789, + -182.501 + ], + [ + -61.614, + -185.243 + ], + [ + -59.603, + -188.107 + ], + [ + -57.734, + -191.067 + ], + [ + -56.129, + -194.177 + ], + [ + -54.746, + -197.392 + ], + [ + -53.67, + -200.723 + ], + [ + -52.871, + -204.13 + ], + [ + -52.258, + -207.576 + ], + [ + -51.785, + -211.044 + ] + ] + }, + { + "type": "LineString", + "width": 1.4, + "coordinates": [ + [ + -13.276, + -137.113 + ], + [ + -14.072, + -140.521 + ], + [ + -14.774, + -143.95 + ], + [ + -15.274, + -147.414 + ], + [ + -15.603, + -150.899 + ], + [ + -15.892, + -154.387 + ], + [ + -16.272, + -157.866 + ], + [ + -16.79, + -161.327 + ], + [ + -17.361, + -164.781 + ], + [ + -17.982, + -168.225 + ], + [ + -18.65, + -171.661 + ], + [ + -19.34, + -175.092 + ], + [ + -20.029, + -178.524 + ], + [ + -20.682, + -181.962 + ], + [ + -21.33, + -185.402 + ], + [ + -21.955, + -188.845 + ], + [ + -22.528, + -192.298 + ], + [ + -23.045, + -195.76 + ], + [ + -23.309, + -199.25 + ], + [ + -23.384, + -202.749 + ], + [ + -23.387, + -206.249 + ], + [ + -23.334, + -209.749 + ] + ] + } + ] + }, + { + "type": "GeometryCollection", + "id": "planks", + "geometries": [] + }, + { + "type": "MultiPolygon", + "id": "water", + "coordinates": [ + [ + [ + [ + -15.6, + -39.066 + ], + [ + -25.212, + -40.224 + ], + [ + -34.146, + -39.953 + ], + [ + -43.331, + -36.907 + ], + [ + -52.567, + -33.973 + ], + [ + -60.779, + -28.854 + ], + [ + -65.124, + -20.516 + ], + [ + -62.693, + -11.259 + ], + [ + -61.928, + -1.578 + ], + [ + -61.131, + 8.097 + ], + [ + -58.669, + 17.361 + ], + [ + -59.271, + 27.068 + ], + [ + -62.331, + 36.247 + ], + [ + -65.391, + 45.425 + ], + [ + -68.393, + 54.595 + ], + [ + -68.284, + 64.366 + ], + [ + -64.465, + 73.295 + ], + [ + -59.827, + 81.858 + ], + [ + -52.965, + 88.818 + ], + [ + -46.051, + 95.732 + ], + [ + -39.045, + 102.542 + ], + [ + -30.84, + 107.684 + ], + [ + -22.05, + 111.345 + ], + [ + -13.744, + 109.895 + ], + [ + -6.771, + 103.047 + ], + [ + 1.81, + 98.44 + ], + [ + 9.83, + 93.033 + ], + [ + 18.506, + 88.625 + ], + [ + 28.083, + 87.062 + ], + [ + 35.247, + 80.46 + ], + [ + 42.232, + 73.626 + ], + [ + 50.458, + 68.509 + ], + [ + 55.294, + 60.393 + ], + [ + 55.409, + 50.619 + ], + [ + 53.158, + 41.32 + ], + [ + 52.705, + 31.743 + ], + [ + 55.39, + 22.518 + ], + [ + 52.316, + 13.402 + ], + [ + 46.457, + 5.715 + ], + [ + 39.498, + -1.148 + ], + [ + 31.316, + -6.299 + ], + [ + 26.209, + -14.533 + ], + [ + 19.295, + -21.448 + ], + [ + 12.38, + -28.362 + ], + [ + 4.274, + -33.615 + ], + [ + -5.027, + -35.853 + ], + [ + -6.519, + -35.853 + ] + ] + ] + ] + }, + { + "type": "MultiPoint", + "id": "extendable", + "coordinates": [ + [ + -208.6, + 208.6 + ], + [ + 208.6, + 208.6 + ], + [ + 208.6, + -208.6 + ], + [ + -208.6, + -208.6 + ] + ] + }, + { + "type": "MultiPolygon", + "id": "squares", + "coordinates": [ + [ + [ + [ + 31.214, + -6.464 + ], + [ + 31.573, + -6.676 + ], + [ + 34.309, + -8.952 + ], + [ + 36.633, + -11.622 + ], + [ + 38.496, + -14.629 + ], + [ + 39.858, + -17.91 + ], + [ + 40.69, + -21.394 + ], + [ + 40.974, + -25.008 + ], + [ + 40.704, + -28.674 + ], + [ + 39.886, + -32.314 + ], + [ + 38.537, + -35.851 + ], + [ + 36.686, + -39.208 + ], + [ + 34.372, + -42.315 + ], + [ + 31.645, + -45.106 + ], + [ + 28.564, + -47.52 + ], + [ + 25.192, + -49.507 + ], + [ + 21.604, + -51.024 + ], + [ + 17.874, + -52.039 + ], + [ + 14.082, + -52.53 + ], + [ + 10.31, + -52.486 + ], + [ + 6.637, + -51.909 + ], + [ + 3.142, + -50.811 + ], + [ + -0.1, + -49.215 + ], + [ + -3.021, + -47.156 + ], + [ + -5.558, + -44.676 + ], + [ + -7.657, + -41.83 + ], + [ + -9.274, + -38.677 + ], + [ + -9.812, + -37.018 + ], + [ + -6.519, + -35.853 + ], + [ + -5.027, + -35.853 + ], + [ + 4.274, + -33.615 + ], + [ + 12.38, + -28.362 + ], + [ + 19.295, + -21.448 + ], + [ + 26.209, + -14.533 + ] + ] + ] + ] + }, + { + "type": "MultiPolygon", + "id": "fields", + "coordinates": [ + [ + [ + [ + 38.923, + -100.633 + ], + [ + 42.493, + -98.383 + ], + [ + 47.152, + -95.275 + ], + [ + 51.81, + -92.167 + ], + [ + 56.469, + -89.059 + ], + [ + 61.127, + -85.952 + ], + [ + 65.785, + -82.844 + ], + [ + 70.444, + -79.736 + ], + [ + 74.955, + -78.582 + ], + [ + 79.094, + -82.354 + ], + [ + 83.233, + -86.126 + ], + [ + 87.372, + -89.898 + ], + [ + 91.511, + -93.67 + ], + [ + 95.65, + -97.442 + ], + [ + 99.789, + -101.214 + ], + [ + 103.928, + -104.987 + ], + [ + 108.067, + -108.759 + ], + [ + 112.206, + -112.531 + ], + [ + 116.345, + -116.303 + ], + [ + 120.484, + -120.075 + ], + [ + 124.623, + -123.847 + ], + [ + 128.762, + -127.619 + ], + [ + 132.901, + -131.391 + ], + [ + 137.04, + -135.163 + ], + [ + 137.009, + -139.089 + ], + [ + 133.017, + -143.017 + ], + [ + 128.891, + -146.802 + ], + [ + 124.636, + -150.442 + ], + [ + 120.257, + -153.931 + ], + [ + 115.759, + -157.265 + ], + [ + 111.147, + -160.441 + ], + [ + 106.428, + -163.454 + ], + [ + 101.607, + -166.301 + ], + [ + 96.69, + -168.979 + ], + [ + 91.682, + -171.483 + ], + [ + 86.59, + -173.812 + ], + [ + 81.424, + -175.974 + ], + [ + 76.223, + -178.051 + ], + [ + 71.023, + -180.128 + ], + [ + 68.762, + -175.356 + ], + [ + 66.685, + -170.155 + ], + [ + 64.608, + -164.955 + ], + [ + 62.532, + -159.754 + ], + [ + 60.455, + -154.553 + ], + [ + 58.378, + -149.353 + ], + [ + 56.301, + -144.152 + ], + [ + 54.225, + -138.951 + ], + [ + 52.148, + -133.751 + ], + [ + 50.071, + -128.55 + ], + [ + 47.994, + -123.349 + ], + [ + 45.917, + -118.149 + ], + [ + 43.841, + -112.948 + ], + [ + 41.764, + -107.747 + ], + [ + 39.687, + -102.547 + ] + ] + ], + [ + [ + [ + -94.847, + -69.582 + ], + [ + -89.761, + -71.926 + ], + [ + -84.676, + -74.27 + ], + [ + -79.59, + -76.614 + ], + [ + -74.504, + -78.958 + ], + [ + -69.673, + -81.636 + ], + [ + -66.073, + -85.925 + ], + [ + -62.472, + -90.214 + ], + [ + -58.872, + -94.504 + ], + [ + -61.059, + -99.317 + ], + [ + -63.83, + -104.183 + ], + [ + -66.602, + -109.05 + ], + [ + -69.373, + -113.916 + ], + [ + -72.144, + -118.782 + ], + [ + -74.915, + -123.648 + ], + [ + -77.686, + -128.515 + ], + [ + -80.457, + -133.381 + ], + [ + -83.228, + -138.247 + ], + [ + -86, + -143.114 + ], + [ + -88.771, + -147.98 + ], + [ + -91.542, + -152.846 + ], + [ + -94.341, + -157.607 + ], + [ + -99.109, + -154.671 + ], + [ + -103.775, + -151.577 + ], + [ + -108.335, + -148.327 + ], + [ + -112.766, + -144.902 + ], + [ + -117.073, + -141.324 + ], + [ + -121.258, + -137.604 + ], + [ + -125.315, + -133.746 + ], + [ + -129.24, + -129.753 + ], + [ + -133.028, + -125.63 + ], + [ + -136.676, + -121.381 + ], + [ + -140.161, + -116.998 + ], + [ + -143.486, + -112.492 + ], + [ + -146.725, + -107.924 + ], + [ + -144.379, + -104.316 + ], + [ + -139.794, + -101.101 + ], + [ + -135.209, + -97.885 + ], + [ + -130.624, + -94.67 + ], + [ + -126.039, + -91.455 + ], + [ + -121.454, + -88.24 + ], + [ + -116.869, + -85.024 + ], + [ + -112.284, + -81.809 + ], + [ + -107.699, + -78.594 + ], + [ + -103.114, + -75.379 + ], + [ + -98.529, + -72.164 + ] + ] + ], + [ + [ + [ + -124.137, + -25.289 + ], + [ + -121.167, + -30.036 + ], + [ + -118.197, + -34.784 + ], + [ + -115.227, + -39.531 + ], + [ + -112.257, + -44.279 + ], + [ + -109.287, + -49.026 + ], + [ + -106.317, + -53.774 + ], + [ + -103.347, + -58.521 + ], + [ + -100.377, + -63.269 + ], + [ + -101.255, + -67.236 + ], + [ + -105.84, + -70.451 + ], + [ + -110.425, + -73.666 + ], + [ + -115.01, + -76.881 + ], + [ + -119.595, + -80.097 + ], + [ + -124.18, + -83.312 + ], + [ + -128.765, + -86.527 + ], + [ + -133.35, + -89.742 + ], + [ + -137.383, + -90.011 + ], + [ + -140.335, + -85.253 + ], + [ + -143.098, + -80.383 + ], + [ + -145.667, + -75.409 + ], + [ + -148.039, + -70.338 + ], + [ + -150.209, + -65.176 + ], + [ + -152.176, + -59.934 + ], + [ + -153.924, + -54.613 + ], + [ + -155.441, + -49.223 + ], + [ + -156.745, + -43.778 + ], + [ + -157.834, + -38.286 + ], + [ + -158.777, + -32.766 + ], + [ + -155.418, + -30.309 + ], + [ + -149.889, + -29.421 + ], + [ + -144.36, + -28.534 + ], + [ + -138.83, + -27.647 + ], + [ + -133.301, + -26.759 + ], + [ + -127.772, + -25.872 + ] + ] + ], + [ + [ + [ + -108.837, + 130.388 + ], + [ + -109.183, + 124.799 + ], + [ + -109.528, + 119.209 + ], + [ + -109.873, + 113.62 + ], + [ + -110.218, + 108.031 + ], + [ + -110.564, + 102.441 + ], + [ + -110.909, + 96.852 + ], + [ + -111.254, + 91.263 + ], + [ + -111.6, + 85.673 + ], + [ + -111.945, + 80.084 + ], + [ + -112.29, + 74.495 + ], + [ + -112.636, + 68.905 + ], + [ + -112.981, + 63.316 + ], + [ + -113.326, + 57.727 + ], + [ + -113.671, + 52.137 + ], + [ + -114.017, + 46.548 + ], + [ + -114.362, + 40.958 + ], + [ + -116.26, + 36.032 + ], + [ + -120.806, + 34.653 + ], + [ + -126.169, + 36.264 + ], + [ + -131.533, + 37.875 + ], + [ + -136.896, + 39.485 + ], + [ + -142.259, + 41.096 + ], + [ + -147.623, + 42.707 + ], + [ + -152.986, + 44.318 + ], + [ + -158.35, + 45.928 + ], + [ + -163.713, + 47.539 + ], + [ + -169.076, + 49.15 + ], + [ + -170.839, + 52.731 + ], + [ + -169.436, + 58.152 + ], + [ + -168.159, + 63.604 + ], + [ + -167.011, + 69.085 + ], + [ + -165.99, + 74.591 + ], + [ + -165.099, + 80.119 + ], + [ + -164.353, + 85.669 + ], + [ + -163.751, + 91.236 + ], + [ + -163.28, + 96.816 + ], + [ + -162.897, + 102.403 + ], + [ + -162.551, + 107.992 + ], + [ + -162.206, + 113.581 + ], + [ + -161.861, + 119.171 + ], + [ + -161.516, + 124.76 + ], + [ + -161.17, + 130.35 + ], + [ + -158.639, + 133.465 + ], + [ + -153.049, + 133.119 + ], + [ + -147.46, + 132.774 + ], + [ + -141.871, + 132.429 + ], + [ + -136.281, + 132.083 + ], + [ + -130.692, + 131.738 + ], + [ + -125.103, + 131.393 + ], + [ + -119.513, + 131.048 + ], + [ + -113.924, + 130.702 + ] + ] + ], + [ + [ + [ + 77.468, + -73.296 + ], + [ + 79.878, + -68.241 + ], + [ + 82.287, + -63.186 + ], + [ + 84.697, + -58.13 + ], + [ + 87.106, + -53.075 + ], + [ + 89.516, + -48.02 + ], + [ + 91.925, + -42.965 + ], + [ + 94.335, + -37.91 + ], + [ + 98.397, + -36.573 + ], + [ + 103.764, + -38.172 + ], + [ + 109.131, + -39.771 + ], + [ + 114.498, + -41.369 + ], + [ + 119.865, + -42.968 + ], + [ + 125.232, + -44.567 + ], + [ + 130.598, + -46.165 + ], + [ + 135.965, + -47.764 + ], + [ + 141.332, + -49.363 + ], + [ + 146.699, + -50.962 + ], + [ + 152.066, + -52.56 + ], + [ + 157.433, + -54.159 + ], + [ + 162.8, + -55.758 + ], + [ + 162.345, + -60.362 + ], + [ + 160.237, + -65.55 + ], + [ + 157.851, + -70.615 + ], + [ + 155.218, + -75.554 + ], + [ + 152.344, + -80.357 + ], + [ + 149.236, + -85.014 + ], + [ + 145.88, + -89.496 + ], + [ + 142.263, + -93.771 + ], + [ + 138.534, + -97.948 + ], + [ + 134.762, + -102.087 + ], + [ + 130.99, + -106.226 + ], + [ + 127.218, + -110.365 + ], + [ + 123.445, + -114.504 + ], + [ + 119.34, + -111.456 + ], + [ + 115.201, + -107.684 + ], + [ + 111.062, + -103.912 + ], + [ + 106.923, + -100.139 + ], + [ + 102.784, + -96.367 + ], + [ + 98.645, + -92.595 + ], + [ + 94.506, + -88.823 + ], + [ + 90.367, + -85.051 + ], + [ + 86.228, + -81.279 + ], + [ + 82.089, + -77.507 + ], + [ + 77.95, + -73.735 + ] + ] + ] + ] + } + ] +} \ No newline at end of file diff --git a/tests/data_tests/vanilla/Village/PaletteVillageObj.json b/tests/data_tests/vanilla/Village/PaletteVillageObj.json new file mode 100644 index 0000000..b1b6d53 --- /dev/null +++ b/tests/data_tests/vanilla/Village/PaletteVillageObj.json @@ -0,0 +1,68 @@ +{ + "ground": [ + "#3E546C", + "#344359", + "#587489" + ], + "relief": "Hachures", + "sand": "#5E7080", + "plank": "#5F6C7F", + "roofLight": [ + "#546B8B" + ], + "roofStroke": "#2D3B4C", + "roofVariance": "0.1", + "roofSlope": "0.4", + "roofType": "Hip", + "road": "#63717F", + "largeRoad": "6.0", + "smallRoad": "2.0", + "outlineRoads": "Soft", + "mergeRoads": "true", + "fieldLight": [ + "#364759" + ], + "fieldFurrow": "#171B27", + "fieldVariance": "0.1", + "outlineFields": "None", + "waterShallow": "#1D2133", + "waterDeep": "#0E1119", + "waterTide": "#6B7B99", + "shallowBands": "5", + "tree": [ + "#273344" + ], + "thicket": "#1E2533", + "treeDetails": "#171B27", + "treeVariance": "0.2", + "treeShape": "Cotton", + "shadowColor": "#545054", + "shadowLength": "1.6", + "shadowAngle": "60", + "lights": "#B29A23", + "fontHeader": { + "italic": false, + "bold": false, + "face": null, + "size": 48, + "embedded": "def_font" + }, + "fontPopulation": { + "italic": false, + "bold": false, + "face": null, + "size": 24, + "embedded": "def_font" + }, + "fontNumber": { + "face": null, + "size": 24, + "bold": false, + "italic": false, + "embedded": "def_font" + }, + "ink": "#171B27", + "paper": "#667788", + "strokeNormal": "1.0", + "strokeThin": "0.5" +} \ No newline at end of file diff --git a/tests/data_tests/vanilla/mfcg/GeoObj.json b/tests/data_tests/vanilla/mfcg/GeoObj.json new file mode 100644 index 0000000..9a878ac --- /dev/null +++ b/tests/data_tests/vanilla/mfcg/GeoObj.json @@ -0,0 +1,8415 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": "values", + "roadWidth": 8, + "towerRadius": 7.6, + "wallThickness": 7.6, + "generator": "mfcg", + "version": "0.11.5", + "riverWidth": 31.054904070056466 + }, + { + "type": "Polygon", + "id": "earth", + "coordinates": [ + [ + [ + 1394.505, + -574.431 + ], + [ + 1274.433, + -897.13 + ], + [ + 1282.685, + -901.37 + ], + [ + 1338.872, + -1347.107 + ], + [ + 1097.99, + -1387.519 + ], + [ + 1041.965, + -1353.534 + ], + [ + 942.734, + -1372.002 + ], + [ + 732.522, + -1648.524 + ], + [ + 496.187, + -1463.07 + ], + [ + 377.31, + -1699.833 + ], + [ + 70.469, + -1572.169 + ], + [ + -45.66, + -1686.321 + ], + [ + -45.843, + -1686.806 + ], + [ + -640.947, + -1992.88 + ], + [ + -496.005, + -1574.219 + ], + [ + -508.275, + -1409.289 + ], + [ + -868.241, + -1466.401 + ], + [ + -869.215, + -1462.934 + ], + [ + -1100.3, + -1280.753 + ], + [ + -1128.309, + -1282.961 + ], + [ + -1371.918, + -1047.354 + ], + [ + -1530.711, + -1040.406 + ], + [ + -1701.099, + -815.547 + ], + [ + -1781.429, + -763.434 + ], + [ + -1628.43, + -487.358 + ], + [ + -1576.887, + -324.132 + ], + [ + -1675.533, + -173.032 + ], + [ + -1599.433, + 141.302 + ], + [ + -1646.994, + 186.487 + ], + [ + -1703.857, + 551.538 + ], + [ + -1795.632, + 641.733 + ], + [ + -1794.37, + 714.745 + ], + [ + -1442.291, + 1022.839 + ], + [ + -1455.791, + 1315.293 + ], + [ + -1122.349, + 1196.404 + ], + [ + -757.194, + 1357.163 + ], + [ + -1141.903, + 1615.866 + ], + [ + -756.199, + 1794.091 + ], + [ + -623.427, + 1667.481 + ], + [ + -398.478, + 1748.874 + ], + [ + -391.037, + 1857.782 + ], + [ + -27.311, + 2060.355 + ], + [ + 170.694, + 1880.187 + ], + [ + 163.363, + 1752.568 + ], + [ + 276.234, + 1724.261 + ], + [ + 563.12, + 1754.122 + ], + [ + 670.59, + 1671.708 + ], + [ + 920.994, + 1680.376 + ], + [ + 990.513, + 1446.534 + ], + [ + 1233.149, + 1502.321 + ], + [ + 1294.982, + 1245.799 + ], + [ + 1362.382, + 1186.186 + ], + [ + 1700.746, + 1159.936 + ], + [ + 1701.502, + 1059.053 + ], + [ + 1788.552, + 799.226 + ], + [ + 1720.845, + 709.281 + ], + [ + 1662.083, + 401.379 + ], + [ + 1926.928, + 148.794 + ], + [ + 1716.886, + 25.179 + ], + [ + 1645.295, + -293.464 + ], + [ + 1644.041, + -293.678 + ], + [ + 1530.439, + -632.238 + ] + ] + ] + }, + { + "type": "GeometryCollection", + "id": "roads", + "geometries": [ + { + "type": "LineString", + "width": 8, + "coordinates": [ + [ + -46.605, + 13.374 + ], + [ + -95.46, + 47.374 + ], + [ + -141.172, + 55.184 + ], + [ + -185.172, + 78.607 + ], + [ + -234.838, + 135.376 + ], + [ + -313.597, + 225.605 + ], + [ + -429.366, + 330.44 + ], + [ + -567.078, + 406.616 + ], + [ + -710.636, + 410.977 + ], + [ + -869.731, + 361.061 + ], + [ + -1059.835, + 332.922 + ], + [ + -1227.625, + 419.434 + ], + [ + -1351.29, + 599.713 + ], + [ + -1703.857, + 551.538 + ] + ] + }, + { + "type": "LineString", + "width": 8, + "coordinates": [ + [ + -46.605, + 13.374 + ], + [ + -12.655, + 86.911 + ], + [ + 5.444, + 148.845 + ], + [ + 0.098, + 232.177 + ], + [ + -24.599, + 329.25 + ], + [ + -68.941, + 420.864 + ], + [ + -108.366, + 498.29 + ], + [ + -108.749, + 582.497 + ], + [ + -82.1, + 715.531 + ], + [ + -53.84, + 901.977 + ], + [ + -25.301, + 1087.745 + ], + [ + -16.446, + 1231.301 + ], + [ + -44.594, + 1343.306 + ], + [ + 163.363, + 1752.568 + ] + ] + } + ] + }, + { + "type": "GeometryCollection", + "id": "walls", + "geometries": [ + { + "type": "Polygon", + "width": 7.6, + "coordinates": [ + [ + [ + 38.753, + -4.011 + ], + [ + 72.478, + -51.614 + ], + [ + 47.345, + -96.742 + ], + [ + -59.653, + -84.786 + ], + [ + -37.113, + -12.5 + ], + [ + 0.348, + -5.127 + ] + ] + ] + } + ] + }, + { + "type": "GeometryCollection", + "id": "rivers", + "geometries": [ + { + "type": "LineString", + "width": 31.054904070056466, + "coordinates": [ + [ + -1442.291, + 1022.839 + ], + [ + -1345.032, + 887.476 + ], + [ + -1243.322, + 748.377 + ], + [ + -1144.306, + 655.966 + ], + [ + -1079.232, + 534.801 + ], + [ + -1059.835, + 332.922 + ], + [ + -1000.551, + 140.576 + ], + [ + -831.27, + 43.01 + ], + [ + -637.318, + 11.028 + ], + [ + -507.64, + -29.201 + ], + [ + -418.362, + -65.003 + ], + [ + -323.779, + -79.203 + ], + [ + -236.941, + -96.022 + ], + [ + -170.192, + -85.882 + ], + [ + -110.316, + -36.802 + ], + [ + -46.605, + 13.374 + ], + [ + 12.575, + 38.498 + ], + [ + 53.218, + 49.063 + ], + [ + 85.613, + 32.918 + ], + [ + 110.663, + -14.451 + ], + [ + 132.027, + -48.465 + ], + [ + 175.531, + -68.551 + ], + [ + 260.991, + -95.964 + ], + [ + 340.059, + -152.086 + ], + [ + 379.588, + -247.575 + ], + [ + 422.559, + -355.08 + ], + [ + 471.096, + -491.161 + ], + [ + 583.943, + -681.437 + ], + [ + 802.982, + -834.287 + ], + [ + 1037.902, + -885.386 + ], + [ + 1274.433, + -897.13 + ] + ] + } + ] + }, + { + "type": "GeometryCollection", + "id": "planks", + "geometries": [ + { + "type": "LineString", + "width": 4.8, + "coordinates": [ + [ + 6.539, + 55.379 + ], + [ + 18.61, + 21.617 + ] + ] + }, + { + "type": "LineString", + "width": 4.8, + "coordinates": [ + [ + -236.162, + -78.111 + ], + [ + -237.72, + -113.932 + ] + ] + }, + { + "type": "LineString", + "width": 4.8, + "coordinates": [ + [ + -320.757, + -61.532 + ], + [ + -326.8, + -96.874 + ] + ] + } + ] + }, + { + "type": "MultiPolygon", + "id": "buildings", + "coordinates": [ + [ + [ + [ + -8.504, + 81.758 + ], + [ + 7.411, + 72.614 + ], + [ + -3.398, + 53.8 + ], + [ + -19.313, + 62.945 + ] + ] + ], + [ + [ + [ + 19.676, + -77.953 + ], + [ + -13.314, + -74.267 + ], + [ + -11.672, + -59.571 + ], + [ + -28.525, + -57.688 + ], + [ + -26.753, + -41.829 + ], + [ + 7.975, + -45.709 + ], + [ + 9.742, + -29.893 + ], + [ + 40.398, + -33.318 + ], + [ + 36.858, + -64.993 + ], + [ + 21.318, + -63.257 + ] + ] + ], + [ + [ + [ + -50.07, + -22.681 + ], + [ + -53.411, + -33.396 + ], + [ + -59.363, + -31.54 + ], + [ + -56.022, + -20.825 + ] + ] + ], + [ + [ + [ + -57.047, + -47.537 + ], + [ + -74.676, + -34.608 + ], + [ + -70.888, + -31.625 + ], + [ + -64.925, + -35.998 + ], + [ + -60.655, + -30.593 + ], + [ + -53.418, + -35.9 + ] + ] + ], + [ + [ + [ + -87.846, + -68.425 + ], + [ + -102.122, + -56.369 + ], + [ + -97.584, + -52.648 + ], + [ + -88.062, + -45.15 + ], + [ + -77.447, + -56.112 + ] + ] + ], + [ + [ + [ + -74.676, + -34.608 + ], + [ + -65.172, + -41.577 + ], + [ + -70.256, + -47.597 + ], + [ + -73.821, + -44.512 + ], + [ + -81.244, + -52.191 + ], + [ + -88.062, + -45.15 + ] + ] + ], + [ + [ + [ + -65.172, + -41.577 + ], + [ + -57.047, + -47.537 + ], + [ + -59.153, + -54.291 + ], + [ + -64.623, + -50.863 + ], + [ + -68.458, + -57.729 + ], + [ + -75.49, + -53.795 + ] + ] + ], + [ + [ + [ + -75.49, + -53.795 + ], + [ + -61.448, + -61.651 + ], + [ + -63.664, + -68.759 + ], + [ + -80.377, + -59.581 + ] + ] + ], + [ + [ + [ + -80.377, + -59.581 + ], + [ + -64.175, + -68.478 + ], + [ + -69.032, + -77.324 + ], + [ + -85.234, + -68.427 + ] + ] + ], + [ + [ + [ + -104.073, + -83.381 + ], + [ + -94.23, + -69.316 + ], + [ + -81.244, + -80.283 + ], + [ + -86.22, + -86.467 + ], + [ + -92.103, + -81.608 + ], + [ + -97.455, + -88.706 + ] + ] + ], + [ + [ + [ + -80.919, + -102.011 + ], + [ + -91.729, + -93.314 + ], + [ + -89.275, + -90.264 + ], + [ + -82.54, + -95.684 + ], + [ + -77.817, + -89.814 + ], + [ + -73.743, + -93.092 + ] + ] + ], + [ + [ + [ + -83.5, + -100.724 + ], + [ + -89.42, + -107.142 + ], + [ + -92.361, + -104.428 + ], + [ + -88.978, + -100.761 + ], + [ + -92.732, + -97.298 + ], + [ + -90.194, + -94.548 + ] + ] + ], + [ + [ + [ + -110.091, + -107.819 + ], + [ + -117.505, + -107.902 + ], + [ + -117.564, + -102.66 + ], + [ + -110.15, + -102.577 + ] + ] + ], + [ + [ + [ + -132.098, + -82.61 + ], + [ + -123.225, + -90.789 + ], + [ + -132.216, + -103.131 + ], + [ + -141.753, + -97.703 + ], + [ + -136.644, + -92.817 + ], + [ + -140.993, + -89.902 + ] + ] + ], + [ + [ + [ + -114.734, + -98.617 + ], + [ + -122.774, + -110.106 + ], + [ + -128.291, + -106.966 + ], + [ + -121.958, + -98.126 + ], + [ + -126.129, + -94.777 + ], + [ + -123.225, + -90.789 + ] + ] + ], + [ + [ + [ + -121.746, + -76.314 + ], + [ + -107.997, + -88.989 + ], + [ + -114.734, + -98.617 + ], + [ + -120.876, + -92.955 + ], + [ + -115.674, + -86.961 + ], + [ + -124.646, + -78.69 + ] + ] + ], + [ + [ + [ + -107.997, + -88.989 + ], + [ + -123.962, + -74.271 + ], + [ + -113.689, + -65.85 + ], + [ + -100.386, + -78.114 + ] + ] + ], + [ + [ + [ + -95.423, + -71.021 + ], + [ + -100.386, + -78.114 + ], + [ + -112.534, + -66.915 + ], + [ + -106.318, + -61.82 + ] + ] + ], + [ + [ + [ + -73.487, + 205.844 + ], + [ + -57.156, + 223.324 + ], + [ + -46.909, + 212.208 + ], + [ + -51.533, + 207.02 + ], + [ + -57.036, + 212.236 + ], + [ + -67.108, + 201.214 + ] + ] + ], + [ + [ + [ + -72.703, + 167.733 + ], + [ + -91.039, + 174.025 + ], + [ + -87.67, + 181.378 + ], + [ + -81.693, + 178.838 + ], + [ + -78.194, + 186.209 + ], + [ + -66.332, + 180.096 + ] + ] + ], + [ + [ + [ + -81.548, + 194.739 + ], + [ + -73.487, + 205.844 + ], + [ + -58.622, + 195.055 + ], + [ + -66.332, + 180.096 + ], + [ + -84.069, + 189.237 + ] + ] + ], + [ + [ + [ + -71.187, + 170.675 + ], + [ + -62.641, + 187.257 + ], + [ + -53.249, + 183.255 + ], + [ + -55.624, + 176.335 + ], + [ + -59.928, + 177.999 + ], + [ + -63.974, + 168.2 + ] + ] + ], + [ + [ + [ + -47.091, + 161.586 + ], + [ + -59.253, + 165.759 + ], + [ + -53.249, + 183.255 + ], + [ + -48.115, + 181.067 + ], + [ + -51.91, + 170.005 + ], + [ + -45.075, + 167.462 + ] + ] + ], + [ + [ + [ + -22.289, + 180.477 + ], + [ + -0.682, + 181.863 + ], + [ + -0.086, + 172.57 + ], + [ + -23.843, + 175.948 + ] + ] + ], + [ + [ + [ + -30.468, + 156.643 + ], + [ + -23.843, + 175.948 + ], + [ + -12.423, + 174.325 + ], + [ + -16.199, + 158.675 + ], + [ + -22.806, + 160.586 + ], + [ + -24.552, + 154.613 + ] + ] + ], + [ + [ + [ + -18.148, + 150.597 + ], + [ + -12.423, + 174.325 + ], + [ + -7.984, + 173.253 + ], + [ + -9.598, + 166.567 + ], + [ + -3.309, + 165.049 + ], + [ + -7.421, + 148.009 + ] + ] + ], + [ + [ + [ + -1.726, + 198.134 + ], + [ + -0.682, + 181.863 + ], + [ + -15.833, + 180.892 + ], + [ + -15.932, + 191.503 + ], + [ + -6.32, + 191.512 + ], + [ + -6.622, + 198.355 + ] + ] + ], + [ + [ + [ + -24.466, + 207.641 + ], + [ + -2.427, + 209.055 + ], + [ + -1.726, + 198.134 + ], + [ + -25.798, + 199.219 + ] + ] + ], + [ + [ + [ + -46.734, + 162.626 + ], + [ + -40.628, + 180.42 + ], + [ + -24.239, + 174.795 + ], + [ + -26.829, + 167.247 + ], + [ + -34.348, + 169.827 + ], + [ + -37.863, + 159.582 + ] + ] + ], + [ + [ + [ + -30.294, + 241.06 + ], + [ + -8.264, + 248.824 + ], + [ + -7.137, + 244.393 + ], + [ + -21.76, + 239.922 + ], + [ + -19.905, + 231.824 + ], + [ + -27.971, + 230.112 + ] + ] + ], + [ + [ + [ + -27.971, + 230.112 + ], + [ + -8.06, + 234.337 + ], + [ + -6.104, + 225.118 + ], + [ + -26.015, + 220.894 + ] + ] + ], + [ + [ + [ + -2.427, + 209.055 + ], + [ + -23.22, + 207.721 + ], + [ + -24.423, + 213.393 + ], + [ + -17.717, + 214.046 + ], + [ + -18.984, + 221.863 + ], + [ + -3.386, + 224.012 + ] + ] + ], + [ + [ + [ + -45.186, + 227.724 + ], + [ + -34.364, + 234.306 + ], + [ + -25.912, + 220.411 + ], + [ + -28.738, + 218.692 + ], + [ + -34.024, + 227.384 + ], + [ + -42.02, + 222.52 + ] + ] + ], + [ + [ + [ + -41.963, + 239.985 + ], + [ + -49.409, + 258.047 + ], + [ + -40.902, + 260.895 + ], + [ + -37.583, + 252.203 + ], + [ + -26.274, + 256.711 + ], + [ + -23.563, + 248.61 + ] + ] + ], + [ + [ + [ + -42.714, + 241.807 + ], + [ + -51.488, + 236.47 + ], + [ + -54.76, + 241.664 + ], + [ + -52.006, + 243.36 + ], + [ + -59.515, + 256.701 + ], + [ + -51.052, + 262.033 + ] + ] + ], + [ + [ + [ + -62.893, + 254.573 + ], + [ + -51.783, + 236.938 + ], + [ + -59.873, + 231.841 + ], + [ + -63.313, + 237.3 + ], + [ + -68.994, + 233.72 + ], + [ + -76.665, + 245.897 + ] + ] + ], + [ + [ + [ + -99.513, + 212.362 + ], + [ + -83.254, + 200.56 + ], + [ + -90.146, + 187.498 + ], + [ + -100.729, + 193.043 + ], + [ + -98.299, + 197.669 + ], + [ + -105.122, + 201.656 + ] + ] + ], + [ + [ + [ + -113.58, + 185.511 + ], + [ + -107.717, + 196.703 + ], + [ + -91.028, + 187.96 + ], + [ + -95.061, + 179.157 + ] + ] + ], + [ + [ + [ + -115.246, + 182.331 + ], + [ + -132.566, + 188.274 + ], + [ + -120.53, + 211.032 + ], + [ + -104.618, + 202.617 + ], + [ + -107.029, + 198.015 + ], + [ + -113.684, + 201.236 + ], + [ + -119.053, + 191.031 + ], + [ + -112.121, + 188.296 + ] + ] + ], + [ + [ + [ + -147.341, + 240.313 + ], + [ + -133.304, + 248.538 + ], + [ + -123.967, + 232.604 + ], + [ + -134.322, + 226.537 + ], + [ + -139.916, + 236.085 + ], + [ + -143.6, + 233.927 + ] + ] + ], + [ + [ + [ + -138.476, + 210.906 + ], + [ + -123.93, + 204.602 + ], + [ + -130.889, + 191.444 + ], + [ + -143.652, + 195.823 + ] + ] + ], + [ + [ + [ + -114.191, + 223.017 + ], + [ + -123.93, + 204.602 + ], + [ + -137.439, + 211.746 + ], + [ + -134.712, + 216.902 + ], + [ + -126.483, + 212.55 + ], + [ + -119.471, + 225.809 + ] + ] + ], + [ + [ + [ + -78.145, + 211.989 + ], + [ + -88.974, + 221.513 + ], + [ + -75.503, + 236.83 + ], + [ + -71.241, + 233.082 + ], + [ + -79.918, + 223.217 + ], + [ + -73.35, + 217.441 + ] + ] + ], + [ + [ + [ + -76.199, + 210.278 + ], + [ + -83.254, + 200.56 + ], + [ + -96.293, + 210.024 + ], + [ + -87.403, + 220.132 + ] + ] + ], + [ + [ + [ + -117.621, + 255.345 + ], + [ + -149.066, + 239.303 + ], + [ + -152.622, + 245.373 + ], + [ + -142.887, + 249.769 + ], + [ + -145.359, + 254.702 + ], + [ + -120.122, + 264.987 + ] + ] + ], + [ + [ + [ + -159.5, + 260.94 + ], + [ + -145.796, + 268.969 + ], + [ + -139.865, + 256.941 + ], + [ + -153.824, + 251.252 + ] + ] + ], + [ + [ + [ + -7.719, + 125.446 + ], + [ + -22.677, + 130.579 + ], + [ + -18.794, + 141.897 + ], + [ + -12.15, + 139.618 + ], + [ + -13.706, + 134.75 + ], + [ + -5.793, + 132.035 + ] + ] + ], + [ + [ + [ + -13.614, + 113.527 + ], + [ + -26.957, + 118.106 + ], + [ + -22.677, + 130.579 + ], + [ + -16.421, + 128.433 + ], + [ + -18.295, + 122.54 + ], + [ + -11.647, + 120.259 + ] + ] + ], + [ + [ + [ + -19.169, + 140.802 + ], + [ + -22.205, + 131.957 + ], + [ + -40.659, + 138.289 + ], + [ + -37.624, + 147.135 + ] + ] + ], + [ + [ + [ + -28.387, + 118.597 + ], + [ + -9.461, + 112.102 + ], + [ + -12.858, + 100.475 + ], + [ + -26.145, + 105.035 + ], + [ + -24.253, + 110.822 + ], + [ + -30.339, + 112.91 + ] + ] + ], + [ + [ + [ + -15.809, + 90.378 + ], + [ + -35.725, + 97.212 + ], + [ + -32.314, + 107.152 + ], + [ + -27.372, + 105.456 + ], + [ + -29.35, + 99.46 + ], + [ + -20.349, + 96.371 + ], + [ + -18.496, + 102.41 + ], + [ + -12.858, + 100.475 + ] + ] + ], + [ + [ + [ + -40.274, + 83.957 + ], + [ + -35.725, + 97.212 + ], + [ + -26.053, + 93.893 + ], + [ + -29.112, + 84.977 + ], + [ + -21.454, + 82.349 + ], + [ + -22.943, + 78.01 + ] + ] + ], + [ + [ + [ + -56.295, + 92.722 + ], + [ + -45.412, + 124.439 + ], + [ + -28.387, + 118.597 + ], + [ + -39.33, + 86.708 + ] + ] + ], + [ + [ + [ + -57.69, + 88.657 + ], + [ + -81.812, + 97.208 + ], + [ + -78.134, + 111.589 + ], + [ + -71.125, + 109.184 + ], + [ + -73.16, + 101.908 + ], + [ + -55.282, + 95.673 + ] + ] + ], + [ + [ + [ + -71.405, + 124.368 + ], + [ + -62.928, + 121.46 + ], + [ + -67.56, + 107.961 + ], + [ + -74.951, + 110.497 + ] + ] + ], + [ + [ + [ + -72.21, + 124.645 + ], + [ + -68.153, + 140.511 + ], + [ + -42.873, + 131.836 + ], + [ + -46.166, + 122.24 + ], + [ + -64.249, + 128.445 + ], + [ + -65.908, + 122.482 + ] + ] + ], + [ + [ + [ + -36.553, + 150.254 + ], + [ + -42.873, + 131.836 + ], + [ + -57.325, + 136.795 + ], + [ + -51.005, + 155.213 + ] + ] + ], + [ + [ + [ + -70.531, + 141.326 + ], + [ + -65.692, + 160.252 + ], + [ + -51.005, + 155.213 + ], + [ + -57.325, + 136.795 + ] + ] + ], + [ + [ + [ + -59.705, + 60.264 + ], + [ + -48.745, + 80.394 + ], + [ + -39.284, + 77.04 + ], + [ + -42.73, + 69.327 + ], + [ + -46.005, + 70.715 + ], + [ + -52.789, + 56.498 + ] + ] + ], + [ + [ + [ + -38.018, + 48.456 + ], + [ + -49.307, + 54.603 + ], + [ + -42.831, + 69.1 + ], + [ + -36.991, + 66.705 + ], + [ + -33.873, + 73.568 + ], + [ + -27.472, + 71.299 + ] + ] + ], + [ + [ + [ + -35.458, + 47.062 + ], + [ + -40.851, + 35.379 + ], + [ + -53.395, + 42.208 + ], + [ + -50.594, + 47.352 + ], + [ + -44.535, + 44.054 + ], + [ + -41.398, + 50.296 + ] + ] + ], + [ + [ + [ + -71.937, + 37.799 + ], + [ + -65.845, + 48.987 + ], + [ + -42.228, + 36.129 + ], + [ + -48.32, + 24.941 + ] + ] + ], + [ + [ + [ + -66.529, + 86.698 + ], + [ + -48.745, + 80.394 + ], + [ + -52.059, + 74.307 + ], + [ + -62.14, + 78.348 + ], + [ + -64.264, + 73.42 + ], + [ + -70.285, + 76.102 + ] + ] + ], + [ + [ + [ + -74.879, + 63.142 + ], + [ + -89.101, + 68.699 + ], + [ + -86.103, + 80.424 + ], + [ + -79.423, + 78.056 + ], + [ + -81.476, + 71.184 + ], + [ + -73.137, + 68.058 + ] + ] + ], + [ + [ + [ + -83.005, + 92.538 + ], + [ + -66.529, + 86.698 + ], + [ + -70.69, + 74.961 + ], + [ + -86.103, + 80.424 + ] + ] + ], + [ + [ + [ + -61.075, + 57.748 + ], + [ + -72.696, + 36.405 + ], + [ + -84.795, + 44.826 + ], + [ + -82.12, + 49.859 + ], + [ + -74.617, + 45.331 + ], + [ + -66.725, + 59.955 + ] + ] + ], + [ + [ + [ + -86.568, + 67.709 + ], + [ + -75.028, + 63.2 + ], + [ + -83.876, + 46.555 + ], + [ + -90.753, + 51.34 + ] + ] + ], + [ + [ + [ + -144.063, + 137.845 + ], + [ + -128.849, + 132.627 + ], + [ + -133.061, + 120.346 + ], + [ + -149.249, + 125.897 + ] + ] + ], + [ + [ + [ + -137.357, + 151.557 + ], + [ + -123.935, + 146.954 + ], + [ + -128.849, + 132.627 + ], + [ + -143.406, + 137.62 + ] + ] + ], + [ + [ + [ + -133.266, + 119.75 + ], + [ + -129.187, + 131.642 + ], + [ + -112.98, + 126.083 + ], + [ + -115.494, + 118.753 + ], + [ + -121.704, + 120.883 + ], + [ + -123.269, + 116.321 + ] + ] + ], + [ + [ + [ + -123.773, + 146.898 + ], + [ + -141.14, + 152.855 + ], + [ + -135.168, + 166.615 + ], + [ + -118.922, + 161.043 + ] + ] + ], + [ + [ + [ + -114.174, + 174.886 + ], + [ + -118.922, + 161.043 + ], + [ + -127.616, + 164.025 + ], + [ + -124.102, + 172.868 + ], + [ + -129.489, + 174.716 + ], + [ + -127.44, + 179.438 + ] + ] + ], + [ + [ + [ + -98.638, + 167.901 + ], + [ + -101.954, + 158.231 + ], + [ + -109.003, + 160.648 + ], + [ + -106.932, + 166.687 + ], + [ + -115.928, + 169.773 + ], + [ + -114.682, + 173.407 + ] + ] + ], + [ + [ + [ + -98.699, + 167.722 + ], + [ + -82.592, + 162.195 + ], + [ + -90.227, + 139.934 + ], + [ + -100.787, + 143.556 + ], + [ + -96.035, + 157.411 + ], + [ + -101.583, + 159.314 + ] + ] + ], + [ + [ + [ + -81.409, + 165.645 + ], + [ + -70.246, + 161.815 + ], + [ + -73.632, + 148.575 + ], + [ + -79.944, + 150.74 + ], + [ + -77.822, + 157.809 + ], + [ + -83.436, + 159.735 + ] + ] + ], + [ + [ + [ + -77.001, + 135.398 + ], + [ + -90.227, + 139.934 + ], + [ + -85.829, + 152.758 + ], + [ + -81.598, + 151.307 + ], + [ + -84.171, + 143.065 + ], + [ + -75.777, + 140.186 + ] + ] + ], + [ + [ + [ + -83.459, + 118.993 + ], + [ + -94.136, + 122.655 + ], + [ + -88.422, + 139.315 + ], + [ + -79.082, + 136.112 + ] + ] + ], + [ + [ + [ + -117.887, + 111.776 + ], + [ + -112.049, + 128.799 + ], + [ + -98.137, + 124.027 + ], + [ + -103.975, + 107.004 + ] + ] + ], + [ + [ + [ + -103.46, + 108.505 + ], + [ + -98.137, + 124.027 + ], + [ + -92.624, + 122.136 + ], + [ + -95.256, + 113.66 + ], + [ + -85.261, + 110.232 + ], + [ + -87.135, + 102.905 + ] + ] + ], + [ + [ + [ + -119.835, + 57.251 + ], + [ + -115.743, + 73.116 + ], + [ + -108.813, + 70.707 + ], + [ + -110.854, + 62.773 + ], + [ + -98.799, + 59.756 + ], + [ + -100.293, + 53.912 + ] + ] + ], + [ + [ + [ + -119.614, + 58.11 + ], + [ + -128.88, + 59.693 + ], + [ + -124.622, + 76.202 + ], + [ + -115.743, + 73.116 + ] + ] + ], + [ + [ + [ + -139.862, + 59.019 + ], + [ + -143.018, + 60.699 + ], + [ + -134.568, + 79.659 + ], + [ + -124.622, + 76.202 + ], + [ + -129.51, + 57.25 + ] + ] + ], + [ + [ + [ + -100.422, + 98.449 + ], + [ + -103.724, + 88.948 + ], + [ + -126.846, + 96.985 + ], + [ + -124.099, + 103.146 + ], + [ + -108.969, + 97.934 + ], + [ + -107.812, + 100.984 + ] + ] + ], + [ + [ + [ + -99.719, + 100.47 + ], + [ + -87.043, + 96.123 + ], + [ + -91.69, + 77.951 + ], + [ + -105.837, + 82.868 + ] + ] + ], + [ + [ + [ + -98.055, + 66.968 + ], + [ + -109.929, + 71.095 + ], + [ + -108.607, + 74.899 + ], + [ + -102.531, + 72.787 + ], + [ + -100.115, + 80.879 + ], + [ + -94.957, + 79.086 + ] + ] + ], + [ + [ + [ + -155.529, + 70.84 + ], + [ + -149.443, + 84.496 + ], + [ + -135.234, + 78.163 + ], + [ + -138.578, + 70.66 + ], + [ + -146.282, + 74.431 + ], + [ + -149.349, + 67.55 + ] + ] + ], + [ + [ + [ + -166.709, + 89.203 + ], + [ + -150.554, + 82.003 + ], + [ + -156.241, + 69.244 + ], + [ + -171.781, + 77.517 + ] + ] + ], + [ + [ + [ + -163.596, + 101.112 + ], + [ + -145.61, + 93.096 + ], + [ + -150.554, + 82.003 + ], + [ + -168.431, + 89.97 + ] + ] + ], + [ + [ + [ + -138.71, + 111.915 + ], + [ + -146.851, + 93.649 + ], + [ + -152.666, + 96.24 + ], + [ + -148.44, + 105.826 + ], + [ + -156.283, + 108.877 + ], + [ + -152.858, + 116.767 + ] + ] + ], + [ + [ + [ + -123.276, + 104.993 + ], + [ + -131.401, + 86.763 + ], + [ + -138.606, + 89.974 + ], + [ + -134.864, + 98.368 + ], + [ + -143.266, + 101.692 + ], + [ + -139.34, + 110.503 + ] + ] + ], + [ + [ + [ + -178.345, + 153.766 + ], + [ + -173.139, + 141.306 + ], + [ + -158.818, + 125.506 + ], + [ + -168.952, + 129.904 + ], + [ + -171.848, + 137.499 + ], + [ + -183.002, + 145.49 + ] + ] + ], + [ + [ + [ + -206.919, + 142.709 + ], + [ + -201.194, + 129.005 + ], + [ + -211.624, + 119.88 + ], + [ + -224.992, + 135.158 + ] + ] + ], + [ + [ + [ + -169.961, + 102.82 + ], + [ + -174.744, + 91.798 + ], + [ + -187.835, + 99.665 + ], + [ + -184.967, + 103.228 + ], + [ + -179.666, + 100.11 + ], + [ + -175.887, + 106.161 + ] + ] + ], + [ + [ + [ + -199.856, + 107.741 + ], + [ + -193.789, + 116.251 + ], + [ + -185.809, + 111.753 + ], + [ + -189.065, + 107.553 + ], + [ + -184.339, + 104.009 + ], + [ + -190.209, + 96.714 + ] + ] + ], + [ + [ + [ + -147.002, + 151.405 + ], + [ + -154.833, + 133.361 + ], + [ + -168.637, + 139.353 + ], + [ + -165.121, + 147.454 + ], + [ + -160.366, + 145.39 + ], + [ + -156.051, + 155.332 + ] + ] + ], + [ + [ + [ + -142.581, + 163.073 + ], + [ + -154.348, + 168.179 + ], + [ + -148.118, + 186.333 + ], + [ + -142.337, + 184.35 + ], + [ + -147.149, + 171.763 + ], + [ + -140.049, + 168.905 + ] + ] + ], + [ + [ + [ + -190.915, + -40.169 + ], + [ + -173.061, + -61.95 + ], + [ + -194.928, + -69.079 + ], + [ + -196.716, + -61.514 + ], + [ + -186.034, + -58.183 + ], + [ + -195.274, + -41.199 + ] + ] + ], + [ + [ + [ + -195.687, + -65.868 + ], + [ + -208.881, + -67.872 + ], + [ + -214.132, + -45.656 + ], + [ + -201.187, + -42.597 + ] + ] + ], + [ + [ + [ + -208.123, + -71.083 + ], + [ + -224.932, + -73.637 + ], + [ + -227.115, + -64.398 + ], + [ + -210.624, + -60.5 + ] + ] + ], + [ + [ + [ + -184.341, + -21.926 + ], + [ + -160.185, + -51.395 + ], + [ + -167.831, + -57.663 + ], + [ + -191.987, + -28.193 + ] + ] + ], + [ + [ + [ + -235.471, + -10.273 + ], + [ + -211.077, + -4.507 + ], + [ + -207.86, + -18.118 + ], + [ + -214.352, + -19.652 + ], + [ + -216.395, + -11.008 + ], + [ + -234.297, + -15.239 + ] + ] + ], + [ + [ + [ + -232.302, + -23.895 + ], + [ + -221.421, + -21.323 + ], + [ + -217.455, + -38.103 + ], + [ + -223.57, + -39.548 + ], + [ + -225.308, + -32.194 + ], + [ + -230.074, + -33.321 + ] + ] + ], + [ + [ + [ + -185.342, + 17.11 + ], + [ + -173.463, + 4.907 + ], + [ + -193.125, + -11.21 + ], + [ + -202.583, + 0.328 + ] + ] + ], + [ + [ + [ + -156.933, + -9.821 + ], + [ + -179.261, + -28.123 + ], + [ + -193.125, + -11.21 + ], + [ + -179.297, + 0.124 + ], + [ + -174.837, + -4.729 + ], + [ + -167.636, + 1.174 + ] + ] + ], + [ + [ + [ + -147.087, + -40.659 + ], + [ + -160.185, + -51.395 + ], + [ + -167.574, + -42.382 + ], + [ + -154.476, + -31.645 + ] + ] + ], + [ + [ + [ + -166.163, + -17.387 + ], + [ + -155.388, + -8.554 + ], + [ + -145.105, + -19.118 + ], + [ + -152.129, + -24.876 + ], + [ + -157.435, + -18.839 + ], + [ + -161.944, + -22.534 + ] + ] + ], + [ + [ + [ + -134.322, + -30.195 + ], + [ + -147.087, + -40.659 + ], + [ + -156.852, + -28.747 + ], + [ + -145.105, + -19.118 + ] + ] + ], + [ + [ + [ + -184.329, + 18.097 + ], + [ + -198.187, + 4.607 + ], + [ + -211.221, + 17.996 + ], + [ + -202.577, + 26.41 + ], + [ + -196.288, + 19.949 + ], + [ + -191.073, + 25.025 + ] + ] + ], + [ + [ + [ + -168.099, + 43.734 + ], + [ + -152.465, + 30.233 + ], + [ + -157.165, + 25.659 + ], + [ + -164.213, + 32.056 + ], + [ + -169.201, + 26.804 + ], + [ + -162.563, + 20.404 + ], + [ + -167.885, + 15.223 + ], + [ + -181.045, + 28.743 + ] + ] + ], + [ + [ + [ + -151.336, + 53.547 + ], + [ + -159.076, + 42.284 + ], + [ + -175.624, + 56.574 + ], + [ + -170.641, + 63.824 + ] + ] + ], + [ + [ + [ + -144.343, + 34.082 + ], + [ + -158.012, + 41.934 + ], + [ + -151.376, + 53.489 + ], + [ + -137.706, + 45.637 + ] + ] + ], + [ + [ + [ + -139.1, + 17.461 + ], + [ + -134.154, + 22.276 + ], + [ + -114.74, + 18.959 + ], + [ + -110.471, + 13.538 + ], + [ + -124.717, + 1.051 + ] + ] + ], + [ + [ + [ + -113.765, + -11.443 + ], + [ + -124.717, + 1.051 + ], + [ + -117.714, + 7.19 + ], + [ + -112.049, + 0.32 + ], + [ + -106.564, + 4.875 + ], + [ + -101.389, + -1.696 + ] + ] + ], + [ + [ + [ + -112.624, + -12.745 + ], + [ + -130.596, + -27.141 + ], + [ + -144.145, + -13.222 + ], + [ + -136.113, + -6.181 + ], + [ + -127.653, + -15.299 + ], + [ + -117.654, + -7.006 + ] + ] + ], + [ + [ + [ + -147.215, + 7.104 + ], + [ + -135.806, + -5.912 + ], + [ + -142.377, + -11.672 + ], + [ + -154.116, + 0.387 + ] + ] + ], + [ + [ + [ + -136.945, + 15.002 + ], + [ + -126.083, + 2.61 + ], + [ + -135.806, + -5.912 + ], + [ + -146.222, + 5.971 + ] + ] + ], + [ + [ + [ + -94.346, + 41.174 + ], + [ + -111.712, + 22.872 + ], + [ + -112.111, + 23.38 + ], + [ + -115.92, + 24.03 + ], + [ + -112.375, + 44.776 + ], + [ + -95.339, + 41.865 + ] + ] + ], + [ + [ + [ + -112.413, + 44.556 + ], + [ + -113.537, + 37.975 + ], + [ + -127.546, + 40.369 + ], + [ + -126.422, + 46.95 + ] + ] + ], + [ + [ + [ + -115.92, + 24.03 + ], + [ + -132.876, + 26.927 + ], + [ + -130.493, + 40.872 + ], + [ + -113.537, + 37.975 + ] + ] + ], + [ + [ + [ + -111.712, + 22.872 + ], + [ + -99.198, + 36.06 + ], + [ + -90.34, + 26.34 + ], + [ + -105.216, + 14.624 + ] + ] + ], + [ + [ + [ + -78.915, + 13.802 + ], + [ + -94.749, + 1.333 + ], + [ + -105.216, + 14.624 + ], + [ + -97.484, + 20.713 + ], + [ + -94.2, + 16.85 + ], + [ + -86.918, + 22.585 + ] + ] + ], + [ + [ + [ + -80.181, + 15.191 + ], + [ + -99.198, + 36.06 + ], + [ + -95.341, + 40.125 + ], + [ + -70.485, + 22.827 + ] + ] + ], + [ + [ + [ + -305.807, + -47.781 + ], + [ + -274.984, + -59.15 + ], + [ + -276.533, + -64.185 + ], + [ + -310.089, + -57.686 + ] + ] + ], + [ + [ + [ + -260.483, + -38.984 + ], + [ + -239.241, + -33.964 + ], + [ + -234.073, + -55.829 + ], + [ + -241.744, + -56.849 + ], + [ + -244.272, + -42.666 + ], + [ + -260.276, + -45.818 + ] + ] + ], + [ + [ + [ + -243.22, + -34.904 + ], + [ + -257.905, + -38.375 + ], + [ + -260.581, + -27.056 + ], + [ + -256.845, + -26.173 + ], + [ + -255.026, + -33.867 + ], + [ + -244.077, + -31.279 + ] + ] + ], + [ + [ + [ + 124.004, + 86.831 + ], + [ + 119.585, + 99.141 + ], + [ + 132.917, + 105.304 + ], + [ + 138.046, + 89.816 + ] + ] + ], + [ + [ + [ + 148.107, + 112.326 + ], + [ + 151.968, + 92.776 + ], + [ + 138.046, + 89.816 + ], + [ + 135.786, + 96.64 + ], + [ + 145.213, + 99.732 + ], + [ + 142.806, + 109.875 + ] + ] + ], + [ + [ + [ + 150.164, + 74.286 + ], + [ + 143.958, + 72.67 + ], + [ + 140.214, + 90.277 + ], + [ + 148.931, + 92.13 + ] + ] + ], + [ + [ + [ + 119.015, + 66.175 + ], + [ + 106.559, + 93.119 + ], + [ + 119.585, + 99.141 + ], + [ + 130.357, + 69.129 + ] + ] + ], + [ + [ + [ + 153.192, + 75.075 + ], + [ + 140.302, + 41.488 + ], + [ + 142.024, + 59.95 + ], + [ + 140.991, + 63.916 + ], + [ + 142.611, + 59.294 + ], + [ + 145.108, + 72.97 + ] + ] + ], + [ + [ + [ + 103.897, + 54.097 + ], + [ + 95.174, + 65.542 + ], + [ + 105.519, + 71.754 + ], + [ + 109.576, + 64.86 + ], + [ + 117.434, + 69.594 + ], + [ + 120.079, + 63.872 + ] + ] + ], + [ + [ + [ + 106.559, + 93.119 + ], + [ + 114.064, + 76.885 + ], + [ + 100.073, + 68.483 + ], + [ + 95.604, + 76.928 + ], + [ + 101.665, + 80.137 + ], + [ + 97.291, + 88.835 + ] + ] + ], + [ + [ + [ + 93.261, + 64.392 + ], + [ + 80.535, + 81.089 + ], + [ + 90.873, + 85.868 + ], + [ + 100.073, + 68.483 + ] + ] + ], + [ + [ + [ + 101.987, + 52.943 + ], + [ + 120.079, + 63.872 + ], + [ + 125.621, + 51.885 + ], + [ + 119.263, + 48.045 + ], + [ + 115.998, + 53.727 + ], + [ + 105.995, + 47.684 + ] + ] + ], + [ + [ + [ + 126, + 51.065 + ], + [ + 140.302, + 41.488 + ], + [ + 134.456, + 32.758 + ], + [ + 123.648, + 24.52 + ], + [ + 109.989, + 42.442 + ], + [ + 125.621, + 51.885 + ] + ] + ], + [ + [ + [ + 114.488, + 102.073 + ], + [ + 107.805, + 121.43 + ], + [ + 122.608, + 124.956 + ], + [ + 125.423, + 116.801 + ], + [ + 117.978, + 114.232 + ], + [ + 121.117, + 105.137 + ] + ] + ], + [ + [ + [ + 140.77, + 129.281 + ], + [ + 124.421, + 125.387 + ], + [ + 120.059, + 143.703 + ], + [ + 128.643, + 145.747 + ], + [ + 130.597, + 137.545 + ], + [ + 138.362, + 139.394 + ] + ] + ], + [ + [ + [ + 107.805, + 121.43 + ], + [ + 101.632, + 139.314 + ], + [ + 120.059, + 143.703 + ], + [ + 124.421, + 125.387 + ] + ] + ], + [ + [ + [ + 137.98, + 147.97 + ], + [ + 121.508, + 144.048 + ], + [ + 118.753, + 155.615 + ], + [ + 135.225, + 159.538 + ] + ] + ], + [ + [ + [ + 103.225, + 139.693 + ], + [ + 99.707, + 149.884 + ], + [ + 119.023, + 154.484 + ], + [ + 121.508, + 144.048 + ] + ] + ], + [ + [ + [ + 93.867, + 161.805 + ], + [ + 116.023, + 167.081 + ], + [ + 117.509, + 160.838 + ], + [ + 102.528, + 157.27 + ], + [ + 104.479, + 151.021 + ], + [ + 98.114, + 149.505 + ] + ] + ], + [ + [ + [ + 97.156, + 129.125 + ], + [ + 100.678, + 118.923 + ], + [ + 94.477, + 116.753 + ], + [ + 92.69, + 121.903 + ], + [ + 79.491, + 117.952 + ], + [ + 77.291, + 124.241 + ] + ] + ], + [ + [ + [ + 105.031, + 108.474 + ], + [ + 85.231, + 101.546 + ], + [ + 83.522, + 106.432 + ], + [ + 90.355, + 108.822 + ], + [ + 88.341, + 114.606 + ], + [ + 92.671, + 116.121 + ], + [ + 94.68, + 110.336 + ], + [ + 103.342, + 113.366 + ] + ] + ], + [ + [ + [ + 110.109, + 100.048 + ], + [ + 89.146, + 90.358 + ], + [ + 85.231, + 101.546 + ], + [ + 106.966, + 109.151 + ] + ] + ], + [ + [ + [ + 67.036, + 101.673 + ], + [ + 82.333, + 109.83 + ], + [ + 88.299, + 92.778 + ], + [ + 84.504, + 91.024 + ], + [ + 81.102, + 98.157 + ], + [ + 72.859, + 94.032 + ] + ] + ], + [ + [ + [ + 56.161, + 119.046 + ], + [ + 77.291, + 124.241 + ], + [ + 79.258, + 118.617 + ], + [ + 68.313, + 114.864 + ], + [ + 72.855, + 104.776 + ], + [ + 65.48, + 100.843 + ] + ] + ], + [ + [ + [ + 56.124, + 140.632 + ], + [ + 60.416, + 141.688 + ], + [ + 65.423, + 121.323 + ], + [ + 59.647, + 119.903 + ] + ] + ], + [ + [ + [ + 71.109, + 154.448 + ], + [ + 73.457, + 144.894 + ], + [ + 54.054, + 140.123 + ], + [ + 52.166, + 151.228 + ] + ] + ], + [ + [ + [ + 73.74, + 143.744 + ], + [ + 71.201, + 154.073 + ], + [ + 88.865, + 158.416 + ], + [ + 90.098, + 153.403 + ], + [ + 80.494, + 151.041 + ], + [ + 81.801, + 145.726 + ] + ] + ], + [ + [ + [ + 97.522, + 129.215 + ], + [ + 78.464, + 124.53 + ], + [ + 76.382, + 132.997 + ], + [ + 87.55, + 135.742 + ], + [ + 84.306, + 146.342 + ], + [ + 91.038, + 147.997 + ] + ] + ], + [ + [ + [ + 102.703, + 44.084 + ], + [ + 119.83, + 21.611 + ], + [ + 116.094, + 18.763 + ] + ] + ], + [ + [ + [ + 154.268, + 107.176 + ], + [ + 178.222, + 112.881 + ], + [ + 178.94, + 105.497 + ], + [ + 160.72, + 102.01 + ], + [ + 162.462, + 89.313 + ], + [ + 157.055, + 88.787 + ] + ] + ], + [ + [ + [ + 150.719, + -14.826 + ], + [ + 160.192, + -20.335 + ], + [ + 158.07, + -23.984 + ], + [ + 152.299, + -20.628 + ], + [ + 148.654, + -26.895 + ], + [ + 144.953, + -24.742 + ] + ] + ], + [ + [ + [ + 134.091, + -6.953 + ], + [ + 135.062, + -5.722 + ], + [ + 150.719, + -14.826 + ], + [ + 143.722, + -22.287 + ] + ] + ], + [ + [ + [ + 126.161, + 4.478 + ], + [ + 135.515, + 10.466 + ], + [ + 137.945, + 6.669 + ], + [ + 135.144, + 4.876 + ], + [ + 138.23, + 0.054 + ], + [ + 131.677, + -4.141 + ] + ] + ], + [ + [ + [ + 118.369, + 14.462 + ], + [ + 127.289, + 21.26 + ], + [ + 135.515, + 10.466 + ], + [ + 129.553, + 6.649 + ], + [ + 126.332, + 11.712 + ], + [ + 121.562, + 8.423 + ] + ] + ], + [ + [ + [ + 128.379, + 19.829 + ], + [ + 135.974, + 25.617 + ], + [ + 148.336, + 9.397 + ], + [ + 140.741, + 3.609 + ] + ] + ], + [ + [ + [ + 147.072, + 42.971 + ], + [ + 161.196, + 33.513 + ], + [ + 150.525, + 13.502 + ], + [ + 145.277, + 17.871 + ], + [ + 149.615, + 25.083 + ], + [ + 139.37, + 33.019 + ] + ] + ], + [ + [ + [ + 189.192, + -30.51 + ], + [ + 183.062, + -49.619 + ], + [ + 171.144, + -44.136 + ], + [ + 175.086, + -34.011 + ], + [ + 182.022, + -36.648 + ], + [ + 184.654, + -29.054 + ] + ] + ], + [ + [ + [ + 162.871, + -40.316 + ], + [ + 169.186, + -24.093 + ], + [ + 177.863, + -26.876 + ], + [ + 171.144, + -44.136 + ] + ] + ], + [ + [ + [ + 158.342, + 35.424 + ], + [ + 148.997, + 41.681 + ], + [ + 154.746, + 50.267 + ], + [ + 164.091, + 44.01 + ] + ] + ], + [ + [ + [ + 167.996, + 65.52 + ], + [ + 165.673, + 48.121 + ], + [ + 153.919, + 50.43 + ], + [ + 158.128, + 66.221 + ] + ] + ], + [ + [ + [ + 201.456, + -52.626 + ], + [ + 205.881, + -36.321 + ], + [ + 209.916, + -37.416 + ], + [ + 207.963, + -44.613 + ], + [ + 213.732, + -46.303 + ], + [ + 211.17, + -55.742 + ] + ] + ], + [ + [ + [ + 184.261, + -45.881 + ], + [ + 188.814, + -31.689 + ], + [ + 205.881, + -36.321 + ], + [ + 201.763, + -51.495 + ] + ] + ], + [ + [ + [ + 8.971, + 306.366 + ], + [ + -13.213, + 300.722 + ], + [ + -15.945, + 311.459 + ], + [ + 6.239, + 317.103 + ] + ] + ], + [ + [ + [ + 3.042, + 329.669 + ], + [ + 6.239, + 317.103 + ], + [ + -13.62, + 312.051 + ], + [ + -17.299, + 326.509 + ], + [ + -9.854, + 327.666 + ], + [ + -8.122, + 320.86 + ], + [ + -2.84, + 321.936 + ], + [ + -4.508, + 328.496 + ] + ] + ], + [ + [ + [ + -8.627, + 301.889 + ], + [ + 6.654, + 305.777 + ], + [ + 10.713, + 289.823 + ], + [ + -4.568, + 285.935 + ] + ] + ], + [ + [ + [ + 53.504, + 267.64 + ], + [ + 33.125, + 260.605 + ], + [ + 28.741, + 277.836 + ], + [ + 36.393, + 279.783 + ], + [ + 38.789, + 270.272 + ], + [ + 51.867, + 274.272 + ] + ] + ], + [ + [ + [ + -6.463, + 285.453 + ], + [ + 3.21, + 287.914 + ], + [ + 5.488, + 278.961 + ], + [ + 0.542, + 277.703 + ], + [ + 3.074, + 267.753 + ], + [ + -1.654, + 266.55 + ] + ] + ], + [ + [ + [ + 29.59, + 274.499 + ], + [ + 33.125, + 260.605 + ], + [ + 25.27, + 257.894 + ], + [ + 23.679, + 264.149 + ], + [ + 16.054, + 261.818 + ], + [ + 13.847, + 270.494 + ] + ] + ], + [ + [ + [ + -1.661, + 266.548 + ], + [ + 13.847, + 270.494 + ], + [ + 17.341, + 256.76 + ], + [ + 7.935, + 253.513 + ], + [ + 5.949, + 261.318 + ], + [ + 0.109, + 259.59 + ] + ] + ], + [ + [ + [ + 41.424, + 316.577 + ], + [ + 36.551, + 336.319 + ], + [ + 44.678, + 337.581 + ], + [ + 45.936, + 332.428 + ], + [ + 49.543, + 333.162 + ], + [ + 52.664, + 320.321 + ] + ] + ], + [ + [ + [ + 52.835, + 270.349 + ], + [ + 49.962, + 281.991 + ], + [ + 57.865, + 284.719 + ], + [ + 59.907, + 277.956 + ], + [ + 66.165, + 280.116 + ], + [ + 67.758, + 275.5 + ] + ] + ], + [ + [ + [ + 10.318, + 167.199 + ], + [ + 30.691, + 169.58 + ], + [ + 32.762, + 157.395 + ], + [ + 27.871, + 156.563 + ], + [ + 26.982, + 162.735 + ], + [ + 10.755, + 160.39 + ] + ] + ], + [ + [ + [ + 10.978, + 181.967 + ], + [ + 28.223, + 184.105 + ], + [ + 30.691, + 169.58 + ], + [ + 22.843, + 168.663 + ], + [ + 21.859, + 176.49 + ], + [ + 11.41, + 175.23 + ] + ] + ], + [ + [ + [ + 51.365, + 159.085 + ], + [ + 33.006, + 155.964 + ], + [ + 31.603, + 164.215 + ], + [ + 49.962, + 167.336 + ] + ] + ], + [ + [ + [ + 63.774, + 163.277 + ], + [ + 51.021, + 161.109 + ], + [ + 48.083, + 178.393 + ], + [ + 54.522, + 179.284 + ], + [ + 53.177, + 187.198 + ], + [ + 59.574, + 187.991 + ] + ] + ], + [ + [ + [ + 32.84, + 184.677 + ], + [ + 7.356, + 181.519 + ], + [ + 6.839, + 189.579 + ], + [ + 12.538, + 190.286 + ], + [ + 11.969, + 197.618 + ], + [ + 30.944, + 199.97 + ] + ] + ], + [ + [ + [ + 8.8, + 217.002 + ], + [ + 17.1, + 218.13 + ], + [ + 19.527, + 198.555 + ], + [ + 10.058, + 197.381 + ] + ] + ], + [ + [ + [ + 80.936, + 267.802 + ], + [ + 83.87, + 255.484 + ], + [ + 66.851, + 251.431 + ], + [ + 64.319, + 262.066 + ] + ] + ], + [ + [ + [ + 25.692, + 249.299 + ], + [ + 37.48, + 253.368 + ], + [ + 38.991, + 247.093 + ], + [ + 33.601, + 245.483 + ], + [ + 35.454, + 237.77 + ], + [ + 28.83, + 236.174 + ] + ] + ], + [ + [ + [ + 50.794, + 261.627 + ], + [ + 55.385, + 242.571 + ], + [ + 48.033, + 240.8 + ], + [ + 44.982, + 253.463 + ], + [ + 37.983, + 251.277 + ], + [ + 36.665, + 256.75 + ] + ] + ], + [ + [ + [ + 8.929, + 217.02 + ], + [ + 8.03, + 231.027 + ], + [ + 29.293, + 234.24 + ], + [ + 30.647, + 228.575 + ], + [ + 23.841, + 227.59 + ], + [ + 25.387, + 219.257 + ] + ] + ], + [ + [ + [ + 7.146, + 231.817 + ], + [ + 4.177, + 243.486 + ], + [ + 11.877, + 245.445 + ], + [ + 14.846, + 233.776 + ] + ] + ], + [ + [ + [ + 25.376, + 250.621 + ], + [ + 29.293, + 234.24 + ], + [ + 15.252, + 232.118 + ], + [ + 11.86, + 245.956 + ] + ] + ], + [ + [ + [ + -49.599, + -112.396 + ], + [ + -58.976, + -122.56 + ], + [ + -68.283, + -113.973 + ], + [ + -62.896, + -108.134 + ], + [ + -68.507, + -102.958 + ], + [ + -64.517, + -98.633 + ] + ] + ], + [ + [ + [ + -58.765, + -122.331 + ], + [ + -47.172, + -109.765 + ], + [ + -39.87, + -116.502 + ], + [ + -45.754, + -122.88 + ], + [ + -38.273, + -129.782 + ], + [ + -43.981, + -135.969 + ] + ] + ], + [ + [ + [ + -36.901, + -95.982 + ], + [ + -26.047, + -97.195 + ], + [ + -28.152, + -116.03 + ], + [ + -39.005, + -114.817 + ] + ] + ], + [ + [ + [ + 20.554, + -126.538 + ], + [ + 1.63, + -115.596 + ], + [ + 8.641, + -103.469 + ], + [ + 27.566, + -114.411 + ] + ] + ], + [ + [ + [ + -26.198, + -98.546 + ], + [ + -12.817, + -100.041 + ], + [ + -13.963, + -110.305 + ], + [ + -20.057, + -109.624 + ], + [ + -21.188, + -119.742 + ], + [ + -28.476, + -118.928 + ] + ] + ], + [ + [ + [ + -15.094, + -120.423 + ], + [ + -12.842, + -100.273 + ], + [ + 1.405, + -101.865 + ], + [ + 0.262, + -112.094 + ], + [ + -8.017, + -111.169 + ], + [ + -9.126, + -121.09 + ] + ] + ], + [ + [ + [ + 50.097, + -113.199 + ], + [ + 61.391, + -97.356 + ], + [ + 74.606, + -116.396 + ], + [ + 65.315, + -121.147 + ], + [ + 61.831, + -115.941 + ], + [ + 55.047, + -120.979 + ] + ] + ], + [ + [ + [ + 89.381, + -131.367 + ], + [ + 80.172, + -145.241 + ], + [ + 67.032, + -136.519 + ], + [ + 72.566, + -128.18 + ], + [ + 65.34, + -123.384 + ], + [ + 69.014, + -117.849 + ] + ] + ], + [ + [ + [ + 90.401, + -129.831 + ], + [ + 108.351, + -139.767 + ], + [ + 105.431, + -145.043 + ], + [ + 95.139, + -139.347 + ], + [ + 86.969, + -152.654 + ], + [ + 78.4, + -147.911 + ] + ] + ], + [ + [ + [ + 52.611, + 24.906 + ], + [ + 65.8, + 18.333 + ], + [ + 62.115, + 10.938 + ], + [ + 48.925, + 17.511 + ] + ] + ], + [ + [ + [ + 75.628, + 4.179 + ], + [ + 55.818, + -3.478 + ], + [ + 54.55, + -0.197 + ], + [ + 60.285, + 2.019 + ], + [ + 57.524, + 9.164 + ], + [ + 64.956, + 12.036 + ], + [ + 67.717, + 4.891 + ], + [ + 74.36, + 7.459 + ] + ] + ], + [ + [ + [ + 56.208, + -3.327 + ], + [ + 64.767, + -0.019 + ], + [ + 72.131, + -19.07 + ], + [ + 61.38, + -23.225 + ] + ] + ], + [ + [ + [ + 85.77, + -13.799 + ], + [ + 72.131, + -19.07 + ], + [ + 64.767, + -0.019 + ], + [ + 76.155, + 4.383 + ] + ] + ], + [ + [ + [ + 62.999, + -22.599 + ], + [ + 68.006, + -20.664 + ], + [ + 79.015, + -46.424 + ], + [ + 70.175, + -50.202 + ] + ] + ], + [ + [ + [ + 87.06, + -13.3 + ], + [ + 100.873, + -37.082 + ], + [ + 79.015, + -46.424 + ], + [ + 70.968, + -27.593 + ], + [ + 80.838, + -23.659 + ], + [ + 77.501, + -16.995 + ] + ] + ], + [ + [ + [ + 66.965, + -51.574 + ], + [ + 83.49, + -44.511 + ], + [ + 86.487, + -51.578 + ], + [ + 76.439, + -55.859 + ], + [ + 78.05, + -60.773 + ], + [ + 88.501, + -56.328 + ], + [ + 91.932, + -64.418 + ], + [ + 72.451, + -72.679 + ] + ] + ], + [ + [ + [ + 100.873, + -37.082 + ], + [ + 113.569, + -57.295 + ], + [ + 92.669, + -66.158 + ], + [ + 83.49, + -44.511 + ] + ] + ], + [ + [ + [ + 84.668, + -121.171 + ], + [ + 73.802, + -79.372 + ], + [ + 79.026, + -77.157 + ], + [ + 92.393, + -108.679 + ], + [ + 85.288, + -121.514 + ] + ] + ], + [ + [ + [ + 90.464, + -120.685 + ], + [ + 97.691, + -107.63 + ], + [ + 118.211, + -118.988 + ], + [ + 114.884, + -124.998 + ], + [ + 108.482, + -121.454 + ], + [ + 104.582, + -128.5 + ] + ] + ], + [ + [ + [ + 121.613, + -109.122 + ], + [ + 116.635, + -118.116 + ], + [ + 97.691, + -107.63 + ], + [ + 102.669, + -98.635 + ] + ] + ], + [ + [ + [ + 120.428, + -69.841 + ], + [ + 115.945, + -77.941 + ], + [ + 108.855, + -74.017 + ], + [ + 113.339, + -65.917 + ] + ] + ], + [ + [ + [ + 89.662, + -72.647 + ], + [ + 103.023, + -66.981 + ], + [ + 105.211, + -72.14 + ], + [ + 96.859, + -75.681 + ], + [ + 102.908, + -89.946 + ], + [ + 97.898, + -92.071 + ] + ] + ], + [ + [ + [ + 134.251, + -90.972 + ], + [ + 114.717, + -80.159 + ], + [ + 121.354, + -68.168 + ], + [ + 130.091, + -72.202 + ], + [ + 125.952, + -79.68 + ], + [ + 137.273, + -85.514 + ] + ] + ], + [ + [ + [ + 124.446, + -110.69 + ], + [ + 104.063, + -99.407 + ], + [ + 108.322, + -91.712 + ], + [ + 115.533, + -95.703 + ], + [ + 117.938, + -91.358 + ], + [ + 123.039, + -94.182 + ], + [ + 127.028, + -86.974 + ], + [ + 135.101, + -91.442 + ] + ] + ], + [ + [ + [ + 184.427, + -92.752 + ], + [ + 168.826, + -125.563 + ], + [ + 159.762, + -120.545 + ], + [ + 167.334, + -104.371 + ], + [ + 159.614, + -101.015 + ], + [ + 166.245, + -86.653 + ] + ] + ], + [ + [ + [ + 147.921, + -78.193 + ], + [ + 166.245, + -86.653 + ], + [ + 157.969, + -104.578 + ], + [ + 139.098, + -94.132 + ] + ] + ], + [ + [ + [ + 134.817, + -106.737 + ], + [ + 149.379, + -114.798 + ], + [ + 138.265, + -134.876 + ], + [ + 123.703, + -126.815 + ] + ] + ], + [ + [ + [ + 124.076, + -127.022 + ], + [ + 141.8, + -136.833 + ], + [ + 138.655, + -142.513 + ], + [ + 129.226, + -137.293 + ], + [ + 126.52, + -142.181 + ], + [ + 118.226, + -137.59 + ] + ] + ], + [ + [ + [ + 182.977, + -95.802 + ], + [ + 192.832, + -98.963 + ], + [ + 185.168, + -117.785 + ], + [ + 179.246, + -115.374 + ], + [ + 184.84, + -102.784 + ], + [ + 180.394, + -101.234 + ] + ] + ], + [ + [ + [ + 213.512, + -104.21 + ], + [ + 204.739, + -125.754 + ], + [ + 192.608, + -120.815 + ], + [ + 196.332, + -111.669 + ], + [ + 188.789, + -108.892 + ], + [ + 190.528, + -104.622 + ], + [ + 205.322, + -109.798 + ], + [ + 208.281, + -102.532 + ] + ] + ], + [ + [ + [ + -163.074, + -105.361 + ], + [ + -147.042, + -102.926 + ], + [ + -147.226, + -101.713 + ], + [ + -137.164, + -107.439 + ], + [ + -144.372, + -120.105 + ], + [ + -144.166, + -121.462 + ], + [ + -160.257, + -123.907 + ] + ] + ], + [ + [ + [ + -124.087, + -135.801 + ], + [ + -141.584, + -138.459 + ], + [ + -144.219, + -121.114 + ], + [ + -133.558, + -119.494 + ], + [ + -132.167, + -128.649 + ], + [ + -125.331, + -127.611 + ] + ] + ], + [ + [ + [ + -162.691, + -107.886 + ], + [ + -160.668, + -121.204 + ], + [ + -174.911, + -123.367 + ], + [ + -175.705, + -118.141 + ], + [ + -168.499, + -117.046 + ], + [ + -169.728, + -108.955 + ] + ] + ], + [ + [ + [ + -142.023, + -138.526 + ], + [ + -122.009, + -135.485 + ], + [ + -119.644, + -154.193 + ], + [ + -128.734, + -155.574 + ], + [ + -130.3, + -144.249 + ], + [ + -140.909, + -145.861 + ] + ] + ], + [ + [ + [ + -117.234, + -168.031 + ], + [ + -136.816, + -172.802 + ], + [ + -139.192, + -157.163 + ], + [ + -127.298, + -155.356 + ], + [ + -126.349, + -161.117 + ], + [ + -118.69, + -159.675 + ] + ] + ], + [ + [ + [ + -176.877, + -110.427 + ], + [ + -173.973, + -129.544 + ], + [ + -195.522, + -132.818 + ], + [ + -197.21, + -121.704 + ], + [ + -188.097, + -120.32 + ], + [ + -189.313, + -112.316 + ] + ] + ], + [ + [ + [ + -198.499, + -113.22 + ], + [ + -196.068, + -129.221 + ], + [ + -215.374, + -130.879 + ], + [ + -215.557, + -121.737 + ], + [ + -206.351, + -120.594 + ], + [ + -206.897, + -114.496 + ] + ] + ], + [ + [ + [ + -115.088, + -152.204 + ], + [ + -117.273, + -134.235 + ], + [ + -103.888, + -132.649 + ], + [ + -102.527, + -144.134 + ], + [ + -110.022, + -145.022 + ], + [ + -109.242, + -151.512 + ] + ] + ], + [ + [ + [ + -92.246, + -118.02 + ], + [ + -90.698, + -131.086 + ], + [ + -114.551, + -133.913 + ], + [ + -115.44, + -118.28 + ] + ] + ], + [ + [ + [ + -47.896, + -140.542 + ], + [ + -66.423, + -161.215 + ], + [ + -76.108, + -152.536 + ], + [ + -71.407, + -147.439 + ], + [ + -66.651, + -151.714 + ], + [ + -52.605, + -136.269 + ] + ] + ], + [ + [ + [ + -69.387, + -120.857 + ], + [ + -57.23, + -132.072 + ], + [ + -68.015, + -143.763 + ], + [ + -80.172, + -132.548 + ] + ] + ], + [ + [ + [ + -91.061, + -128.024 + ], + [ + -92.199, + -118.418 + ], + [ + -75.289, + -116.414 + ], + [ + -74.151, + -126.021 + ] + ] + ], + [ + [ + [ + -42.372, + -175.741 + ], + [ + -29.169, + -160.126 + ], + [ + -13.258, + -173.578 + ], + [ + -18.712, + -180.028 + ], + [ + -23.58, + -175.912 + ], + [ + -31.33, + -185.077 + ] + ] + ], + [ + [ + [ + -171.286, + 259.754 + ], + [ + -189.957, + 250.876 + ], + [ + -200.707, + 273.485 + ], + [ + -183.989, + 281.434 + ] + ] + ], + [ + [ + [ + -167.63, + 261.492 + ], + [ + -157.931, + 244.938 + ], + [ + -174.377, + 237.118 + ], + [ + -178.139, + 245.029 + ], + [ + -172.956, + 247.494 + ], + [ + -177.668, + 256.719 + ] + ] + ], + [ + [ + [ + -210.814, + 267.416 + ], + [ + -207.265, + 259.953 + ], + [ + -223.947, + 252.021 + ], + [ + -227.496, + 259.484 + ] + ] + ], + [ + [ + [ + -149.279, + 213.916 + ], + [ + -160.801, + 217.869 + ], + [ + -158.846, + 223.565 + ], + [ + -147.325, + 219.611 + ] + ] + ], + [ + [ + [ + -144.313, + 212.211 + ], + [ + -147.164, + 203.904 + ], + [ + -163.25, + 209.424 + ], + [ + -160.399, + 217.731 + ] + ] + ], + [ + [ + [ + -153.38, + 197.768 + ], + [ + -165.147, + 201.806 + ], + [ + -175.869, + 196.708 + ], + [ + -180.279, + 205.982 + ], + [ + -168.937, + 211.375 + ], + [ + -150.842, + 205.166 + ] + ] + ], + [ + [ + [ + -149.702, + 196.506 + ], + [ + -153.103, + 186.596 + ], + [ + -161.153, + 189.359 + ], + [ + -159.408, + 194.444 + ], + [ + -166.802, + 196.982 + ], + [ + -165.147, + 201.806 + ] + ] + ], + [ + [ + [ + -165.532, + 174.667 + ], + [ + -169.274, + 182.537 + ], + [ + -163.457, + 185.302 + ], + [ + -159.715, + 177.432 + ] + ] + ], + [ + [ + [ + -182.138, + 164.089 + ], + [ + -188.309, + 177.067 + ], + [ + -170.662, + 185.457 + ], + [ + -167.098, + 177.96 + ], + [ + -177.796, + 173.211 + ], + [ + -174.897, + 167.114 + ] + ] + ], + [ + [ + [ + -216.388, + 145.685 + ], + [ + -232.611, + 138.907 + ], + [ + -240.578, + 148.034 + ], + [ + -223.487, + 159.562 + ] + ] + ], + [ + [ + [ + -244.732, + 157.811 + ], + [ + -227.886, + 168.161 + ], + [ + -223.487, + 159.562 + ], + [ + -237.821, + 149.894 + ] + ] + ], + [ + [ + [ + -206.95, + 153.013 + ], + [ + -217.814, + 148.474 + ], + [ + -227.886, + 168.161 + ], + [ + -222.361, + 171.555 + ], + [ + -215.222, + 156.171 + ], + [ + -209.416, + 158.914 + ] + ] + ], + [ + [ + [ + -262.106, + 172.697 + ], + [ + -245.99, + 186.764 + ], + [ + -237.485, + 175.218 + ], + [ + -253.81, + 163.194 + ] + ] + ], + [ + [ + [ + -263.604, + 221.864 + ], + [ + -273.242, + 242.135 + ], + [ + -264.723, + 246.186 + ], + [ + -261.338, + 239.067 + ], + [ + -253.329, + 242.876 + ], + [ + -249.589, + 235.01 + ], + [ + -257.598, + 231.202 + ], + [ + -255.085, + 225.915 + ] + ] + ], + [ + [ + [ + -287.615, + 232.727 + ], + [ + -275.434, + 211.117 + ], + [ + -282.2, + 206.652 + ], + [ + -287.339, + 213.363 + ], + [ + -291.41, + 210.995 + ], + [ + -296.874, + 217.255 + ], + [ + -292.203, + 219.716 + ], + [ + -298.282, + 227.655 + ] + ] + ], + [ + [ + [ + 288.074, + 73.269 + ], + [ + 281.824, + 92.141 + ], + [ + 286.907, + 93.825 + ], + [ + 288.697, + 88.422 + ], + [ + 294.678, + 90.402 + ], + [ + 299.138, + 76.933 + ] + ] + ], + [ + [ + [ + -571.255, + 123.053 + ], + [ + -589.518, + 130.434 + ], + [ + -585.788, + 139.662 + ], + [ + -579.812, + 137.246 + ], + [ + -581.871, + 132.151 + ], + [ + -569.584, + 127.185 + ] + ] + ] + ] + }, + { + "type": "MultiPolygon", + "id": "prisms", + "coordinates": [ + [ + [ + [ + 1.994, + 7.78 + ], + [ + 0.083, + 3.167 + ], + [ + -4.53, + 1.257 + ], + [ + -9.142, + 3.167 + ], + [ + -11.053, + 7.78 + ], + [ + -9.142, + 12.393 + ], + [ + -4.53, + 14.304 + ], + [ + 0.083, + 12.393 + ] + ] + ] + ] + }, + { + "type": "MultiPolygon", + "id": "squares", + "coordinates": [ + [ + [ + [ + 20.81, + 25.125 + ], + [ + 38.753, + -4.011 + ], + [ + 0.348, + -5.127 + ], + [ + -37.113, + -12.5 + ], + [ + -41.251, + -1.222 + ] + ] + ] + ] + }, + { + "type": "MultiPolygon", + "id": "greens", + "coordinates": [] + }, + { + "type": "MultiPolygon", + "id": "fields", + "coordinates": [ + [ + [ + [ + -333.517, + 180.635 + ], + [ + -319.395, + 206.584 + ], + [ + -313.489, + 207.233 + ], + [ + -259.502, + 145.384 + ], + [ + -259.754, + 137.784 + ], + [ + -290.089, + 107.359 + ], + [ + -296.381, + 108.168 + ], + [ + -333.382, + 171.576 + ] + ] + ], + [ + [ + [ + -303.274, + 94.134 + ], + [ + -324.996, + 72.348 + ], + [ + -331.844, + 72.782 + ], + [ + -364.068, + 114.548 + ], + [ + -364.759, + 123.232 + ], + [ + -342.959, + 163.287 + ], + [ + -337.852, + 163.363 + ], + [ + -302.224, + 102.308 + ] + ] + ], + [ + [ + [ + 285.126, + 98.712 + ], + [ + 340.638, + 117.096 + ], + [ + 346.632, + 113.639 + ], + [ + 357.484, + 61.403 + ], + [ + 353.842, + 54.086 + ], + [ + 307.18, + 31.993 + ], + [ + 300.845, + 34.704 + ], + [ + 281.824, + 92.141 + ] + ] + ], + [ + [ + [ + 332.37, + 35.068 + ], + [ + 358.587, + 47.481 + ], + [ + 368.162, + 47.897 + ], + [ + 412.705, + 31.367 + ], + [ + 417.762, + 24.361 + ], + [ + 420.037, + -40.903 + ], + [ + 415.021, + -46.281 + ], + [ + 328.16, + -49.309 + ], + [ + 323.26, + -44.299 + ], + [ + 327.373, + 27.652 + ] + ] + ], + [ + [ + [ + -440.208, + -34.342 + ], + [ + -489.342, + -14.638 + ], + [ + -491.694, + -8.128 + ], + [ + -437.505, + 92.056 + ], + [ + -430.021, + 98.021 + ], + [ + -378.538, + 112.32 + ], + [ + -372.57, + 112.471 + ], + [ + -373.676, + 106.457 + ], + [ + -433.318, + -31.504 + ] + ] + ], + [ + [ + [ + -358.026, + 393.249 + ], + [ + -340.538, + 410.004 + ], + [ + -333.186, + 409.847 + ], + [ + -268.102, + 341.914 + ], + [ + -268.727, + 335.125 + ], + [ + -295.827, + 315.655 + ], + [ + -303.302, + 316.679 + ], + [ + -358.529, + 385.594 + ] + ] + ], + [ + [ + [ + -310.779, + 304.912 + ], + [ + -346.993, + 278.894 + ], + [ + -355.071, + 279.35 + ], + [ + -413.853, + 332.58 + ], + [ + -413.952, + 339.668 + ], + [ + -371.335, + 380.498 + ], + [ + -364.328, + 380.038 + ], + [ + -309.808, + 312.004 + ] + ] + ], + [ + [ + [ + 406.074, + 131.247 + ], + [ + 446.359, + 147.089 + ], + [ + 453.101, + 144.153 + ], + [ + 483.569, + 66.675 + ], + [ + 480.633, + 59.933 + ], + [ + 440.348, + 44.091 + ], + [ + 433.606, + 47.027 + ], + [ + 403.138, + 124.505 + ] + ] + ], + [ + [ + [ + 424.753, + 37.959 + ], + [ + 416.568, + 38.466 + ], + [ + 371.439, + 55.214 + ], + [ + 365.507, + 62.114 + ], + [ + 356.351, + 106.187 + ], + [ + 360.133, + 113.181 + ], + [ + 388.95, + 124.514 + ], + [ + 395.693, + 121.577 + ], + [ + 426.16, + 44.1 + ] + ] + ], + [ + [ + [ + 463.482, + 153.823 + ], + [ + 509.262, + 171.826 + ], + [ + 516.223, + 168.981 + ], + [ + 550.232, + 92.885 + ], + [ + 547.514, + 86.234 + ], + [ + 497.756, + 66.667 + ], + [ + 491.014, + 69.603 + ], + [ + 460.546, + 147.081 + ] + ] + ], + [ + [ + [ + -491.197, + 244.459 + ], + [ + -436.976, + 314.146 + ], + [ + -429.928, + 314.759 + ], + [ + -369.373, + 259.924 + ], + [ + -369.009, + 252.579 + ], + [ + -412.532, + 204.515 + ], + [ + -420.662, + 203.011 + ], + [ + -489.751, + 238.006 + ] + ] + ], + [ + [ + [ + -425.08, + 190.659 + ], + [ + -466.737, + 144.657 + ], + [ + -473.77, + 144.609 + ], + [ + -522.036, + 196.464 + ], + [ + -522.386, + 204.374 + ], + [ + -502.588, + 229.819 + ], + [ + -494.756, + 231.573 + ], + [ + -426.229, + 196.863 + ] + ] + ], + [ + [ + [ + -415.219, + 189.63 + ], + [ + -363.079, + 247.209 + ], + [ + -355.734, + 247.573 + ], + [ + -326.404, + 221.013 + ], + [ + -325.035, + 212.955 + ], + [ + -359.56, + 149.519 + ], + [ + -366.265, + 147.991 + ], + [ + -414.491, + 182.736 + ] + ] + ], + [ + [ + [ + -368.387, + 133.301 + ], + [ + -372.222, + 126.254 + ], + [ + -379.718, + 120.295 + ], + [ + -431.458, + 105.925 + ], + [ + -440.011, + 108.34 + ], + [ + -461.214, + 131.119 + ], + [ + -461.266, + 138.78 + ], + [ + -427.604, + 175.954 + ], + [ + -419.894, + 176.769 + ], + [ + -370.12, + 140.908 + ] + ] + ], + [ + [ + [ + 463.987, + 44.791 + ], + [ + 515.707, + 65.129 + ], + [ + 520.599, + 61.833 + ], + [ + 521.32, + -9.227 + ], + [ + 516.364, + -15.824 + ], + [ + 491.246, + -22.832 + ], + [ + 484.291, + -19.408 + ], + [ + 461.094, + 38.066 + ] + ] + ], + [ + [ + [ + 473.474, + -27.79 + ], + [ + 433.036, + -39.073 + ], + [ + 427.846, + -35.273 + ], + [ + 425.762, + 24.491 + ], + [ + 430.42, + 31.591 + ], + [ + 446.863, + 38.057 + ], + [ + 453.648, + 35.138 + ], + [ + 476.537, + -21.571 + ] + ] + ], + [ + [ + [ + -543.003, + 30.859 + ], + [ + -548.666, + 10.251 + ], + [ + -555.011, + 6.778 + ], + [ + -622.343, + 27.666 + ], + [ + -625.727, + 34.16 + ], + [ + -613.94, + 71.043 + ], + [ + -607.835, + 73.43 + ], + [ + -546.148, + 38.439 + ] + ] + ], + [ + [ + [ + -608.287, + 88.735 + ], + [ + -598.364, + 119.788 + ], + [ + -591.96, + 122.792 + ], + [ + -529.979, + 97.742 + ], + [ + -526.536, + 90.779 + ], + [ + -538.06, + 48.845 + ], + [ + -543.961, + 46.396 + ], + [ + -605.347, + 81.216 + ] + ] + ], + [ + [ + [ + -512.87, + 90.827 + ], + [ + -463.855, + 71.017 + ], + [ + -461.508, + 64.495 + ], + [ + -499.203, + -5.194 + ], + [ + -506.643, + -8.227 + ], + [ + -537.433, + 1.325 + ], + [ + -541.021, + 7.88 + ], + [ + -519.069, + 87.761 + ] + ] + ], + [ + [ + [ + -592.756, + 137.336 + ], + [ + -576.266, + 188.937 + ], + [ + -569.49, + 194.144 + ], + [ + -537.683, + 195.698 + ], + [ + -528.946, + 192.146 + ], + [ + -446.168, + 103.212 + ], + [ + -445.099, + 94.832 + ], + [ + -452.73, + 80.723 + ], + [ + -460.025, + 78.098 + ], + [ + -589.518, + 130.434 + ] + ] + ], + [ + [ + [ + -561.949, + -117.792 + ], + [ + -592.687, + -94.062 + ], + [ + -595.182, + -85.943 + ], + [ + -578.163, + -34.05 + ], + [ + -571.576, + -30.649 + ], + [ + -519.412, + -46.832 + ], + [ + -512.633, + -49.099 + ], + [ + -513.688, + -54.165 + ], + [ + -554.966, + -116.631 + ] + ] + ], + [ + [ + [ + -546.394, + 286.383 + ], + [ + -586.878, + 317.192 + ], + [ + -589.403, + 325.284 + ], + [ + -568.916, + 388.083 + ], + [ + -562.753, + 390.51 + ], + [ + -506.171, + 359.211 + ], + [ + -504.138, + 352.144 + ], + [ + -539.739, + 287.784 + ] + ] + ], + [ + [ + [ + -490.07, + 350.305 + ], + [ + -444.919, + 325.329 + ], + [ + -443.562, + 318.708 + ], + [ + -494.41, + 253.357 + ], + [ + -501.741, + 252.402 + ], + [ + -531.684, + 275.189 + ], + [ + -533.305, + 282.888 + ], + [ + -497.138, + 348.272 + ] + ] + ], + [ + [ + [ + -505.709, + 238.835 + ], + [ + -529.664, + 208.048 + ], + [ + -538.051, + 203.69 + ], + [ + -571.344, + 202.063 + ], + [ + -580.877, + 204.675 + ], + [ + -615.926, + 227.817 + ], + [ + -618.653, + 235.626 + ], + [ + -595.256, + 307.344 + ], + [ + -589.505, + 309.138 + ], + [ + -506.654, + 246.088 + ] + ] + ], + [ + [ + [ + -327.735, + 433.349 + ], + [ + -357.701, + 404.64 + ], + [ + -364.815, + 405.012 + ], + [ + -419.813, + 469.997 + ], + [ + -419.101, + 477.201 + ], + [ + -391.067, + 499.484 + ], + [ + -383.399, + 498.965 + ], + [ + -327.578, + 440.701 + ] + ] + ], + [ + [ + [ + -416.566, + 453.777 + ], + [ + -370.603, + 399.467 + ], + [ + -370.998, + 391.9 + ], + [ + -420.203, + 344.759 + ], + [ + -428.508, + 343.678 + ], + [ + -474.846, + 369.311 + ], + [ + -476.437, + 376.103 + ], + [ + -422.885, + 453.471 + ] + ] + ], + [ + [ + [ + -693.729, + 115.362 + ], + [ + -623.468, + 84.5 + ], + [ + -620.29, + 77.456 + ], + [ + -633.47, + 36.21 + ], + [ + -640.184, + 32.103 + ], + [ + -714.537, + 44.363 + ], + [ + -718.205, + 50.199 + ], + [ + -699.953, + 112.463 + ] + ] + ], + [ + [ + [ + -598.04, + 147.082 + ], + [ + -614.675, + 95.025 + ], + [ + -621.019, + 92.162 + ], + [ + -696.588, + 125.356 + ], + [ + -699.766, + 132.4 + ], + [ + -684.454, + 180.315 + ], + [ + -678.018, + 183.402 + ], + [ + -601.311, + 153.902 + ] + ] + ], + [ + [ + [ + -678.849, + 197.855 + ], + [ + -668.52, + 230.178 + ], + [ + -661.885, + 233.899 + ], + [ + -631.69, + 226.535 + ], + [ + -622.298, + 222.438 + ], + [ + -586.721, + 198.947 + ], + [ + -583.965, + 191.129 + ], + [ + -592.435, + 164.622 + ], + [ + -598.871, + 161.535 + ], + [ + -675.578, + 191.035 + ] + ] + ], + [ + [ + [ + -696.044, + 357.97 + ], + [ + -681.399, + 393.22 + ], + [ + -674.206, + 397.865 + ], + [ + -580.32, + 395.012 + ], + [ + -576.735, + 389.911 + ], + [ + -597.624, + 325.878 + ], + [ + -604.181, + 322.548 + ], + [ + -693.096, + 351.555 + ] + ] + ], + [ + [ + [ + -687.659, + 248.419 + ], + [ + -731.548, + 259.122 + ], + [ + -734.605, + 265.156 + ], + [ + -703.113, + 340.955 + ], + [ + -696.175, + 344.144 + ], + [ + -660.268, + 332.43 + ], + [ + -656.937, + 325.874 + ], + [ + -680.995, + 252.13 + ] + ] + ], + [ + [ + [ + -642.775, + 326.723 + ], + [ + -606.662, + 314.942 + ], + [ + -603.331, + 308.386 + ], + [ + -626.055, + 238.732 + ], + [ + -632.719, + 235.021 + ], + [ + -669.761, + 244.054 + ], + [ + -673.2, + 250.229 + ], + [ + -649.331, + 323.393 + ] + ] + ], + [ + [ + [ + -747.292, + 386.899 + ], + [ + -713.937, + 397.364 + ], + [ + -703.778, + 398.763 + ], + [ + -693.156, + 398.44 + ], + [ + -689.954, + 393.48 + ], + [ + -724.908, + 309.347 + ], + [ + -728.46, + 309.506 + ], + [ + -750.697, + 380.381 + ] + ] + ] + ] + }, + { + "type": "MultiPoint", + "id": "trees", + "coordinates": [] + }, + { + "type": "GeometryCollection", + "id": "districts", + "geometries": [ + { + "type": "Polygon", + "name": "Upper District", + "coordinates": [ + [ + [ + -170.192, + -85.882 + ], + [ + -110.316, + -36.802 + ], + [ + -46.605, + 13.374 + ], + [ + 12.575, + 38.498 + ], + [ + 38.753, + -4.011 + ], + [ + 72.478, + -51.614 + ], + [ + 47.345, + -96.742 + ], + [ + -59.653, + -84.786 + ], + [ + -85.439, + -112.738 + ], + [ + -122.275, + -113.151 + ] + ] + ] + }, + { + "type": "Polygon", + "name": "Pale Forge", + "coordinates": [ + [ + [ + -248.244, + -221.168 + ], + [ + -236.941, + -96.022 + ], + [ + -170.192, + -85.882 + ], + [ + -122.275, + -113.151 + ], + [ + -85.439, + -112.738 + ], + [ + -59.653, + -84.786 + ], + [ + 47.345, + -96.742 + ], + [ + 72.478, + -51.614 + ], + [ + 38.753, + -4.011 + ], + [ + 12.575, + 38.498 + ], + [ + 53.218, + 49.063 + ], + [ + 85.613, + 32.918 + ], + [ + 110.663, + -14.451 + ], + [ + 132.027, + -48.465 + ], + [ + 175.531, + -68.551 + ], + [ + 260.991, + -95.964 + ], + [ + 202.393, + -212.216 + ], + [ + 159.866, + -217.825 + ], + [ + 98.43, + -342.824 + ], + [ + 0.203, + -320.565 + ], + [ + -42.982, + -345.497 + ], + [ + -188.409, + -275.381 + ] + ] + ] + }, + { + "type": "Polygon", + "name": "Candleway Park", + "coordinates": [ + [ + [ + -323.779, + -79.203 + ], + [ + -286.379, + 7.307 + ], + [ + -231.415, + 25.058 + ], + [ + -185.172, + 78.607 + ], + [ + -234.838, + 135.376 + ], + [ + -313.597, + 225.605 + ], + [ + -180.814, + 288.74 + ], + [ + -24.599, + 329.25 + ], + [ + 97.883, + 348.273 + ], + [ + 148.043, + 234.556 + ], + [ + 167.877, + 181.898 + ], + [ + 206.764, + 162.489 + ], + [ + 221.371, + 54.568 + ], + [ + 273.516, + 11.629 + ], + [ + 260.991, + -95.964 + ], + [ + 175.531, + -68.551 + ], + [ + 132.027, + -48.465 + ], + [ + 110.663, + -14.451 + ], + [ + 85.613, + 32.918 + ], + [ + 53.218, + 49.063 + ], + [ + 12.575, + 38.498 + ], + [ + -46.605, + 13.374 + ], + [ + -110.316, + -36.802 + ], + [ + -170.192, + -85.882 + ], + [ + -236.941, + -96.022 + ] + ] + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/data_tests/vanilla/mfcg/PaletteMfcgObj.json b/tests/data_tests/vanilla/mfcg/PaletteMfcgObj.json new file mode 100644 index 0000000..febe5ee --- /dev/null +++ b/tests/data_tests/vanilla/mfcg/PaletteMfcgObj.json @@ -0,0 +1,15 @@ +{ + "colorPaper": "#FFF2C8", + "colorDark": "#4C5950", + "colorRoof": "#D6A36E", + "colorWater": "#779988", + "colorGreen": "#C3CC99", + "colorRoad": "#FFF2C8", + "colorWall": "#606661", + "colorTree": "#667755", + "colorLabel": "#2D3D4C", + "colorLight": "#F2F2DA", + "tintMethod": "Spectrum", + "tintStrength": "20", + "weathering": "25" +} \ No newline at end of file From 1b56b5f1b1504f9cad1dc92cbd853e9ce7616685 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 12:47:59 +0100 Subject: [PATCH 16/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.1]=20=20=D1=82=D0=B0=D0=B9=D0=BC=D0=BB=D0=B0=D0=BD=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D1=82=D0=B5=D0=BA=D1=83=D1=88=D0=B5=D0=B9=20?= =?UTF-8?q?=D1=80=D0=B5=D0=BB=D0=B8=D0=B7=D0=BD=D0=BE=D0=B9=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8=20=D0=BF=D0=BB=D1=8E=D1=81=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BA=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8B=D0=BB=D1=8C=20=D1=81=20=D0=B8=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=BE=D0=BC=20=D0=B2=203=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/ToyTown2.js | 76 +- src/js/Village.js | 2 +- src/js/mfcg.js | 2 +- .../cave_tan_antiquewhite.palette.cv.json | 17 + .../Cave/cave_tan_antiquewhite.palette.cv.pb | Bin 0 -> 101 bytes .../1.1.2/Dwellings/DwellingsObj.json | 997 + .../1.1.2/Dwellings/DwellingsObj.pb | Bin 0 -> 1461 bytes .../1.1.2/Dwellings/PaletteDwellingsObj.json | 24 + .../1.1.2/Dwellings/PaletteDwellingsObj.pb | Bin 0 -> 143 bytes .../1.1.2/ToyTown2/PaletteCaveObj.json | 23 + .../1.1.2/ToyTown2/PaletteCaveObj.pb | Bin 0 -> 173 bytes .../1.1.2/ToyTown2/PaletteGladeObj.json | 27 + .../1.1.2/ToyTown2/PaletteGladeObj.pb | Bin 0 -> 171 bytes tests/data_tests/1.1.2/Village/GeoObj.json | 6465 ++++ tests/data_tests/1.1.2/Village/GeoObj.pb | Bin 0 -> 41349 bytes .../1.1.2/Village/PaletteVillageObj.json | 72 + .../1.1.2/Village/PaletteVillageObj.pb | Bin 0 -> 362 bytes tests/data_tests/1.1.2/mfcg/GeoObj.json | 30543 ++++++++++++++++ tests/data_tests/1.1.2/mfcg/GeoObj.pb | Bin 0 -> 175207 bytes .../data_tests/1.1.2/mfcg/PaletteMfcgObj.json | 15 + tests/data_tests/1.1.2/mfcg/PaletteMfcgObj.pb | 3 + 21 files changed, 38237 insertions(+), 29 deletions(-) create mode 100644 tests/data_tests/1.1.2/Cave/cave_tan_antiquewhite.palette.cv.json create mode 100644 tests/data_tests/1.1.2/Cave/cave_tan_antiquewhite.palette.cv.pb create mode 100644 tests/data_tests/1.1.2/Dwellings/DwellingsObj.json create mode 100644 tests/data_tests/1.1.2/Dwellings/DwellingsObj.pb create mode 100644 tests/data_tests/1.1.2/Dwellings/PaletteDwellingsObj.json create mode 100644 tests/data_tests/1.1.2/Dwellings/PaletteDwellingsObj.pb create mode 100644 tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.json create mode 100644 tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.pb create mode 100644 tests/data_tests/1.1.2/ToyTown2/PaletteGladeObj.json create mode 100644 tests/data_tests/1.1.2/ToyTown2/PaletteGladeObj.pb create mode 100644 tests/data_tests/1.1.2/Village/GeoObj.json create mode 100644 tests/data_tests/1.1.2/Village/GeoObj.pb create mode 100644 tests/data_tests/1.1.2/Village/PaletteVillageObj.json create mode 100644 tests/data_tests/1.1.2/Village/PaletteVillageObj.pb create mode 100644 tests/data_tests/1.1.2/mfcg/GeoObj.json create mode 100644 tests/data_tests/1.1.2/mfcg/GeoObj.pb create mode 100644 tests/data_tests/1.1.2/mfcg/PaletteMfcgObj.json create mode 100644 tests/data_tests/1.1.2/mfcg/PaletteMfcgObj.pb diff --git a/src/js/ToyTown2.js b/src/js/ToyTown2.js index 847fe46..6750ebd 100644 --- a/src/js/ToyTown2.js +++ b/src/js/ToyTown2.js @@ -10,7 +10,20 @@ import * as DataViewer from "./shared/data/Viewer.js"; import * as DataProto from "./struct/data.js"; const params = FuncProto.initParams(JSON.parse(String.raw`{{EMBED_PARAMETERS_JSON_VIEWER}}`)); -let GetParamName = new URLSearchParams(window.location.search).get('name') || ''; +const baseTitle = document.title; +let mapName = ""; +let isLockedMap = false; +const setMapName = (name) => { + mapName = name || ""; + document.title = mapName !== "" ? `${baseTitle} | ${mapName}` : baseTitle; + if (params && params.meta && params.meta.about && params.meta.about.params) { + if (mapName !== "") { + params.meta.about.params["Map Name"] = mapName; + } else { + delete params.meta.about.params["Map Name"]; + } + } +}; const isFrame = typeof window.parent.pingFrame === "function" if (params !== null) (function (S, u) { @@ -15447,7 +15460,7 @@ if (params !== null) (function (S, u) { var d = [ new Ke("Load", p(this, this.onLoad)), - new Ke("Apply", function () {if (GetParamName === "") {a(c.getPalette());}}), + new Ke("Apply", function () {a(c.getPalette());}), exportBtn, ]; if (null != b) { @@ -15494,9 +15507,7 @@ if (params !== null) (function (S, u) { }) }, onEnter: function () { - if (GetParamName === "") { - this.onApply(this.getPalette()); - } + this.onApply(this.getPalette()); }, layout: function () { null != this.tabs && this.tabs.layout(); @@ -16648,7 +16659,7 @@ if (params !== null) (function (S, u) { Oe.onDrop = function (a) { a.preventDefault(); a.stopPropagation(); - if (0 < a.dataTransfer.files.length && GetParamName == "") { + if (0 < a.dataTransfer.files.length && !isLockedMap) { var b = a.dataTransfer.files[0], c = new FileReader; c.onload = function (a) { @@ -18152,7 +18163,7 @@ if (params !== null) (function (S, u) { }); var bc = function (a, b) { this.scale = 1; - this.name = (new Yc(a)).file; + this.name = b != null && b.name != null && b.name !== "" ? b.name : (new Yc(a)).file; bc.points = []; this.buildings = []; this.walls = []; @@ -18749,7 +18760,7 @@ if (params !== null) (function (S, u) { onKey: function (a, b) { if (!this.navMode.onKey(a, b) && b) switch (a) { case 13: - if (GetParamName === "") this.loadSample(); + if (!isLockedMap) this.loadSample(); break; case 48: this.switchStyle(this.keyShift ? aa.getRandom() : @@ -18836,7 +18847,7 @@ if (params !== null) (function (S, u) { this.stage.window.set_mouseLock(this.btnRight) }, onTap: function (a) { - this.tapOK && GetParamName === "" && this.loadSample() + this.tapOK && !isLockedMap && this.loadSample() }, onContext: function (a) { var b = this; @@ -18858,8 +18869,8 @@ if (params !== null) (function (S, u) { function () { b.setMode(b.navMode == b.modeFly ? b.modeFree : b.modeFly) }, this.navMode == this.modeFly); - a.addItem("New view", p(this, GetParamName != ""? null:this.loadSample)); - a.addItem("Import...", p(this, GetParamName != ""? null:this.loadExternal)); + a.addItem("New view", p(this, isLockedMap ? null : this.loadSample)); + a.addItem("Import...", p(this, isLockedMap ? null : this.loadExternal)); a.addItem("Export as OBJ", p(this, this.export)); a.addSeparator(); a.addSubmenu("View", c); @@ -18909,11 +18920,13 @@ if (params !== null) (function (S, u) { null != a && b.removeItem("{{LOCALSTORAGE_TOWN_BUF}}") } } catch (c) { - GetParamName = ""; + isLockedMap = false; + setMapName(""); Ia.lastError = c } if (null == a) { - GetParamName = ""; + isLockedMap = false; + setMapName(""); this.loadSample(); return } @@ -18922,23 +18935,32 @@ if (params !== null) (function (S, u) { if ("p" === d) { var f = new Uint8Array(e.length); for (var h = 0; h < e.length;) f[h] = e.charCodeAt(h) & 255, ++h; - !1 === this.load("mfcg.pb", f.buffer) && this.loadSample() + if (!1 === this.load("mfcg.pb", f.buffer)) { + isLockedMap = false; + setMapName(""); + this.loadSample(); + return + } } else if ("j" === d) { - !1 === this.load("mfcg.json", e) && this.loadSample() + if (!1 === this.load("mfcg.json", e)) { + isLockedMap = false; + setMapName(""); + this.loadSample(); + return + } } else { - GetParamName = ""; + isLockedMap = false; + setMapName(""); Ma.showMessage("Invalid exchange data"); - this.loadSample() + this.loadSample(); + return } - - if(GetParamName != ""){ - document.title = document.title + ' | ' + GetParamName; - - const url = new URL(window.location.href); - url.searchParams.delete('name'); - window.history.replaceState({}, '', url); - - params.meta.about.params["Map Name"] = GetParamName; + isLockedMap = true; + setMapName(bc.instance != null ? bc.instance.name : ""); + const url = new URL(window.location.href); + if (url.searchParams.has("name")) { + url.searchParams.delete("name"); + window.history.replaceState({}, "", url); } }, loadSample: function () { @@ -50356,4 +50378,4 @@ if (params !== null) (function (S, u) { }; LimeShared.registerLimeProject(S, u, "ToyTown2", S.lime.$scripts.ToyTown2); LimeShared.registerAmdLime(S); -})("undefined" != typeof exports ? exports : "function" == typeof define && define.amd ? {} : "undefined" != typeof window ? window : "undefined" != typeof self ? self : this, "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this); \ No newline at end of file +})("undefined" != typeof exports ? exports : "function" == typeof define && define.amd ? {} : "undefined" != typeof window ? window : "undefined" != typeof self ? self : this, "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this); diff --git a/src/js/Village.js b/src/js/Village.js index 96c9266..9daa13b 100644 --- a/src/js/Village.js +++ b/src/js/Village.js @@ -16238,7 +16238,7 @@ var $lime_init = function (E, u) { } window.localStorage.setItem("{{LOCALSTORAGE_TOWN_BUF}}", "p" + d); - this.goToViewer(inNewWindow, a.name); + this.goToViewer(inNewWindow); } catch (g) { Qa.lastError = g; w.showDialog(new ej("" + g)); diff --git a/src/js/mfcg.js b/src/js/mfcg.js index b7afbf9..14a2f86 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -14386,7 +14386,7 @@ var $lime_init = function (A, t) { e = f } window.localStorage.setItem("{{LOCALSTORAGE_TOWN_BUF}}", "p" + d); - this.goToViewer(inNewWindow, a.name) + this.goToViewer(inNewWindow) } catch (g) { Ta.lastError = g; u.showDialog(new Wj("" + g)) diff --git a/tests/data_tests/1.1.2/Cave/cave_tan_antiquewhite.palette.cv.json b/tests/data_tests/1.1.2/Cave/cave_tan_antiquewhite.palette.cv.json new file mode 100644 index 0000000..b493794 --- /dev/null +++ b/tests/data_tests/1.1.2/Cave/cave_tan_antiquewhite.palette.cv.json @@ -0,0 +1,17 @@ +{ + "colorPage": "#ccbba3", + "colorFloor": "#ebe3d3", + "colorWater": "#bcb0a0", + "colorInk": "#000000", + "shadeAlpha": "0.2", + "shadowAlpha": "0.4", + "shadowDist": "1.0", + "strokeWall": "3.0", + "strokeDetail": "2.0", + "strokeHatch": "1.2", + "strokeGrid": "0.3", + "hatchingStrokes": "5", + "hatchingSize": "0.6", + "hatchingDistance": "0.15", + "hatchingStones": "0.3" +} \ No newline at end of file diff --git a/tests/data_tests/1.1.2/Cave/cave_tan_antiquewhite.palette.cv.pb b/tests/data_tests/1.1.2/Cave/cave_tan_antiquewhite.palette.cv.pb new file mode 100644 index 0000000000000000000000000000000000000000..c6cbdae1a95e197874b2a61e4941ba309a78871f GIT binary patch literal 101 zcmdn#=#)KAi*HS&wKWa zkDch*GiU5%85kPur9^lc7#ti#8GxkhteG?IRe^+^k{}1G=&YHN_CO&?JFpM{ju077 literal 0 HcmV?d00001 diff --git a/tests/data_tests/1.1.2/Dwellings/DwellingsObj.json b/tests/data_tests/1.1.2/Dwellings/DwellingsObj.json new file mode 100644 index 0000000..b2f8aea --- /dev/null +++ b/tests/data_tests/1.1.2/Dwellings/DwellingsObj.json @@ -0,0 +1,997 @@ +{ + "floors": [ + { + "level": 0, + "rooms": [ + { + "cells": [ + { + "i": 2, + "j": 6 + }, + { + "i": 3, + "j": 6 + } + ] + }, + { + "name": "Armoury", + "cells": [ + { + "i": 1, + "j": 4 + }, + { + "i": 0, + "j": 4 + }, + { + "i": 1, + "j": 5 + }, + { + "i": 0, + "j": 5 + }, + { + "i": 1, + "j": 6 + }, + { + "i": 0, + "j": 6 + } + ] + }, + { + "name": "Kitchen", + "cells": [ + { + "i": 2, + "j": 5 + }, + { + "i": 3, + "j": 5 + }, + { + "i": 2, + "j": 4 + }, + { + "i": 3, + "j": 4 + } + ] + }, + { + "name": "Stairhall", + "cells": [ + { + "i": 6, + "j": 2 + }, + { + "i": 5, + "j": 2 + }, + { + "i": 6, + "j": 1 + }, + { + "i": 5, + "j": 1 + }, + { + "i": 4, + "j": 1 + }, + { + "i": 4, + "j": 2 + } + ] + }, + { + "name": "Corridor", + "cells": [ + { + "i": 4, + "j": 3 + }, + { + "i": 5, + "j": 3 + }, + { + "i": 6, + "j": 3 + } + ] + }, + { + "name": "Bathroom", + "cells": [ + { + "i": 3, + "j": 1 + }, + { + "i": 2, + "j": 1 + }, + { + "i": 3, + "j": 0 + }, + { + "i": 2, + "j": 0 + } + ] + }, + { + "name": "Hall", + "cells": [ + { + "i": 1, + "j": 0 + }, + { + "i": 1, + "j": 1 + }, + { + "i": 1, + "j": 2 + }, + { + "i": 1, + "j": 3 + }, + { + "i": 2, + "j": 2 + }, + { + "i": 2, + "j": 3 + }, + { + "i": 3, + "j": 2 + }, + { + "i": 3, + "j": 3 + } + ] + } + ], + "doors": [ + { + "edge": { + "cell": { + "i": 2, + "j": 6 + }, + "dir": "n" + }, + "type": "REGULAR" + }, + { + "edge": { + "cell": { + "i": 3, + "j": 6 + }, + "dir": "w" + }, + "type": "REGULAR" + }, + { + "edge": { + "cell": { + "i": 3, + "j": 4 + }, + "dir": "w" + }, + "type": "REGULAR" + }, + { + "edge": { + "cell": { + "i": 6, + "j": 2 + }, + "dir": "e" + } + }, + { + "edge": { + "cell": { + "i": 4, + "j": 1 + }, + "dir": "n" + }, + "type": "REGULAR" + }, + { + "edge": { + "cell": { + "i": 4, + "j": 3 + }, + "dir": "n" + } + } + ], + "windows": [ + { + "cell": { + "i": 3, + "j": 0 + }, + "dir": "s" + }, + { + "cell": { + "i": 3, + "j": 5 + }, + "dir": "s" + }, + { + "cell": { + "i": 3, + "j": 4 + }, + "dir": "s" + }, + { + "cell": { + "i": 1, + "j": 0 + }, + "dir": "w" + }, + { + "cell": { + "i": 4, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 5, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 6, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 1, + "j": 0 + }, + "dir": "n" + }, + { + "cell": { + "i": 1, + "j": 2 + }, + "dir": "n" + }, + { + "cell": { + "i": 1, + "j": 3 + }, + "dir": "n" + }, + { + "cell": { + "i": 2, + "j": 6 + }, + "dir": "e" + }, + { + "cell": { + "i": 3, + "j": 6 + }, + "dir": "e" + }, + { + "cell": { + "i": 6, + "j": 2 + }, + "dir": "s" + }, + { + "cell": { + "i": 6, + "j": 1 + }, + "dir": "s" + } + ], + "stairs": [ + { + "cell": { + "i": 5, + "j": 1 + }, + "dir": "w", + "up": true + }, + { + "cell": { + "i": 5, + "j": 2 + }, + "dir": "DIRECTION_TYPE_UNSPECIFIED", + "up": false + } + ] + }, + { + "level": 1, + "rooms": [ + { + "name": "Stairhall", + "cells": [ + { + "i": 6, + "j": 3 + }, + { + "i": 6, + "j": 2 + }, + { + "i": 6, + "j": 1 + } + ] + }, + { + "name": "Stairhall", + "cells": [ + { + "i": 5, + "j": 1 + }, + { + "i": 4, + "j": 1 + }, + { + "i": 5, + "j": 2 + }, + { + "i": 4, + "j": 2 + }, + { + "i": 5, + "j": 3 + }, + { + "i": 4, + "j": 3 + } + ] + }, + { + "name": "Library", + "cells": [ + { + "i": 3, + "j": 1 + }, + { + "i": 2, + "j": 1 + }, + { + "i": 3, + "j": 0 + }, + { + "i": 2, + "j": 0 + } + ] + }, + { + "name": "Living room", + "cells": [ + { + "i": 1, + "j": 0 + }, + { + "i": 1, + "j": 1 + }, + { + "i": 1, + "j": 2 + }, + { + "i": 1, + "j": 3 + }, + { + "i": 2, + "j": 2 + }, + { + "i": 2, + "j": 3 + }, + { + "i": 3, + "j": 2 + }, + { + "i": 3, + "j": 3 + } + ] + }, + { + "name": "Bedroom", + "cells": [ + { + "i": 2, + "j": 4 + }, + { + "i": 2, + "j": 5 + }, + { + "i": 3, + "j": 4 + }, + { + "i": 3, + "j": 5 + }, + { + "i": 3, + "j": 6 + }, + { + "i": 2, + "j": 6 + } + ] + } + ], + "doors": [ + { + "edge": { + "cell": { + "i": 6, + "j": 3 + }, + "dir": "n" + } + }, + { + "edge": { + "cell": { + "i": 4, + "j": 1 + }, + "dir": "n" + } + }, + { + "edge": { + "cell": { + "i": 2, + "j": 0 + }, + "dir": "n" + } + }, + { + "edge": { + "cell": { + "i": 2, + "j": 3 + }, + "dir": "e" + }, + "type": "REGULAR" + } + ], + "windows": [ + { + "cell": { + "i": 1, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 1, + "j": 0 + }, + "dir": "n" + }, + { + "cell": { + "i": 1, + "j": 1 + }, + "dir": "n" + }, + { + "cell": { + "i": 1, + "j": 2 + }, + "dir": "n" + }, + { + "cell": { + "i": 1, + "j": 3 + }, + "dir": "n" + }, + { + "cell": { + "i": 1, + "j": 0 + }, + "dir": "w" + }, + { + "cell": { + "i": 3, + "j": 6 + }, + "dir": "s" + }, + { + "cell": { + "i": 3, + "j": 5 + }, + "dir": "s" + }, + { + "cell": { + "i": 3, + "j": 4 + }, + "dir": "s" + }, + { + "cell": { + "i": 4, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 5, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 3, + "j": 0 + }, + "dir": "w" + }, + { + "cell": { + "i": 2, + "j": 0 + }, + "dir": "w" + }, + { + "cell": { + "i": 6, + "j": 3 + }, + "dir": "s" + }, + { + "cell": { + "i": 6, + "j": 2 + }, + "dir": "s" + }, + { + "cell": { + "i": 6, + "j": 1 + }, + "dir": "s" + }, + { + "cell": { + "i": 3, + "j": 0 + }, + "dir": "s" + }, + { + "cell": { + "i": 5, + "j": 1 + }, + "dir": "w" + }, + { + "cell": { + "i": 4, + "j": 1 + }, + "dir": "w" + } + ], + "stairs": [ + { + "cell": { + "i": 5, + "j": 1 + }, + "dir": "s", + "up": false + }, + { + "cell": { + "i": 6, + "j": 1 + }, + "dir": "w", + "up": true + } + ] + }, + { + "level": 2, + "rooms": [ + { + "name": "Room", + "cells": [ + { + "i": 4, + "j": 3 + }, + { + "i": 5, + "j": 3 + }, + { + "i": 4, + "j": 2 + }, + { + "i": 5, + "j": 2 + }, + { + "i": 4, + "j": 1 + }, + { + "i": 5, + "j": 1 + }, + { + "i": 6, + "j": 1 + }, + { + "i": 6, + "j": 2 + }, + { + "i": 6, + "j": 3 + } + ] + }, + { + "name": "Bedroom", + "cells": [ + { + "i": 1, + "j": 0 + }, + { + "i": 1, + "j": 1 + }, + { + "i": 1, + "j": 2 + }, + { + "i": 1, + "j": 3 + }, + { + "i": 2, + "j": 2 + }, + { + "i": 2, + "j": 3 + }, + { + "i": 3, + "j": 2 + }, + { + "i": 3, + "j": 3 + } + ] + }, + { + "name": "Room", + "cells": [ + { + "i": 3, + "j": 1 + }, + { + "i": 2, + "j": 1 + }, + { + "i": 3, + "j": 0 + }, + { + "i": 2, + "j": 0 + } + ] + } + ], + "doors": [ + { + "edge": { + "cell": { + "i": 4, + "j": 1 + }, + "dir": "n" + } + }, + { + "edge": { + "cell": { + "i": 1, + "j": 0 + }, + "dir": "s" + }, + "type": "REGULAR" + } + ], + "windows": [ + { + "cell": { + "i": 1, + "j": 0 + }, + "dir": "w" + }, + { + "cell": { + "i": 1, + "j": 0 + }, + "dir": "n" + }, + { + "cell": { + "i": 1, + "j": 1 + }, + "dir": "n" + }, + { + "cell": { + "i": 1, + "j": 2 + }, + "dir": "n" + }, + { + "cell": { + "i": 1, + "j": 3 + }, + "dir": "n" + }, + { + "cell": { + "i": 4, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 5, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 6, + "j": 3 + }, + "dir": "e" + }, + { + "cell": { + "i": 6, + "j": 3 + }, + "dir": "s" + }, + { + "cell": { + "i": 6, + "j": 2 + }, + "dir": "s" + }, + { + "cell": { + "i": 6, + "j": 1 + }, + "dir": "s" + }, + { + "cell": { + "i": 6, + "j": 1 + }, + "dir": "w" + }, + { + "cell": { + "i": 5, + "j": 1 + }, + "dir": "w" + }, + { + "cell": { + "i": 4, + "j": 1 + }, + "dir": "w" + }, + { + "cell": { + "i": 3, + "j": 0 + }, + "dir": "w" + }, + { + "cell": { + "i": 2, + "j": 0 + }, + "dir": "w" + } + ], + "stairs": [ + { + "cell": { + "i": 6, + "j": 1 + }, + "dir": "s", + "up": false + } + ] + }, + { + "level": -1, + "rooms": [ + { + "name": "Cellar", + "cells": [ + { + "i": 6, + "j": 3 + }, + { + "i": 5, + "j": 3 + }, + { + "i": 6, + "j": 2 + }, + { + "i": 5, + "j": 2 + }, + { + "i": 6, + "j": 1 + }, + { + "i": 5, + "j": 1 + }, + { + "i": 4, + "j": 1 + }, + { + "i": 4, + "j": 2 + }, + { + "i": 4, + "j": 3 + } + ] + } + ], + "doors": [], + "windows": [], + "stairs": [ + { + "cell": { + "i": 5, + "j": 2 + }, + "dir": "DIRECTION_TYPE_UNSPECIFIED", + "up": true + } + ] + } + ], + "exit": { + "cell": { + "i": 1, + "j": 1 + }, + "dir": "n" + } +} \ No newline at end of file diff --git a/tests/data_tests/1.1.2/Dwellings/DwellingsObj.pb b/tests/data_tests/1.1.2/Dwellings/DwellingsObj.pb new file mode 100644 index 0000000000000000000000000000000000000000..309caac5a6223b71f9155db4a9ddc570f4e183f6 GIT binary patch literal 1461 zcmb7^OH1TH6opfdj+q)4MOKZB!{|~N+zEmT>P8q>%KU(+jU8wWgjVq9y7outIkz5Z z+eR^q%gIeWZk_K|+^eaIdcC%l_9dc0{Oi_^`@8O;e?mfei&#ihek7Vv$?yVk%dP!u z=hxH8JQaY8N^-p<8t1#{j{0QFsSqzaU`+yN;IPtZIS=ws?)CT+ncVJypb`C zr8o7qt4^BvwC}n*WQ@$x5{)mA(TID_o`v0%X$2c(u*dP?gtF;nY##oT5;lx1u=1h#F;u^Tr&52T!AS9BLUs*|FMTU8rSTxEE8YdUKgj@R|;h&=No_f)4>#z({CZ zkkfDsHpO{+)i=^Zs|g*tpXcpkdw=^Ug8UXJcInCFCQc2lmYR_V$D7Yoxpm6BLBqj9ZjiV=q%wHy9k6c zYY-OA4gh!etSem~IC~K;4_OV|hHIJFk~141U0Re=?=L$4J!rr4#w&Z`9hpFbe&U8j zzmqG>CI+9;SmiPuP50w7Z^bd$cgfrA`~s`&F>loW>NP#8K62&hWHxK~BcprC?XQ1= Pa+C5!RW+|He=zC|z~*af literal 0 HcmV?d00001 diff --git a/tests/data_tests/1.1.2/Dwellings/PaletteDwellingsObj.json b/tests/data_tests/1.1.2/Dwellings/PaletteDwellingsObj.json new file mode 100644 index 0000000..e045d25 --- /dev/null +++ b/tests/data_tests/1.1.2/Dwellings/PaletteDwellingsObj.json @@ -0,0 +1,24 @@ +{ + "colorInk": "#000000", + "colorPaper": "#f2edde", + "colorFloor": "#8b796b", + "colorWalls": "#b2b2b2", + "colorProps": "#b29c85", + "colorWindows": "#8c8c8c", + "colorStairs": "#a58f7d", + "colorRoof": "#b27559", + "colorLabels": "#e5d6b7", + "strNormal10": "0.2", + "strGrid10": "0.2", + "alphaGrid": "0.4", + "alphaAO": "0.5", + "alphaLights": "0.6", + "fontRoom": { + "face": "", + "size": 28, + "bold": false, + "italic": false, + "embedded": "ui_font" + }, + "hatching": "false" +} \ No newline at end of file diff --git a/tests/data_tests/1.1.2/Dwellings/PaletteDwellingsObj.pb b/tests/data_tests/1.1.2/Dwellings/PaletteDwellingsObj.pb new file mode 100644 index 0000000000000000000000000000000000000000..a9e42108564d8f42a2b518091ae5ec41be985a37 GIT binary patch literal 143 zcmd;z=3?Vu5MYpC5aQ(c#3=BVQQ{t>6gx*Zqd=uZwh|}DCPslxj1rp|wZP0dj1sMk zMw}cyi~>E35%hN nvd`FwGB7aM%g&l9X|E*6#ULOf!JxpP#a@~jpO&9jqQL+FeEcA! literal 0 HcmV?d00001 diff --git a/tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.json b/tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.json new file mode 100644 index 0000000..3d2bee9 --- /dev/null +++ b/tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.json @@ -0,0 +1,23 @@ +{ + "ground": "#a59a63", + "fields": "#8c7b5b", + "greens": "#80804d", + "foliage": "#80804d", + "roads": "#bbaa88", + "water": "#294766", + "walls1": "#fffbf2", + "walls2": "#c1ccc1", + "roofs1": "#80664d", + "roofs2": "#665647", + "sky1": "#88ccff", + "sky2": "#ddeeff", + "sun": "#fffff0", + "windows": "#ffffff", + "sun_pos": "60.0", + "ambience": "0.6", + "lighted": "0.0", + "pitch": "1.0", + "roofedTowers": "true", + "towers": "Round", + "tree_shape": "Ellipsoid" +} \ No newline at end of file diff --git a/tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.pb b/tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.pb new file mode 100644 index 0000000000000000000000000000000000000000..cc735cc712b9ff286e9f8f6c0bfa3ccea28f4f1f GIT binary patch literal 173 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 Itl0bi0QVCCR{#J2 literal 0 HcmV?d00001 diff --git a/tests/data_tests/1.1.2/Village/PaletteVillageObj.json b/tests/data_tests/1.1.2/Village/PaletteVillageObj.json new file mode 100644 index 0000000..3073d48 --- /dev/null +++ b/tests/data_tests/1.1.2/Village/PaletteVillageObj.json @@ -0,0 +1,72 @@ +{ + "ground": [ + "#85a478", + "#687f64", + "#a0b78d" + ], + "relief": "Grass", + "sand": "#c5beac", + "plank": "#bd9d86", + "roofLight": [ + "#bd9d86", + "#bd9d86", + "#95a5a5" + ], + "roofStroke": "#010206", + "roofVariance": "0.2", + "roofSlope": "0.5", + "roofType": "Gable", + "road": "#c5beac", + "largeRoad": "6.0", + "smallRoad": "2.0", + "outlineRoads": "Soft", + "mergeRoads": "true", + "fieldLight": [ + "#8c7a70", + "#7f716d" + ], + "fieldFurrow": "#4c4341", + "fieldVariance": "0.2", + "outlineFields": "Soft", + "waterShallow": "#5b99a6", + "waterDeep": "#4c8699", + "waterTide": "#a3c9cc", + "shallowBands": "1", + "tree": [ + "#4f6b65", + "#5b7f6b" + ], + "thicket": "#4f6b65", + "treeDetails": "#010206", + "treeVariance": "0.2", + "treeShape": "Cotton", + "shadowColor": "#9699ae", + "shadowLength": "1.0", + "shadowAngle": "30", + "lights": "#000000", + "fontHeader": { + "face": null, + "size": 48, + "bold": false, + "italic": false, + "embedded": "def_font" + }, + "fontPopulation": { + "face": null, + "size": 24, + "bold": false, + "italic": false, + "embedded": "def_font" + }, + "fontNumber": { + "face": null, + "size": 24, + "bold": false, + "italic": false, + "embedded": "def_font" + }, + "ink": "#010206", + "paper": "#c5beac", + "strokeNormal": "1.0", + "strokeThin": "0.5" +} \ No newline at end of file diff --git a/tests/data_tests/1.1.2/Village/PaletteVillageObj.pb b/tests/data_tests/1.1.2/Village/PaletteVillageObj.pb new file mode 100644 index 0000000000000000000000000000000000000000..0237d3d0b850ae7785f9d0ccd8effff45cfe19f7 GIT binary patch literal 362 zcmZXPJxc>Y5Qg_X;hfuQSP;gAll35Yq!J+(7GBg&0{(y$Hc1eIUtl3NNn)MB8Okp-6?Ltn2&m@gL;T^WWmnU75G9< z)T76za;Ss`@5ok32vK!eRhvA7Ji(EU29P1t?*aS;86#kAMc?jmSK4|uHA`0+W$k}$ zDifO=8(u|jF@e26Mf!y-Wic5xVz$>U^QxF&s?=(C_B+Q%XO3BBJN{p1H`Pze$nGzs J=Ia+_`X6R*Lb?C| literal 0 HcmV?d00001 diff --git a/tests/data_tests/1.1.2/mfcg/GeoObj.json b/tests/data_tests/1.1.2/mfcg/GeoObj.json new file mode 100644 index 0000000..05ec556 --- /dev/null +++ b/tests/data_tests/1.1.2/mfcg/GeoObj.json @@ -0,0 +1,30543 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": "values", + "roadWidth": 8, + "towerRadius": 7.6, + "wallThickness": 7.6, + "generator": "mfcg", + "version": "0.11.5" + }, + { + "type": "Polygon", + "id": "earth", + "coordinates": [ + [ + [ + -1696.372, + 526.846 + ], + [ + -1584.682, + 700.541 + ], + [ + -1678.071, + 903.017 + ], + [ + -1541.864, + 1079.237 + ], + [ + -1347.009, + 995.871 + ], + [ + -1137.705, + 1140.136 + ], + [ + -1388.502, + 1689.869 + ], + [ + -770.779, + 1470.991 + ], + [ + -713.11, + 1459.381 + ], + [ + -691.104, + 1531.152 + ], + [ + -227.585, + 1736.532 + ], + [ + -132.374, + 1889.562 + ], + [ + 26.132, + 1768.983 + ], + [ + 60.57, + 1748.646 + ], + [ + 470.326, + 1802.757 + ], + [ + 893.134, + 2032.424 + ], + [ + 961.252, + 2092.886 + ], + [ + 950.007, + 1699.213 + ], + [ + 1056.857, + 1151.157 + ], + [ + 1077.936, + 1143.849 + ], + [ + 1625.129, + 1476.771 + ], + [ + 1565.991, + 896.364 + ], + [ + 1611.683, + 785.33 + ], + [ + 1849.696, + 610.215 + ], + [ + 1739.099, + 266.686 + ], + [ + 1742.869, + 232.222 + ], + [ + 1743.844, + 231.189 + ], + [ + 1767.252, + -264.7 + ], + [ + 1461.163, + -310.25 + ], + [ + 1438.414, + -407.382 + ], + [ + 2087.598, + -587.293 + ], + [ + 1497.288, + -691.924 + ], + [ + 1481.502, + -679.407 + ], + [ + 1201.547, + -811.122 + ], + [ + 1204.723, + -843.415 + ], + [ + 1580.82, + -1435.012 + ], + [ + 1174.159, + -1274.664 + ], + [ + 1136.069, + -1133.18 + ], + [ + 1007.609, + -980.602 + ], + [ + 880.467, + -805.937 + ], + [ + 779.128, + -621.266 + ], + [ + 717.588, + -483.955 + ], + [ + 740.889, + -402.12 + ], + [ + 816.78, + -336.231 + ], + [ + 831.449, + -264.479 + ], + [ + 758.179, + -186.085 + ], + [ + 654.54, + -118.738 + ], + [ + 544.473, + -88.385 + ], + [ + 436.525, + -76.675 + ], + [ + 354.854, + -41.962 + ], + [ + 304.283, + 7.282 + ], + [ + 262.433, + 31.316 + ], + [ + 216.258, + 12.737 + ], + [ + 172.912, + -22.207 + ], + [ + 134.174, + -30.744 + ], + [ + 93.878, + -18.891 + ], + [ + 50.273, + -17.998 + ], + [ + 1.2, + -17.644 + ], + [ + -55.147, + 5.195 + ], + [ + -111.88, + 48.224 + ], + [ + -168.919, + 107.219 + ], + [ + -243.555, + 186.018 + ], + [ + -341.156, + 271.788 + ], + [ + -440.869, + 336.053 + ], + [ + -531.758, + 378.633 + ], + [ + -627.139, + 422.697 + ], + [ + -745.588, + 451.985 + ], + [ + -901.472, + 444.916 + ], + [ + -1084.846, + 438.434 + ], + [ + -1269.275, + 440.087 + ], + [ + -1440.129, + 396.36 + ], + [ + -1591.616, + 300.437 + ] + ] + ] + }, + { + "type": "GeometryCollection", + "id": "roads", + "geometries": [ + { + "type": "LineString", + "width": 8, + "coordinates": [ + [ + -16.581, + 62.617 + ], + [ + 28.534, + 116.457 + ], + [ + 59.728, + 180.172 + ], + [ + 94.164, + 246.568 + ], + [ + 143.639, + 306.912 + ], + [ + 195.029, + 360.774 + ], + [ + 238.573, + 420.712 + ], + [ + 276.245, + 498.027 + ], + [ + 450.714, + 687.673 + ], + [ + 598.3, + 867.016 + ], + [ + 706.825, + 1002.853 + ], + [ + 760.739, + 1095.011 + ], + [ + 765.081, + 1170.946 + ], + [ + 950.007, + 1699.213 + ] + ] + }, + { + "type": "LineString", + "width": 8, + "coordinates": [ + [ + -16.581, + 62.617 + ], + [ + -42.127, + 104.255 + ], + [ + -61.182, + 145.806 + ], + [ + -82.271, + 197.648 + ], + [ + -127.611, + 278.675 + ], + [ + -202.743, + 400.002 + ], + [ + -291.078, + 551.001 + ], + [ + -376.936, + 734.112 + ], + [ + -489.061, + 872.159 + ], + [ + -628.612, + 961.091 + ], + [ + -791.299, + 1021.471 + ], + [ + -951.009, + 1069.499 + ], + [ + -1080.929, + 1118.68 + ], + [ + -770.779, + 1470.991 + ] + ] + }, + { + "type": "LineString", + "width": 8, + "coordinates": [ + [ + 94.164, + 246.568 + ], + [ + 48.097, + 334.476 + ], + [ + 26.135, + 437.135 + ], + [ + -62.779, + 594.559 + ] + ] + } + ] + }, + { + "type": "GeometryCollection", + "id": "walls", + "geometries": [ + { + "type": "Polygon", + "width": 7.6, + "coordinates": [ + [ + [ + -531.758, + 378.633 + ], + [ + -412.632, + 476.566 + ], + [ + -291.078, + 551.001 + ], + [ + -191.193, + 608.982 + ], + [ + -104.837, + 515.157 + ], + [ + -62.779, + 594.559 + ], + [ + -39.228, + 705.454 + ], + [ + 141.269, + 618.716 + ], + [ + 276.245, + 498.027 + ], + [ + 411.221, + 377.338 + ], + [ + 505.386, + 292.161 + ], + [ + 591.028, + 225.628 + ], + [ + 628.156, + 125.58 + ], + [ + 665.285, + 25.532 + ], + [ + 654.54, + -118.738 + ], + [ + 544.473, + -88.385 + ], + [ + 436.525, + -76.675 + ], + [ + 354.854, + -41.962 + ], + [ + 304.283, + 7.282 + ], + [ + 262.433, + 31.316 + ], + [ + 216.258, + 12.737 + ], + [ + 172.912, + -22.207 + ], + [ + 134.174, + -30.744 + ], + [ + 93.878, + -18.891 + ], + [ + 50.273, + -17.998 + ], + [ + 1.2, + -17.644 + ], + [ + -55.147, + 5.195 + ], + [ + -111.88, + 48.224 + ], + [ + -168.919, + 107.219 + ], + [ + -243.555, + 186.018 + ], + [ + -341.156, + 271.788 + ], + [ + -440.869, + 336.053 + ] + ] + ] + }, + { + "type": "Polygon", + "width": 7.6, + "coordinates": [ + [ + [ + -104.837, + 515.157 + ], + [ + -191.193, + 608.982 + ], + [ + -143.402, + 716.711 + ], + [ + -39.228, + 705.454 + ], + [ + -62.779, + 594.559 + ] + ] + ] + } + ] + }, + { + "type": "GeometryCollection", + "id": "rivers", + "geometries": [] + }, + { + "type": "GeometryCollection", + "id": "planks", + "geometries": [ + { + "type": "LineString", + "width": 4.8, + "coordinates": [ + [ + -38.095, + -1.717 + ], + [ + -50.115, + -31.373 + ] + ] + }, + { + "type": "LineString", + "width": 4.8, + "coordinates": [ + [ + -15.852, + -10.732 + ], + [ + -27.873, + -40.389 + ] + ] + }, + { + "type": "LineString", + "width": 4.8, + "coordinates": [ + [ + 72.076, + -18.445 + ], + [ + 71.421, + -50.438 + ] + ] + }, + { + "type": "LineString", + "width": 4.8, + "coordinates": [ + [ + 13.737, + -17.735 + ], + [ + 13.506, + -49.734 + ] + ] + }, + { + "type": "LineString", + "width": 4.8, + "coordinates": [ + [ + 37.737, + -17.908 + ], + [ + 37.506, + -49.907 + ] + ] + }, + { + "type": "LineString", + "width": 4.8, + "coordinates": [ + [ + -93.075, + 33.961 + ], + [ + -112.412, + 8.465 + ] + ] + }, + { + "type": "LineString", + "width": 4.8, + "coordinates": [ + [ + -73.952, + 19.458 + ], + [ + -93.29, + -6.038 + ] + ] + } + ] + }, + { + "type": "MultiPolygon", + "id": "buildings", + "coordinates": [ + [ + [ + [ + 35.475, + 96.559 + ], + [ + 79.704, + 4.949 + ], + [ + 48.809, + -9.967 + ], + [ + 4.581, + 81.644 + ] + ] + ], + [ + [ + [ + -33.382, + 75.742 + ], + [ + -27.848, + 66.722 + ], + [ + -37.258, + 58.946 + ], + [ + -45.162, + 66.24 + ] + ] + ], + [ + [ + [ + -21.333, + 62.715 + ], + [ + -28.989, + 51.317 + ], + [ + -37.258, + 58.946 + ], + [ + -25.156, + 68.946 + ] + ] + ], + [ + [ + [ + -38.399, + 42.998 + ], + [ + -54.748, + 58.507 + ], + [ + -45.162, + 66.24 + ], + [ + -31.349, + 53.494 + ] + ] + ], + [ + [ + [ + -57.296, + 88.992 + ], + [ + -44.005, + 99.668 + ], + [ + -37.828, + 89.6 + ], + [ + -50.572, + 80.621 + ] + ] + ], + [ + [ + [ + -32.414, + 76.522 + ], + [ + -41.434, + 69.246 + ], + [ + -50.572, + 80.621 + ], + [ + -39.65, + 88.317 + ] + ] + ], + [ + [ + [ + -54.944, + 86.063 + ], + [ + -48.843, + 78.469 + ], + [ + -62.521, + 65.881 + ], + [ + -70.566, + 73.514 + ] + ] + ], + [ + [ + [ + -85.46, + 63.605 + ], + [ + -76.454, + 54.362 + ], + [ + -86.513, + 42.527 + ], + [ + -99.468, + 52.353 + ] + ] + ], + [ + [ + [ + -70.567, + 73.514 + ], + [ + -64.814, + 68.056 + ], + [ + -76.454, + 54.362 + ], + [ + -84.337, + 62.453 + ] + ] + ], + [ + [ + [ + -72.099, + 28.093 + ], + [ + -88.323, + 40.398 + ], + [ + -76.555, + 54.243 + ], + [ + -61.073, + 41.083 + ] + ] + ], + [ + [ + [ + -50.059, + 54.059 + ], + [ + -36.064, + 40.783 + ], + [ + -44.609, + 28.061 + ], + [ + -61.364, + 40.74 + ] + ] + ], + [ + [ + [ + -70.68, + 29.765 + ], + [ + -61.364, + 40.74 + ], + [ + -45.834, + 28.988 + ], + [ + -53.873, + 17.018 + ] + ] + ], + [ + [ + [ + -145.865, + 237.772 + ], + [ + -168.689, + 225.001 + ], + [ + -173.569, + 233.721 + ], + [ + -175.021, + 236.2 + ], + [ + -152.148, + 248.999 + ] + ] + ], + [ + [ + [ + -181.593, + 252.221 + ], + [ + -175.286, + 256.127 + ], + [ + -166.732, + 240.839 + ], + [ + -172.902, + 237.386 + ] + ] + ], + [ + [ + [ + -147.347, + 240.419 + ], + [ + -154.498, + 253.2 + ], + [ + -140.567, + 260.995 + ], + [ + -133.415, + 248.215 + ] + ] + ], + [ + [ + [ + -133.124, + 247.694 + ], + [ + -140.567, + 260.995 + ], + [ + -128.411, + 267.797 + ], + [ + -120.968, + 254.496 + ] + ] + ], + [ + [ + [ + -136.338, + 280.246 + ], + [ + -134.154, + 276.718 + ], + [ + -128.983, + 267.478 + ], + [ + -154.498, + 253.2 + ], + [ + -161.064, + 264.934 + ] + ] + ], + [ + [ + [ + -160.681, + 293.451 + ], + [ + -146.792, + 302.051 + ], + [ + -140.112, + 291.264 + ], + [ + -154.001, + 282.663 + ] + ] + ], + [ + [ + [ + -134.134, + 281.61 + ], + [ + -148.023, + 273.009 + ], + [ + -154.001, + 282.663 + ], + [ + -140.112, + 291.264 + ] + ] + ], + [ + [ + [ + -148.132, + 301.222 + ], + [ + -174.635, + 284.81 + ], + [ + -180.606, + 294.451 + ], + [ + -154.103, + 310.863 + ] + ] + ], + [ + [ + [ + -180.587, + 252.844 + ], + [ + -181.797, + 254.908 + ], + [ + -192.421, + 271.505 + ], + [ + -173.61, + 283.154 + ], + [ + -161.977, + 264.369 + ] + ] + ], + [ + [ + [ + -182.388, + 297.329 + ], + [ + -173.61, + 283.154 + ], + [ + -181.744, + 278.117 + ], + [ + -190.522, + 292.292 + ] + ] + ], + [ + [ + [ + -188.828, + 289.558 + ], + [ + -181.744, + 278.117 + ], + [ + -193.072, + 271.102 + ], + [ + -193.943, + 272.462 + ], + [ + -200.726, + 282.19 + ] + ] + ], + [ + [ + [ + -201.638, + 358.226 + ], + [ + -187.911, + 368.452 + ], + [ + -178.641, + 353.482 + ], + [ + -191.158, + 344.157 + ] + ] + ], + [ + [ + [ + -171.474, + 341.91 + ], + [ + -183.056, + 333.282 + ], + [ + -191.158, + 344.157 + ], + [ + -178.641, + 353.482 + ] + ] + ], + [ + [ + [ + -218.041, + 346.006 + ], + [ + -201.638, + 358.226 + ], + [ + -190.646, + 343.471 + ], + [ + -207.049, + 331.251 + ] + ] + ], + [ + [ + [ + -171.474, + 341.91 + ], + [ + -157.072, + 318.652 + ], + [ + -167.932, + 311.927 + ], + [ + -183.561, + 332.905 + ] + ] + ], + [ + [ + [ + -184.848, + 301.451 + ], + [ + -199.458, + 321.062 + ], + [ + -183.561, + 332.905 + ], + [ + -167.932, + 311.927 + ] + ] + ], + [ + [ + [ + -184.848, + 301.451 + ], + [ + -207.592, + 287.367 + ], + [ + -211.476, + 292.937 + ], + [ + -213.507, + 295.617 + ], + [ + -192.282, + 311.43 + ] + ] + ], + [ + [ + [ + -213.507, + 295.617 + ], + [ + -222.432, + 307.397 + ], + [ + -208.828, + 317.532 + ], + [ + -199.999, + 305.681 + ] + ] + ], + [ + [ + [ + -220.338, + 308.957 + ], + [ + -223.198, + 312.731 + ], + [ + -227.132, + 317.518 + ], + [ + -207.637, + 332.041 + ], + [ + -201.111, + 323.281 + ] + ] + ], + [ + [ + [ + -240.277, + 329.441 + ], + [ + -218.041, + 346.006 + ], + [ + -207.637, + 332.041 + ], + [ + -229.208, + 315.971 + ] + ] + ], + [ + [ + [ + -220.945, + 349.828 + ], + [ + -243.468, + 333.049 + ], + [ + -256.133, + 347.275 + ], + [ + -235.602, + 366.292 + ] + ] + ], + [ + [ + [ + -204.768, + 272.04 + ], + [ + -224.923, + 255.78 + ], + [ + -237.24, + 269.052 + ], + [ + -216.29, + 288.494 + ], + [ + -215.665, + 287.669 + ] + ] + ], + [ + [ + [ + -203.48, + 273.078 + ], + [ + -202.051, + 271.029 + ], + [ + -189.507, + 251.433 + ], + [ + -189.105, + 250.747 + ], + [ + -199.292, + 243.163 + ], + [ + -215.563, + 263.331 + ] + ] + ], + [ + [ + [ + -207.525, + 237.033 + ], + [ + -189.105, + 250.747 + ], + [ + -181.235, + 237.312 + ], + [ + -196.932, + 225.618 + ] + ] + ], + [ + [ + [ + -186.304, + 214.166 + ], + [ + -196.932, + 225.618 + ], + [ + -183.054, + 235.957 + ], + [ + -180.566, + 231.71 + ], + [ + -175.709, + 223.031 + ], + [ + -178.728, + 221.341 + ] + ] + ], + [ + [ + [ + -236.94, + 186.014 + ], + [ + -240.221, + 189.478 + ], + [ + -253.346, + 201.013 + ], + [ + -242.494, + 212.464 + ], + [ + -225.76, + 196.604 + ] + ] + ], + [ + [ + [ + -225.525, + 173.962 + ], + [ + -236.94, + 186.014 + ], + [ + -226.452, + 195.949 + ], + [ + -215.036, + 183.896 + ] + ] + ], + [ + [ + [ + -209.109, + 194.816 + ], + [ + -217.685, + 186.693 + ], + [ + -226.452, + 195.949 + ], + [ + -217.875, + 204.072 + ] + ] + ], + [ + [ + [ + -208.373, + 194.04 + ], + [ + -219.976, + 206.29 + ], + [ + -207.601, + 218.011 + ], + [ + -195.998, + 205.761 + ] + ] + ], + [ + [ + [ + -198.166, + 226.948 + ], + [ + -184.795, + 212.54 + ], + [ + -194.085, + 203.741 + ], + [ + -207.601, + 218.011 + ] + ] + ], + [ + [ + [ + -238.318, + 270.213 + ], + [ + -226.058, + 257.003 + ], + [ + -237.226, + 246.638 + ], + [ + -249.486, + 259.849 + ] + ] + ], + [ + [ + [ + -255.331, + 248.227 + ], + [ + -246.395, + 256.519 + ], + [ + -237.226, + 246.638 + ], + [ + -246.161, + 238.346 + ] + ] + ], + [ + [ + [ + -253.346, + 201.013 + ], + [ + -270.593, + 216.168 + ], + [ + -260.839, + 226.187 + ], + [ + -244.533, + 210.313 + ] + ] + ], + [ + [ + [ + -258.421, + 251.556 + ], + [ + -247.548, + 239.84 + ], + [ + -258.07, + 229.032 + ], + [ + -269.463, + 241.309 + ] + ] + ], + [ + [ + [ + -267.441, + 239.13 + ], + [ + -258.07, + 229.032 + ], + [ + -268.344, + 218.478 + ], + [ + -279.31, + 228.115 + ] + ] + ], + [ + [ + [ + -275.007, + 329.792 + ], + [ + -259.655, + 344.012 + ], + [ + -250.508, + 333.738 + ], + [ + -265.661, + 319.702 + ] + ] + ], + [ + [ + [ + -240.892, + 316.453 + ], + [ + -252.602, + 305.605 + ], + [ + -265.661, + 319.702 + ], + [ + -253.459, + 331.005 + ], + [ + -245.552, + 322.124 + ] + ] + ], + [ + [ + [ + -273.071, + 327.702 + ], + [ + -265.418, + 319.44 + ], + [ + -281.566, + 304.481 + ], + [ + -289.219, + 312.743 + ] + ] + ], + [ + [ + [ + -252.602, + 305.605 + ], + [ + -269.594, + 289.865 + ], + [ + -282.409, + 303.7 + ], + [ + -265.418, + 319.44 + ] + ] + ], + [ + [ + [ + -252.71, + 305.505 + ], + [ + -238.01, + 319.122 + ], + [ + -230.031, + 309.413 + ], + [ + -244.185, + 296.302 + ] + ] + ], + [ + [ + [ + -233.754, + 285.042 + ], + [ + -244.185, + 296.302 + ], + [ + -231.508, + 308.045 + ], + [ + -222.202, + 295.763 + ] + ] + ], + [ + [ + [ + -269.594, + 289.865 + ], + [ + -252.71, + 305.505 + ], + [ + -242.178, + 294.135 + ], + [ + -259.062, + 278.495 + ] + ] + ], + [ + [ + [ + -258.122, + 279.366 + ], + [ + -242.178, + 294.135 + ], + [ + -233.901, + 285.201 + ], + [ + -249.832, + 270.417 + ] + ] + ], + [ + [ + [ + -254.524, + 261.721 + ], + [ + -261.475, + 255.27 + ], + [ + -280.229, + 273.544 + ], + [ + -272.666, + 281.306 + ] + ] + ], + [ + [ + [ + -271.901, + 245.62 + ], + [ + -290.131, + 263.383 + ], + [ + -280.229, + 273.544 + ], + [ + -261.488, + 255.283 + ] + ] + ], + [ + [ + [ + -271.888, + 245.607 + ], + [ + -287.551, + 231.071 + ], + [ + -294.822, + 237.461 + ], + [ + -279.581, + 253.103 + ] + ] + ], + [ + [ + [ + -305.902, + 247.197 + ], + [ + -290.131, + 263.383 + ], + [ + -279.581, + 253.103 + ], + [ + -294.822, + 237.461 + ] + ] + ], + [ + [ + [ + -283.326, + 297.627 + ], + [ + -273.647, + 287.177 + ], + [ + -285.92, + 274.582 + ], + [ + -296.21, + 285.692 + ] + ] + ], + [ + [ + [ + -297.755, + 268.597 + ], + [ + -305.564, + 277.027 + ], + [ + -296.21, + 285.692 + ], + [ + -288.845, + 277.74 + ] + ] + ], + [ + [ + [ + -285.947, + 295.198 + ], + [ + -294.006, + 287.733 + ], + [ + -305.26, + 299.882 + ], + [ + -297.201, + 307.347 + ] + ] + ], + [ + [ + [ + -305.564, + 277.027 + ], + [ + -317.758, + 290.191 + ], + [ + -306.2, + 300.897 + ], + [ + -294.006, + 287.733 + ] + ] + ], + [ + [ + [ + -294.829, + 265.438 + ], + [ + -309.512, + 250.37 + ], + [ + -326.157, + 264.997 + ], + [ + -309.887, + 281.694 + ] + ] + ], + [ + [ + [ + -316.137, + 288.441 + ], + [ + -309.887, + 281.694 + ], + [ + -323.902, + 267.312 + ], + [ + -331.623, + 274.097 + ] + ] + ], + [ + [ + [ + -207.733, + 182.223 + ], + [ + -196.026, + 169.863 + ], + [ + -206.901, + 159.563 + ], + [ + -218.608, + 171.923 + ] + ] + ], + [ + [ + [ + -196.026, + 169.863 + ], + [ + -208.721, + 183.266 + ], + [ + -199.236, + 192.25 + ], + [ + -186.542, + 178.847 + ] + ] + ], + [ + [ + [ + -190.624, + 195.879 + ], + [ + -180.851, + 184.237 + ], + [ + -186.542, + 178.847 + ], + [ + -196.976, + 189.863 + ] + ] + ], + [ + [ + [ + -207.643, + 158.86 + ], + [ + -195.184, + 170.662 + ], + [ + -180.9, + 153.762 + ], + [ + -193.69, + 144.129 + ] + ] + ], + [ + [ + [ + -165.556, + 166.014 + ], + [ + -181.26, + 154.188 + ], + [ + -195.184, + 170.662 + ], + [ + -180.851, + 184.237 + ] + ] + ], + [ + [ + [ + -191.296, + 196.68 + ], + [ + -174.702, + 212.398 + ], + [ + -164.872, + 200.429 + ], + [ + -183.398, + 187.271 + ] + ] + ], + [ + [ + [ + -152.051, + 209.536 + ], + [ + -164.872, + 200.429 + ], + [ + -175.56, + 213.442 + ], + [ + -173.934, + 214.982 + ], + [ + -159.852, + 222.862 + ] + ] + ], + [ + [ + [ + -154.167, + 208.033 + ], + [ + -145.503, + 193.235 + ], + [ + -155.67, + 186.013 + ], + [ + -165.562, + 199.94 + ] + ] + ], + [ + [ + [ + -136.257, + 186.192 + ], + [ + -148.987, + 176.604 + ], + [ + -155.67, + 186.013 + ], + [ + -141.885, + 195.805 + ] + ] + ], + [ + [ + [ + -166.471, + 167.104 + ], + [ + -174.747, + 176.964 + ], + [ + -157.795, + 189.005 + ], + [ + -150.684, + 178.993 + ] + ] + ], + [ + [ + [ + -125.559, + 162.721 + ], + [ + -152.041, + 145.076 + ], + [ + -162.326, + 158.732 + ], + [ + -135.189, + 179.169 + ] + ] + ], + [ + [ + [ + -123.37, + 164.18 + ], + [ + -113.946, + 148.085 + ], + [ + -120.512, + 144.24 + ], + [ + -125.768, + 140.447 + ], + [ + -135.982, + 155.776 + ] + ] + ], + [ + [ + [ + -141.978, + 131.713 + ], + [ + -152.041, + 145.076 + ], + [ + -135.982, + 155.776 + ], + [ + -127.103, + 142.45 + ] + ] + ], + [ + [ + [ + -142.89, + 132.925 + ], + [ + -155.424, + 121.914 + ], + [ + -164.565, + 132.73 + ], + [ + -151.231, + 144 + ] + ] + ], + [ + [ + [ + -173.99, + 124.763 + ], + [ + -164.565, + 132.73 + ], + [ + -154, + 120.23 + ], + [ + -159.36, + 115.521 + ], + [ + -162.412, + 112.57 + ], + [ + -163.851, + 114.059 + ] + ] + ], + [ + [ + [ + -162.086, + 158.414 + ], + [ + -151.231, + 144 + ], + [ + -164.477, + 132.804 + ], + [ + -175.918, + 147.996 + ] + ] + ], + [ + [ + [ + -176.378, + 148.606 + ], + [ + -164.477, + 132.804 + ], + [ + -174.162, + 124.619 + ], + [ + -188.345, + 139.594 + ] + ] + ], + [ + [ + [ + -88.628, + 200.818 + ], + [ + -85.883, + 195.911 + ], + [ + -80.86, + 183.564 + ], + [ + -91.237, + 178.571 + ], + [ + -100.095, + 194.401 + ] + ] + ], + [ + [ + [ + -97.894, + 160.783 + ], + [ + -104.323, + 172.274 + ], + [ + -81.715, + 183.153 + ], + [ + -76.627, + 170.643 + ] + ] + ], + [ + [ + [ + -118.033, + 167.347 + ], + [ + -105.493, + 174.364 + ], + [ + -98.468, + 161.809 + ], + [ + -98.991, + 161.567 + ], + [ + -110.652, + 154.739 + ] + ] + ], + [ + [ + [ + -125.407, + 180.238 + ], + [ + -112.745, + 187.323 + ], + [ + -105.493, + 174.364 + ], + [ + -117.903, + 167.42 + ] + ] + ], + [ + [ + [ + -135.53, + 201.179 + ], + [ + -118.802, + 210.539 + ], + [ + -107.464, + 190.278 + ], + [ + -123.797, + 181.139 + ] + ] + ], + [ + [ + [ + -92.313, + 198.757 + ], + [ + -107.464, + 190.278 + ], + [ + -113.321, + 200.745 + ], + [ + -98.17, + 209.223 + ] + ] + ], + [ + [ + [ + -102.649, + 219.578 + ], + [ + -97.168, + 209.784 + ], + [ + -113.321, + 200.745 + ], + [ + -118.802, + 210.539 + ] + ] + ], + [ + [ + [ + -100.986, + 220.509 + ], + [ + -116.253, + 211.966 + ], + [ + -123.852, + 225.547 + ], + [ + -108.586, + 234.09 + ] + ] + ], + [ + [ + [ + -131.967, + 240.049 + ], + [ + -115.68, + 249.163 + ], + [ + -107.566, + 234.661 + ], + [ + -123.852, + 225.547 + ] + ] + ], + [ + [ + [ + -137.678, + 199.977 + ], + [ + -146.463, + 214.983 + ], + [ + -124.742, + 227.137 + ], + [ + -116.253, + 211.966 + ] + ] + ], + [ + [ + [ + -130.325, + 237.115 + ], + [ + -124.742, + 227.137 + ], + [ + -146.578, + 214.919 + ], + [ + -152.356, + 224.787 + ] + ] + ], + [ + [ + [ + -121.713, + 66.501 + ], + [ + -108.403, + 77.192 + ], + [ + -98.535, + 64.907 + ], + [ + -110.713, + 55.124 + ] + ] + ], + [ + [ + [ + -131.257, + 78.261 + ], + [ + -117.888, + 89 + ], + [ + -108.403, + 77.192 + ], + [ + -120.685, + 67.327 + ] + ] + ], + [ + [ + [ + -98.468, + 64.824 + ], + [ + -108.475, + 77.281 + ], + [ + -94.351, + 88.627 + ], + [ + -84.344, + 76.17 + ] + ] + ], + [ + [ + [ + -105.343, + 99.078 + ], + [ + -95.929, + 87.359 + ], + [ + -108.475, + 77.281 + ], + [ + -117.888, + 89 + ] + ] + ], + [ + [ + [ + -122.96, + 84.926 + ], + [ + -132.939, + 76.91 + ], + [ + -152.214, + 96.847 + ], + [ + -140.253, + 106.454 + ] + ] + ], + [ + [ + [ + -147.072, + 114.943 + ], + [ + -140.253, + 106.454 + ], + [ + -151.554, + 97.377 + ], + [ + -158.542, + 104.604 + ], + [ + -155.572, + 107.476 + ] + ] + ], + [ + [ + [ + -106.109, + 98.462 + ], + [ + -122.96, + 84.926 + ], + [ + -135.067, + 99.998 + ], + [ + -118.216, + 113.534 + ] + ] + ], + [ + [ + [ + -116.1, + 115.234 + ], + [ + -135.067, + 99.998 + ], + [ + -145.825, + 113.39 + ], + [ + -136.703, + 121.403 + ], + [ + -126.799, + 128.552 + ] + ] + ], + [ + [ + [ + -105.221, + 114.18 + ], + [ + -112.294, + 122.985 + ], + [ + -97.406, + 133.635 + ], + [ + -90.848, + 123.302 + ] + ] + ], + [ + [ + [ + -104.22, + 144.371 + ], + [ + -97.406, + 133.635 + ], + [ + -112.452, + 122.872 + ], + [ + -121.055, + 133.582 + ], + [ + -114.211, + 138.522 + ] + ] + ], + [ + [ + [ + -105.999, + 147.175 + ], + [ + -95.916, + 153.079 + ], + [ + -94.218, + 153.866 + ], + [ + -85.391, + 137.712 + ], + [ + -95.801, + 131.106 + ] + ] + ], + [ + [ + [ + -94.218, + 153.866 + ], + [ + -72.815, + 163.788 + ], + [ + -68.092, + 152.176 + ], + [ + -88.101, + 142.673 + ] + ] + ], + [ + [ + [ + -64.929, + 139.751 + ], + [ + -80.949, + 129.584 + ], + [ + -88.101, + 142.673 + ], + [ + -69.773, + 151.378 + ], + [ + -65.944, + 141.964 + ] + ] + ], + [ + [ + [ + -106.921, + 113.101 + ], + [ + -82.69, + 128.479 + ], + [ + -72.475, + 114.198 + ], + [ + -93.947, + 96.95 + ] + ] + ], + [ + [ + [ + -92.499, + 98.113 + ], + [ + -85.8, + 103.494 + ], + [ + -72.03, + 86.351 + ], + [ + -78.729, + 80.97 + ] + ] + ], + [ + [ + [ + -72.611, + 87.075 + ], + [ + -78.475, + 94.375 + ], + [ + -65.659, + 104.67 + ], + [ + -60.203, + 97.042 + ] + ] + ], + [ + [ + [ + -57.838, + 119.384 + ], + [ + -64.73, + 115.38 + ], + [ + -75.813, + 132.843 + ], + [ + -66.671, + 138.645 + ] + ] + ], + [ + [ + [ + -60.2, + 97.038 + ], + [ + -70.798, + 111.854 + ], + [ + -56.189, + 120.342 + ], + [ + -49.459, + 105.666 + ] + ] + ], + [ + [ + [ + 152.575, + 252.471 + ], + [ + 138.551, + 249.538 + ], + [ + 130.739, + 255.943 + ], + [ + 149.677, + 266.322 + ] + ] + ], + [ + [ + [ + 122.876, + 262.39 + ], + [ + 134.278, + 276.297 + ], + [ + 147.033, + 278.965 + ], + [ + 149.677, + 266.322 + ], + [ + 130.739, + 255.943 + ] + ] + ], + [ + [ + [ + 146.03, + 278.755 + ], + [ + 134.278, + 276.297 + ], + [ + 133.404, + 275.231 + ], + [ + 128.124, + 279.56 + ], + [ + 142.256, + 296.796 + ] + ] + ], + [ + [ + [ + 118.265, + 266.171 + ], + [ + 128.793, + 279.012 + ], + [ + 133.404, + 275.231 + ], + [ + 122.876, + 262.39 + ] + ] + ], + [ + [ + [ + 117.887, + 266.48 + ], + [ + 135.218, + 252.271 + ], + [ + 130.287, + 242.451 + ], + [ + 109.363, + 256.083 + ] + ] + ], + [ + [ + [ + 130.287, + 242.451 + ], + [ + 125.441, + 232.799 + ], + [ + 111.857, + 236.467 + ], + [ + 118.139, + 250.365 + ] + ] + ], + [ + [ + [ + 109.169, + 256.209 + ], + [ + 118.139, + 250.365 + ], + [ + 112.53, + 237.956 + ], + [ + 98.395, + 241.773 + ], + [ + 100.222, + 245.297 + ] + ] + ], + [ + [ + [ + 135.683, + 232.482 + ], + [ + 137.729, + 240.061 + ], + [ + 152.844, + 243.223 + ], + [ + 155.938, + 228.435 + ], + [ + 155.903, + 227.022 + ] + ] + ], + [ + [ + [ + 68.532, + 183.728 + ], + [ + 83.873, + 177.61 + ], + [ + 81.503, + 171.669 + ], + [ + 65.601, + 178.01 + ], + [ + 66.174, + 179.182 + ] + ] + ], + [ + [ + [ + 72.656, + 196.409 + ], + [ + 88.674, + 189.65 + ], + [ + 83.873, + 177.61 + ], + [ + 66.499, + 184.539 + ] + ] + ], + [ + [ + [ + 104.163, + 183.113 + ], + [ + 97.572, + 163.305 + ], + [ + 80.83, + 169.981 + ], + [ + 88.674, + 189.65 + ] + ] + ], + [ + [ + [ + 72.656, + 196.409 + ], + [ + 81.211, + 212.905 + ], + [ + 86.877, + 210.514 + ], + [ + 79.675, + 193.447 + ] + ] + ], + [ + [ + [ + 118.849, + 227.257 + ], + [ + 110.029, + 200.744 + ], + [ + 97.471, + 206.043 + ], + [ + 105.963, + 230.736 + ] + ] + ], + [ + [ + [ + 81.211, + 212.905 + ], + [ + 93.433, + 236.471 + ], + [ + 106.703, + 232.887 + ], + [ + 97.471, + 206.043 + ] + ] + ], + [ + [ + [ + 139.469, + 219.539 + ], + [ + 137.696, + 208.926 + ], + [ + 114.651, + 214.637 + ], + [ + 118.193, + 225.284 + ] + ] + ], + [ + [ + [ + 155.091, + 209.839 + ], + [ + 138.119, + 211.462 + ], + [ + 139.692, + 220.874 + ], + [ + 155.257, + 216.671 + ] + ] + ], + [ + [ + [ + 157.439, + 192.342 + ], + [ + 135.536, + 196.002 + ], + [ + 138.119, + 211.462 + ], + [ + 157.86, + 209.574 + ] + ] + ], + [ + [ + [ + 121.821, + 157.588 + ], + [ + 106.505, + 163.696 + ], + [ + 110.987, + 176.923 + ], + [ + 126.068, + 172.68 + ] + ] + ], + [ + [ + [ + 98.509, + 166.118 + ], + [ + 102.864, + 179.209 + ], + [ + 110.987, + 176.923 + ], + [ + 106.276, + 163.021 + ] + ] + ], + [ + [ + [ + 153.42, + 170.548 + ], + [ + 144.024, + 171.981 + ], + [ + 147.386, + 194.022 + ], + [ + 153.965, + 192.923 + ] + ] + ], + [ + [ + [ + 121.471, + 156.344 + ], + [ + 123.568, + 163.796 + ], + [ + 140.258, + 159.233 + ], + [ + 137.699, + 149.873 + ] + ] + ], + [ + [ + [ + 137.59, + 149.473 + ], + [ + 143.755, + 172.022 + ], + [ + 153.851, + 170.482 + ], + [ + 153.329, + 149.113 + ], + [ + 151.687, + 143.852 + ] + ] + ], + [ + [ + [ + 53.022, + 150.128 + ], + [ + 79.201, + 139.689 + ], + [ + 74.462, + 127.806 + ], + [ + 47.381, + 138.605 + ] + ] + ], + [ + [ + [ + 88.068, + 161.927 + ], + [ + 79.201, + 139.689 + ], + [ + 63.313, + 146.024 + ], + [ + 72.181, + 168.262 + ] + ] + ], + [ + [ + [ + 50.053, + 151.312 + ], + [ + 60.61, + 172.876 + ], + [ + 72.181, + 168.262 + ], + [ + 63.313, + 146.024 + ] + ] + ], + [ + [ + [ + 122.407, + 146.504 + ], + [ + 116.516, + 131.73 + ], + [ + 102.234, + 137.425 + ], + [ + 108.125, + 152.199 + ] + ] + ], + [ + [ + [ + 87.16, + 159.649 + ], + [ + 107.812, + 151.414 + ], + [ + 102.234, + 137.425 + ], + [ + 81.582, + 145.661 + ] + ] + ], + [ + [ + [ + 75.084, + 129.364 + ], + [ + 77.574, + 135.61 + ], + [ + 95.195, + 128.583 + ], + [ + 92.705, + 122.338 + ] + ] + ], + [ + [ + [ + 109.913, + 115.17 + ], + [ + 92.6, + 122.074 + ], + [ + 99.203, + 138.634 + ], + [ + 116.516, + 131.73 + ] + ] + ], + [ + [ + [ + 122.597, + 146.978 + ], + [ + 133.814, + 142.505 + ], + [ + 126.992, + 125.398 + ], + [ + 115.775, + 129.871 + ] + ] + ], + [ + [ + [ + 153.226, + 135.944 + ], + [ + 147.392, + 117.263 + ], + [ + 126.992, + 125.398 + ], + [ + 134.22, + 143.523 + ] + ] + ], + [ + [ + [ + 109.521, + 114.188 + ], + [ + 115.775, + 129.871 + ], + [ + 132.086, + 123.367 + ], + [ + 125.832, + 107.683 + ] + ] + ], + [ + [ + [ + 147.392, + 117.263 + ], + [ + 141.924, + 99.756 + ], + [ + 125.313, + 106.381 + ], + [ + 132.086, + 123.367 + ] + ] + ], + [ + [ + [ + 106.316, + 46.138 + ], + [ + 99.483, + 31.737 + ], + [ + 94.063, + 29.121 + ], + [ + 81.73, + 54.667 + ], + [ + 85.006, + 56.249 + ] + ] + ], + [ + [ + [ + 80.248, + 22.451 + ], + [ + 73.342, + 36.756 + ], + [ + 87.157, + 43.425 + ], + [ + 94.063, + 29.121 + ] + ] + ], + [ + [ + [ + 81.455, + 55.235 + ], + [ + 87.157, + 43.425 + ], + [ + 71.223, + 35.733 + ], + [ + 65.521, + 47.543 + ] + ] + ], + [ + [ + [ + 78.364, + 21.542 + ], + [ + 84.474, + 24.491 + ], + [ + 91.145, + 10.674 + ], + [ + 101.982, + 5.532 + ], + [ + 94.107, + -11.066 + ] + ] + ], + [ + [ + [ + 102.658, + 5.212 + ], + [ + 91.145, + 10.674 + ], + [ + 87.11, + 19.033 + ], + [ + 104.611, + 27.482 + ], + [ + 111.642, + 24.146 + ] + ] + ], + [ + [ + [ + 123.248, + 102.036 + ], + [ + 140.489, + 95.161 + ], + [ + 136.687, + 82.987 + ], + [ + 118.538, + 90.225 + ] + ] + ], + [ + [ + [ + 130.07, + 72.978 + ], + [ + 114.187, + 79.312 + ], + [ + 118.538, + 90.225 + ], + [ + 133.583, + 84.225 + ] + ] + ], + [ + [ + [ + 106.412, + 106.95 + ], + [ + 122.629, + 100.483 + ], + [ + 114.187, + 79.312 + ], + [ + 97.969, + 85.779 + ] + ] + ], + [ + [ + [ + 110.014, + 54.169 + ], + [ + 119.237, + 77.298 + ], + [ + 129.335, + 73.271 + ], + [ + 127.604, + 67.731 + ], + [ + 119.119, + 49.849 + ] + ] + ], + [ + [ + [ + 109.752, + 53.512 + ], + [ + 89.024, + 63.347 + ], + [ + 93.971, + 75.753 + ], + [ + 115.239, + 67.272 + ] + ] + ], + [ + [ + [ + 75.769, + 101.879 + ], + [ + 82.337, + 118.35 + ], + [ + 94.585, + 113.466 + ], + [ + 88.017, + 96.994 + ] + ] + ], + [ + [ + [ + 107.031, + 108.503 + ], + [ + 100.463, + 92.031 + ], + [ + 88.017, + 96.994 + ], + [ + 94.585, + 113.466 + ] + ] + ], + [ + [ + [ + 90.057, + 65.937 + ], + [ + 86.129, + 67.801 + ], + [ + 77.494, + 63.632 + ], + [ + 64.265, + 91.033 + ], + [ + 71.946, + 94.741 + ], + [ + 79.238, + 79.636 + ], + [ + 93.286, + 74.034 + ] + ] + ], + [ + [ + [ + 47.403, + 82.893 + ], + [ + 64.265, + 91.033 + ], + [ + 70.182, + 78.778 + ], + [ + 53.32, + 70.637 + ] + ] + ], + [ + [ + [ + 78.382, + 61.793 + ], + [ + 61.52, + 53.652 + ], + [ + 53.32, + 70.637 + ], + [ + 70.182, + 78.778 + ] + ] + ], + [ + [ + [ + 73.156, + 95.326 + ], + [ + 47.403, + 82.893 + ], + [ + 40.201, + 97.811 + ], + [ + 52.602, + 103.798 + ], + [ + 73.251, + 95.564 + ] + ] + ], + [ + [ + [ + 41.913, + 98.638 + ], + [ + 34.876, + 113.214 + ], + [ + 39.202, + 122.05 + ], + [ + 57.108, + 114.909 + ], + [ + 52.667, + 103.772 + ], + [ + 52.602, + 103.798 + ] + ] + ], + [ + [ + [ + 41.824, + 134.505 + ], + [ + 61.754, + 126.558 + ], + [ + 57.108, + 114.909 + ], + [ + 36.294, + 123.209 + ] + ] + ], + [ + [ + [ + 81.854, + 117.138 + ], + [ + 77.384, + 105.93 + ], + [ + 56.801, + 114.138 + ], + [ + 61.27, + 125.346 + ] + ] + ], + [ + [ + [ + 481.878, + 94.897 + ], + [ + 481.678, + 108.676 + ], + [ + 492.181, + 109.386 + ], + [ + 493.11, + 95.657 + ] + ] + ], + [ + [ + [ + 491.242, + 123.262 + ], + [ + 492.181, + 109.386 + ], + [ + 479.026, + 108.496 + ], + [ + 478.815, + 123.082 + ] + ] + ], + [ + [ + [ + 491.083, + 125.607 + ], + [ + 492.965, + 125.634 + ], + [ + 516.954, + 127.103 + ], + [ + 518.044, + 114.221 + ], + [ + 491.973, + 112.457 + ] + ] + ], + [ + [ + [ + 518.044, + 114.221 + ], + [ + 518.987, + 103.087 + ], + [ + 519.666, + 97.454 + ], + [ + 505.464, + 96.493 + ], + [ + 504.327, + 113.293 + ] + ] + ], + [ + [ + [ + 515.963, + 97.203 + ], + [ + 517.382, + 85.429 + ], + [ + 497.451, + 84.08 + ], + [ + 496.651, + 95.896 + ] + ] + ], + [ + [ + [ + 522.94, + 70.274 + ], + [ + 502.977, + 68.154 + ], + [ + 498.552, + 67.81 + ], + [ + 497.451, + 84.08 + ], + [ + 521.084, + 85.679 + ] + ] + ], + [ + [ + [ + 482.961, + 66.597 + ], + [ + 478.088, + 66.355 + ], + [ + 477.679, + 94.612 + ], + [ + 496.651, + 95.896 + ], + [ + 498.552, + 67.81 + ] + ] + ], + [ + [ + [ + 449.478, + 125.913 + ], + [ + 468.934, + 125.287 + ], + [ + 472.434, + 125.337 + ], + [ + 472.787, + 100.904 + ], + [ + 447.658, + 102.89 + ] + ] + ], + [ + [ + [ + 448.551, + 82.062 + ], + [ + 449.803, + 97.905 + ], + [ + 462.375, + 96.912 + ], + [ + 461.122, + 81.068 + ] + ] + ], + [ + [ + [ + 472.857, + 96.083 + ], + [ + 473.088, + 80.123 + ], + [ + 461.122, + 81.068 + ], + [ + 462.375, + 96.912 + ] + ] + ], + [ + [ + [ + 473.088, + 80.123 + ], + [ + 473.291, + 66.118 + ], + [ + 462.91, + 65.604 + ], + [ + 459.79, + 65.537 + ], + [ + 461.019, + 81.077 + ] + ] + ], + [ + [ + [ + 447.224, + 65.27 + ], + [ + 448.551, + 82.062 + ], + [ + 461.019, + 81.077 + ], + [ + 459.79, + 65.537 + ] + ] + ], + [ + [ + [ + 424.564, + 81.158 + ], + [ + 448.331, + 79.28 + ], + [ + 447.467, + 68.341 + ], + [ + 446.412, + 68.318 + ], + [ + 426.337, + 68.456 + ], + [ + 423.568, + 68.554 + ] + ] + ], + [ + [ + [ + 449.803, + 97.905 + ], + [ + 448.331, + 79.28 + ], + [ + 436.985, + 80.177 + ], + [ + 438.457, + 98.802 + ] + ] + ], + [ + [ + [ + 438.353, + 97.486 + ], + [ + 436.985, + 80.177 + ], + [ + 424.446, + 81.168 + ], + [ + 425.814, + 98.477 + ] + ] + ], + [ + [ + [ + 393.519, + 131.038 + ], + [ + 390.739, + 110.938 + ], + [ + 371.839, + 113.551 + ], + [ + 375.918, + 134.145 + ], + [ + 377.811, + 133.77 + ] + ] + ], + [ + [ + [ + 390.739, + 110.938 + ], + [ + 393.593, + 131.575 + ], + [ + 397.109, + 130.963 + ], + [ + 407.45, + 129.658 + ], + [ + 404.597, + 109.022 + ] + ] + ], + [ + [ + [ + 413.822, + 107.746 + ], + [ + 404.597, + 109.022 + ], + [ + 407.45, + 129.658 + ], + [ + 415.474, + 128.645 + ] + ] + ], + [ + [ + [ + 418.095, + 102.31 + ], + [ + 416.201, + 78.349 + ], + [ + 397.008, + 81.003 + ], + [ + 400.294, + 104.771 + ] + ] + ], + [ + [ + [ + 386.084, + 102.75 + ], + [ + 399.753, + 100.859 + ], + [ + 397.008, + 81.003 + ], + [ + 383.339, + 82.893 + ] + ] + ], + [ + [ + [ + 398.46, + 68.98 + ], + [ + 400.064, + 80.581 + ], + [ + 412.633, + 78.842 + ], + [ + 411.815, + 68.487 + ], + [ + 399.322, + 68.925 + ] + ] + ], + [ + [ + [ + 381.691, + 70.979 + ], + [ + 383.339, + 82.893 + ], + [ + 400.064, + 80.581 + ], + [ + 398.584, + 69.881 + ], + [ + 382.665, + 70.889 + ] + ] + ], + [ + [ + [ + 364.223, + 86.744 + ], + [ + 383.503, + 84.078 + ], + [ + 381.429, + 69.08 + ], + [ + 365.261, + 70.562 + ], + [ + 361.116, + 71.06 + ] + ] + ], + [ + [ + [ + 364.122, + 86.758 + ], + [ + 366.412, + 98.318 + ], + [ + 385.114, + 95.732 + ], + [ + 383.503, + 84.078 + ] + ] + ], + [ + [ + [ + 386.351, + 104.674 + ], + [ + 385.114, + 95.732 + ], + [ + 366.55, + 98.299 + ], + [ + 368.307, + 107.169 + ] + ] + ], + [ + [ + [ + 455.537, + 156.803 + ], + [ + 455.928, + 165.928 + ], + [ + 473.805, + 166.016 + ], + [ + 473.85, + 156.894 + ] + ] + ], + [ + [ + [ + 454.395, + 177.904 + ], + [ + 473.746, + 178 + ], + [ + 473.805, + 166.016 + ], + [ + 453.881, + 165.918 + ] + ] + ], + [ + [ + [ + 459.189, + 196.749 + ], + [ + 468.291, + 196.884 + ], + [ + 468.384, + 177.973 + ], + [ + 458.383, + 177.924 + ] + ] + ], + [ + [ + [ + 487.587, + 197.17 + ], + [ + 510.992, + 197.516 + ], + [ + 512.955, + 174.329 + ], + [ + 487.7, + 174.204 + ] + ] + ], + [ + [ + [ + 512.196, + 157.083 + ], + [ + 500.986, + 157.028 + ], + [ + 500.901, + 174.269 + ], + [ + 510.736, + 174.318 + ] + ] + ], + [ + [ + [ + 499.8, + 132.894 + ], + [ + 499.681, + 157.021 + ], + [ + 513.617, + 157.09 + ], + [ + 515.584, + 133.86 + ] + ] + ], + [ + [ + [ + 492.784, + 130.432 + ], + [ + 483.999, + 130.305 + ], + [ + 483.868, + 156.943 + ], + [ + 499.681, + 157.021 + ], + [ + 499.81, + 130.862 + ] + ] + ], + [ + [ + [ + 483.999, + 130.305 + ], + [ + 468.976, + 130.088 + ], + [ + 466.986, + 130.152 + ], + [ + 466.923, + 142.792 + ], + [ + 483.937, + 142.876 + ] + ] + ], + [ + [ + [ + 454.426, + 156.798 + ], + [ + 466.854, + 156.859 + ], + [ + 466.975, + 132.433 + ], + [ + 453.401, + 132.87 + ] + ] + ], + [ + [ + [ + 474.739, + 260.621 + ], + [ + 475.033, + 240.727 + ], + [ + 458.319, + 240.479 + ], + [ + 459.187, + 260.725 + ], + [ + 463.703, + 260.532 + ] + ] + ], + [ + [ + [ + 494.868, + 262.855 + ], + [ + 495.007, + 253.418 + ], + [ + 474.85, + 253.12 + ], + [ + 474.716, + 262.131 + ], + [ + 483.886, + 262.206 + ] + ] + ], + [ + [ + [ + 505.219, + 265.689 + ], + [ + 507.293, + 241.204 + ], + [ + 495.191, + 241.025 + ], + [ + 494.835, + 265.075 + ] + ] + ], + [ + [ + [ + 455.199, + 196.69 + ], + [ + 456.21, + 220.287 + ], + [ + 468.366, + 220.467 + ], + [ + 468.716, + 196.89 + ] + ] + ], + [ + [ + [ + 456.21, + 220.287 + ], + [ + 457.074, + 240.461 + ], + [ + 466.378, + 240.598 + ], + [ + 466.676, + 220.442 + ] + ] + ], + [ + [ + [ + 507.293, + 241.204 + ], + [ + 509.159, + 219.155 + ], + [ + 500.416, + 219.025 + ], + [ + 500.089, + 241.098 + ] + ] + ], + [ + [ + [ + 508.058, + 197.473 + ], + [ + 486.184, + 197.149 + ], + [ + 485.863, + 218.81 + ], + [ + 506.226, + 219.111 + ] + ] + ], + [ + [ + [ + 430.703, + 184.807 + ], + [ + 427.668, + 159.359 + ], + [ + 414.079, + 160.98 + ], + [ + 417.115, + 186.428 + ] + ] + ], + [ + [ + [ + 403.295, + 188.076 + ], + [ + 417.115, + 186.428 + ], + [ + 415.668, + 174.299 + ], + [ + 401.849, + 175.947 + ] + ] + ], + [ + [ + [ + 446.525, + 173.101 + ], + [ + 429.548, + 175.126 + ], + [ + 430.42, + 182.432 + ], + [ + 446.841, + 180.473 + ] + ] + ], + [ + [ + [ + 448.688, + 156.851 + ], + [ + 427.668, + 159.359 + ], + [ + 429.548, + 175.126 + ], + [ + 449.37, + 172.762 + ] + ] + ], + [ + [ + [ + 434.062, + 133.296 + ], + [ + 437.037, + 158.241 + ], + [ + 445.762, + 157.201 + ], + [ + 444.707, + 132.566 + ], + [ + 442.315, + 132.643 + ] + ] + ], + [ + [ + [ + 420.564, + 134.363 + ], + [ + 423.604, + 159.844 + ], + [ + 437.037, + 158.241 + ], + [ + 434.062, + 133.296 + ] + ] + ], + [ + [ + [ + 397.508, + 139.56 + ], + [ + 398.572, + 148.477 + ], + [ + 421.916, + 145.693 + ], + [ + 420.826, + 136.553 + ], + [ + 398.864, + 139.324 + ] + ] + ], + [ + [ + [ + 399.53, + 156.511 + ], + [ + 397.065, + 135.843 + ], + [ + 388.384, + 137.353 + ], + [ + 390.793, + 157.553 + ] + ] + ], + [ + [ + [ + 374.337, + 139.796 + ], + [ + 372.499, + 140.16 + ], + [ + 376.287, + 159.283 + ], + [ + 390.793, + 157.553 + ], + [ + 388.384, + 137.353 + ] + ] + ], + [ + [ + [ + 399.53, + 156.511 + ], + [ + 376.287, + 159.283 + ], + [ + 379.708, + 176.558 + ], + [ + 401.61, + 173.946 + ] + ] + ], + [ + [ + [ + 382.481, + 190.559 + ], + [ + 403.295, + 188.076 + ], + [ + 401.61, + 173.946 + ], + [ + 379.708, + 176.558 + ] + ] + ], + [ + [ + [ + 383.417, + 195.282 + ], + [ + 386.679, + 211.752 + ], + [ + 405.001, + 209.566 + ], + [ + 403.018, + 192.943 + ] + ] + ], + [ + [ + [ + 419.413, + 207.847 + ], + [ + 417.43, + 191.224 + ], + [ + 403.018, + 192.943 + ], + [ + 405.001, + 209.566 + ] + ] + ], + [ + [ + [ + 386.679, + 211.752 + ], + [ + 391.062, + 233.88 + ], + [ + 403.938, + 232.411 + ], + [ + 401.266, + 210.012 + ] + ] + ], + [ + [ + [ + 448.753, + 204.821 + ], + [ + 435.109, + 206.448 + ], + [ + 437.746, + 228.555 + ], + [ + 449.712, + 227.191 + ] + ] + ], + [ + [ + [ + 417.687, + 193.38 + ], + [ + 419.468, + 208.314 + ], + [ + 449.62, + 204.717 + ], + [ + 448.975, + 189.648 + ] + ] + ], + [ + [ + [ + 391.062, + 233.88 + ], + [ + 394.7, + 252.246 + ], + [ + 405.363, + 251.03 + ], + [ + 403.249, + 232.49 + ] + ] + ], + [ + [ + [ + 422.227, + 264.68 + ], + [ + 420.473, + 249.307 + ], + [ + 395.951, + 252.103 + ], + [ + 399.103, + 268.016 + ], + [ + 399.807, + 267.877 + ], + [ + 420.904, + 264.804 + ] + ] + ], + [ + [ + [ + 422.085, + 263.442 + ], + [ + 439.878, + 261.769 + ], + [ + 442.485, + 261.658 + ], + [ + 440.283, + 242.352 + ], + [ + 419.945, + 244.671 + ] + ] + ], + [ + [ + [ + 449.878, + 241.258 + ], + [ + 440.283, + 242.352 + ], + [ + 442.586, + 262.545 + ], + [ + 450.775, + 262.194 + ] + ] + ], + [ + [ + [ + 448.218, + 227.361 + ], + [ + 418.359, + 230.767 + ], + [ + 419.945, + 244.671 + ], + [ + 448.819, + 241.378 + ] + ] + ], + [ + [ + [ + 271.857, + 86.745 + ], + [ + 275.168, + 102.738 + ], + [ + 294.467, + 98.743 + ], + [ + 291.094, + 82.447 + ], + [ + 282.557, + 84.214 + ] + ] + ], + [ + [ + [ + 263.919, + 86.674 + ], + [ + 257.039, + 88.507 + ], + [ + 260.609, + 105.751 + ], + [ + 275.168, + 102.738 + ], + [ + 271.473, + 84.887 + ] + ] + ], + [ + [ + [ + 299.436, + 116.247 + ], + [ + 295.758, + 98.476 + ], + [ + 277.487, + 102.258 + ], + [ + 281.165, + 120.029 + ] + ] + ], + [ + [ + [ + 257.91, + 92.716 + ], + [ + 248.512, + 95.22 + ], + [ + 252.094, + 112.527 + ], + [ + 261.604, + 110.559 + ] + ] + ], + [ + [ + [ + 242.287, + 114.557 + ], + [ + 252.094, + 112.527 + ], + [ + 248.371, + 94.537 + ], + [ + 248.292, + 94.558 + ], + [ + 239.107, + 97.285 + ] + ] + ], + [ + [ + [ + 245.488, + 127.414 + ], + [ + 264.287, + 123.523 + ], + [ + 261.604, + 110.559 + ], + [ + 243.091, + 114.39 + ] + ] + ], + [ + [ + [ + 264.023, + 123.577 + ], + [ + 241.532, + 128.232 + ], + [ + 244.051, + 141.914 + ], + [ + 266.308, + 138.509 + ] + ] + ], + [ + [ + [ + 268.47, + 152.641 + ], + [ + 266.308, + 138.509 + ], + [ + 245.502, + 141.692 + ], + [ + 247.841, + 154.397 + ], + [ + 261.671, + 153.318 + ] + ] + ], + [ + [ + [ + 268.801, + 154.805 + ], + [ + 282.131, + 153.477 + ], + [ + 285.631, + 153.053 + ], + [ + 282.72, + 138.988 + ], + [ + 266.883, + 142.266 + ] + ] + ], + [ + [ + [ + 299.436, + 116.247 + ], + [ + 278.893, + 120.499 + ], + [ + 282.44, + 137.634 + ], + [ + 302.983, + 133.382 + ] + ] + ], + [ + [ + [ + 301.863, + 133.613 + ], + [ + 282.44, + 137.634 + ], + [ + 285.311, + 151.504 + ], + [ + 302.148, + 149.463 + ], + [ + 305.057, + 149.047 + ] + ] + ], + [ + [ + [ + 326.592, + 75.437 + ], + [ + 329.26, + 88.907 + ], + [ + 354.406, + 83.926 + ], + [ + 352.037, + 71.966 + ], + [ + 341.029, + 73.289 + ] + ] + ], + [ + [ + [ + 332.522, + 105.378 + ], + [ + 347.692, + 102.373 + ], + [ + 344.43, + 85.902 + ], + [ + 329.26, + 88.907 + ] + ] + ], + [ + [ + [ + 360.245, + 102.999 + ], + [ + 356.389, + 83.533 + ], + [ + 344.43, + 85.902 + ], + [ + 348.286, + 105.368 + ] + ] + ], + [ + [ + [ + 326.887, + 76.926 + ], + [ + 325.294, + 77.163 + ], + [ + 310.488, + 79.795 + ], + [ + 313.726, + 96.146 + ], + [ + 330.053, + 92.912 + ] + ] + ], + [ + [ + [ + 303.115, + 77.983 + ], + [ + 296.693, + 79.312 + ], + [ + 300.711, + 98.724 + ], + [ + 313.726, + 96.146 + ], + [ + 309.89, + 76.779 + ] + ] + ], + [ + [ + [ + 333.115, + 108.373 + ], + [ + 330.053, + 92.912 + ], + [ + 313.799, + 96.131 + ], + [ + 316.861, + 111.592 + ] + ] + ], + [ + [ + [ + 316.535, + 109.945 + ], + [ + 313.799, + 96.131 + ], + [ + 304.461, + 97.981 + ], + [ + 307.315, + 111.771 + ] + ] + ], + [ + [ + [ + 312.512, + 134.954 + ], + [ + 333.844, + 130.728 + ], + [ + 330.886, + 115.791 + ], + [ + 309.426, + 120.042 + ] + ] + ], + [ + [ + [ + 308.379, + 135.772 + ], + [ + 311.278, + 149.776 + ], + [ + 320.508, + 148.456 + ], + [ + 317.633, + 133.939 + ] + ] + ], + [ + [ + [ + 325.024, + 147.81 + ], + [ + 336.842, + 145.862 + ], + [ + 333.844, + 130.728 + ], + [ + 317.633, + 133.939 + ], + [ + 320.508, + 148.456 + ] + ] + ], + [ + [ + [ + 331.037, + 116.555 + ], + [ + 334.455, + 133.81 + ], + [ + 350.615, + 130.609 + ], + [ + 347.198, + 113.354 + ] + ] + ], + [ + [ + [ + 365.144, + 127.731 + ], + [ + 361.178, + 107.708 + ], + [ + 346.649, + 110.586 + ], + [ + 350.615, + 130.609 + ] + ] + ], + [ + [ + [ + 336.097, + 142.101 + ], + [ + 344.078, + 140.785 + ], + [ + 350.004, + 139.677 + ], + [ + 348.299, + 131.068 + ], + [ + 334.455, + 133.81 + ] + ] + ], + [ + [ + [ + 363.231, + 128.11 + ], + [ + 348.299, + 131.068 + ], + [ + 350.559, + 142.481 + ], + [ + 365.524, + 139.683 + ] + ] + ], + [ + [ + [ + 159.669, + 140.473 + ], + [ + 176.578, + 136.354 + ], + [ + 173.107, + 125.24 + ], + [ + 156.529, + 130.418 + ] + ] + ], + [ + [ + [ + 159.78, + 129.403 + ], + [ + 173.107, + 125.24 + ], + [ + 170.518, + 116.951 + ], + [ + 157.191, + 121.113 + ] + ] + ], + [ + [ + [ + 187.62, + 110.902 + ], + [ + 170.317, + 116.306 + ], + [ + 176.578, + 136.354 + ], + [ + 191.495, + 132.719 + ] + ] + ], + [ + [ + [ + 181.753, + 157.839 + ], + [ + 178.808, + 135.81 + ], + [ + 163.798, + 139.468 + ], + [ + 164.941, + 143.128 + ], + [ + 165.31, + 158.24 + ] + ] + ], + [ + [ + [ + 195.567, + 155.646 + ], + [ + 191.495, + 132.719 + ], + [ + 178.808, + 135.81 + ], + [ + 181.506, + 155.989 + ] + ] + ], + [ + [ + [ + 210.782, + 104.326 + ], + [ + 214.075, + 117.655 + ], + [ + 231.051, + 114.53 + ], + [ + 228.187, + 98.974 + ], + [ + 222.738, + 100.592 + ] + ] + ], + [ + [ + [ + 232.929, + 131.337 + ], + [ + 229.875, + 114.746 + ], + [ + 214.075, + 117.655 + ], + [ + 218.127, + 134.062 + ] + ] + ], + [ + [ + [ + 187.802, + 111.927 + ], + [ + 190.994, + 129.897 + ], + [ + 203.154, + 127.737 + ], + [ + 198.479, + 108.592 + ] + ] + ], + [ + [ + [ + 210.728, + 104.105 + ], + [ + 198.329, + 107.977 + ], + [ + 203.154, + 127.737 + ], + [ + 216.001, + 125.455 + ] + ] + ], + [ + [ + [ + 218.557, + 156.272 + ], + [ + 217.175, + 144.768 + ], + [ + 194.127, + 147.536 + ], + [ + 195.828, + 157.113 + ], + [ + 216.553, + 156.385 + ] + ] + ], + [ + [ + [ + 233.038, + 131.316 + ], + [ + 215.938, + 134.465 + ], + [ + 217.367, + 146.363 + ], + [ + 235.204, + 143.079 + ] + ] + ], + [ + [ + [ + 237.145, + 142.722 + ], + [ + 217.367, + 146.363 + ], + [ + 218.618, + 156.781 + ], + [ + 236.577, + 155.766 + ], + [ + 239.504, + 155.537 + ] + ] + ], + [ + [ + [ + 174.808, + 243.032 + ], + [ + 176.476, + 210.521 + ], + [ + 164.31, + 210.817 + ], + [ + 164.616, + 223.384 + ], + [ + 160.881, + 241.242 + ] + ] + ], + [ + [ + [ + 199.725, + 209.954 + ], + [ + 176.476, + 210.521 + ], + [ + 175.544, + 228.693 + ], + [ + 200.352, + 227.822 + ] + ] + ], + [ + [ + [ + 174.801, + 243.156 + ], + [ + 189.39, + 245.031 + ], + [ + 189.737, + 245.021 + ], + [ + 189.148, + 228.215 + ], + [ + 175.544, + 228.693 + ] + ] + ], + [ + [ + [ + 198.638, + 227.882 + ], + [ + 189.148, + 228.215 + ], + [ + 189.677, + 243.301 + ], + [ + 199.169, + 243.027 + ] + ] + ], + [ + [ + [ + 166.611, + 210.761 + ], + [ + 179.914, + 210.437 + ], + [ + 179.42, + 190.203 + ], + [ + 166.118, + 190.527 + ] + ] + ], + [ + [ + [ + 179.914, + 210.437 + ], + [ + 199.725, + 209.954 + ], + [ + 199.479, + 202.954 + ], + [ + 179.743, + 203.436 + ] + ] + ], + [ + [ + [ + 196.37, + 189.789 + ], + [ + 179.42, + 190.203 + ], + [ + 179.743, + 203.436 + ], + [ + 196.834, + 203.019 + ] + ] + ], + [ + [ + [ + 162.856, + 190.607 + ], + [ + 180.993, + 190.165 + ], + [ + 180.417, + 166.551 + ], + [ + 162.28, + 166.994 + ] + ] + ], + [ + [ + [ + 199.015, + 189.725 + ], + [ + 198.112, + 164.007 + ], + [ + 195.944, + 164.083 + ], + [ + 180.366, + 164.463 + ], + [ + 180.993, + 190.165 + ] + ] + ], + [ + [ + [ + 207.78, + 207.848 + ], + [ + 208.452, + 227.008 + ], + [ + 223.984, + 225.492 + ], + [ + 222.126, + 206.448 + ] + ] + ], + [ + [ + [ + 225.673, + 242.801 + ], + [ + 223.984, + 225.492 + ], + [ + 206.143, + 227.233 + ], + [ + 206.734, + 244.089 + ], + [ + 221.013, + 243.676 + ] + ] + ], + [ + [ + [ + 235.334, + 243.811 + ], + [ + 250.203, + 241.019 + ], + [ + 255.991, + 239.454 + ], + [ + 253.303, + 229.507 + ], + [ + 233.352, + 233.254 + ] + ] + ], + [ + [ + [ + 249.029, + 220.095 + ], + [ + 231.394, + 222.829 + ], + [ + 233.352, + 233.254 + ], + [ + 251.524, + 229.841 + ], + [ + 249.56, + 222.575 + ] + ] + ], + [ + [ + [ + 223.839, + 224.001 + ], + [ + 225.944, + 245.574 + ], + [ + 235.334, + 243.811 + ], + [ + 231.394, + 222.829 + ] + ] + ], + [ + [ + [ + 243.601, + 204.352 + ], + [ + 235.476, + 205.145 + ], + [ + 238.059, + 221.796 + ], + [ + 247.036, + 220.404 + ] + ] + ], + [ + [ + [ + 220.933, + 167.024 + ], + [ + 221.515, + 172.575 + ], + [ + 241.897, + 170.438 + ], + [ + 241.411, + 165.807 + ], + [ + 238.643, + 166.023 + ] + ] + ], + [ + [ + [ + 243.287, + 183.007 + ], + [ + 241.969, + 170.431 + ], + [ + 221.515, + 172.575 + ], + [ + 222.833, + 185.151 + ] + ] + ], + [ + [ + [ + 217.654, + 163.321 + ], + [ + 202.909, + 163.838 + ], + [ + 203.728, + 187.154 + ], + [ + 222.833, + 185.151 + ], + [ + 220.528, + 163.158 + ] + ] + ], + [ + [ + [ + 241.217, + 183.224 + ], + [ + 233.707, + 184.011 + ], + [ + 235.767, + 205.117 + ], + [ + 244.417, + 204.273 + ], + [ + 241.499, + 185.918 + ] + ] + ], + [ + [ + [ + 205.158, + 187.004 + ], + [ + 205.492, + 196.527 + ], + [ + 223.366, + 194.783 + ], + [ + 222.431, + 185.193 + ] + ] + ], + [ + [ + [ + 206.631, + 207.96 + ], + [ + 224.482, + 206.218 + ], + [ + 223.366, + 194.783 + ], + [ + 206.227, + 196.455 + ] + ] + ], + [ + [ + [ + 207.281, + 292.658 + ], + [ + 209.66, + 296.115 + ], + [ + 234.63, + 282.933 + ], + [ + 231.222, + 273.057 + ], + [ + 206.84, + 277.418 + ] + ] + ], + [ + [ + [ + 206.84, + 277.418 + ], + [ + 231.222, + 273.057 + ], + [ + 227.17, + 261.311 + ], + [ + 206.482, + 265.011 + ] + ] + ], + [ + [ + [ + 209.864, + 264.406 + ], + [ + 227.17, + 261.311 + ], + [ + 224.617, + 253.912 + ], + [ + 224.098, + 254.009 + ], + [ + 209.575, + 254.429 + ] + ] + ], + [ + [ + [ + 242.511, + 247.347 + ], + [ + 223.579, + 250.902 + ], + [ + 228.048, + 263.857 + ], + [ + 246.063, + 257.642 + ] + ] + ], + [ + [ + [ + 234.63, + 282.933 + ], + [ + 251.683, + 273.931 + ], + [ + 246.063, + 257.642 + ], + [ + 228.048, + 263.857 + ] + ] + ], + [ + [ + [ + 257.11, + 255.547 + ], + [ + 246.592, + 259.176 + ], + [ + 251.226, + 272.607 + ], + [ + 261.021, + 267.436 + ], + [ + 260.966, + 267.295 + ] + ] + ], + [ + [ + [ + 242.916, + 248.52 + ], + [ + 246.592, + 259.176 + ], + [ + 258.221, + 255.164 + ], + [ + 255.898, + 248.087 + ], + [ + 255.256, + 245.711 + ], + [ + 249.286, + 247.324 + ] + ] + ], + [ + [ + [ + 222.462, + 310.652 + ], + [ + 243.34, + 298.021 + ], + [ + 238.447, + 288.753 + ], + [ + 215.667, + 300.779 + ] + ] + ], + [ + [ + [ + 233.879, + 326.151 + ], + [ + 241.337, + 321.639 + ], + [ + 231.414, + 305.236 + ], + [ + 222.991, + 310.332 + ] + ] + ], + [ + [ + [ + 236.626, + 335.294 + ], + [ + 241.29, + 332.084 + ], + [ + 256.407, + 322.775 + ], + [ + 252.305, + 315.004 + ], + [ + 231.376, + 327.665 + ] + ] + ], + [ + [ + [ + 269.603, + 288.671 + ], + [ + 256.176, + 295.235 + ], + [ + 261.729, + 305.374 + ], + [ + 274.531, + 299.603 + ] + ] + ], + [ + [ + [ + 267.745, + 316.36 + ], + [ + 278.143, + 310.666 + ], + [ + 282.236, + 308.688 + ], + [ + 281.248, + 306.641 + ], + [ + 277.476, + 298.275 + ], + [ + 261.729, + 305.374 + ] + ] + ], + [ + [ + [ + 254.772, + 319.677 + ], + [ + 256.81, + 318.422 + ], + [ + 266.091, + 313.34 + ], + [ + 256.176, + 295.235 + ], + [ + 244.803, + 300.794 + ] + ] + ], + [ + [ + [ + 239.098, + 289.986 + ], + [ + 244.803, + 300.794 + ], + [ + 262.017, + 292.379 + ], + [ + 256.034, + 281.045 + ] + ] + ], + [ + [ + [ + 254.884, + 278.866 + ], + [ + 262.017, + 292.379 + ], + [ + 270.296, + 288.332 + ], + [ + 264.624, + 273.724 + ] + ] + ], + [ + [ + [ + 152.382, + 287.032 + ], + [ + 149.29, + 301.812 + ], + [ + 161.624, + 308.194 + ], + [ + 169.468, + 300.711 + ], + [ + 170.569, + 289.851 + ] + ] + ], + [ + [ + [ + 172.511, + 270.705 + ], + [ + 154.056, + 268.834 + ], + [ + 150.316, + 286.712 + ], + [ + 170.569, + 289.851 + ] + ] + ], + [ + [ + [ + 200.318, + 286.503 + ], + [ + 176.969, + 285.653 + ], + [ + 176.554, + 297.063 + ], + [ + 189.018, + 297.517 + ], + [ + 194.247, + 303.899 + ], + [ + 201.568, + 297.901 + ], + [ + 200.607, + 296.505 + ] + ] + ], + [ + [ + [ + 155.744, + 313.804 + ], + [ + 167.332, + 325.95 + ], + [ + 180.19, + 315.415 + ], + [ + 167.737, + 302.362 + ] + ] + ], + [ + [ + [ + 201.656, + 273.661 + ], + [ + 172.511, + 270.705 + ], + [ + 171.017, + 285.437 + ], + [ + 202.029, + 286.565 + ] + ] + ], + [ + [ + [ + 201.93, + 273.689 + ], + [ + 201.304, + 252.015 + ], + [ + 189.891, + 252.345 + ], + [ + 189.162, + 272.394 + ] + ] + ], + [ + [ + [ + 180.273, + 254.727 + ], + [ + 178.59, + 271.322 + ], + [ + 189.162, + 272.394 + ], + [ + 189.762, + 255.885 + ], + [ + 189.368, + 255.896 + ] + ] + ], + [ + [ + [ + 178.59, + 271.322 + ], + [ + 180.627, + 251.238 + ], + [ + 168.017, + 249.617 + ], + [ + 165.946, + 270.039 + ] + ] + ], + [ + [ + [ + 156.263, + 269.057 + ], + [ + 165.946, + 270.039 + ], + [ + 167.744, + 252.309 + ], + [ + 159.975, + 251.31 + ] + ] + ], + [ + [ + [ + 184.792, + 341.683 + ], + [ + 195.391, + 352.792 + ], + [ + 210.701, + 340.334 + ], + [ + 201.04, + 328.462 + ] + ] + ], + [ + [ + [ + 198.107, + 358.206 + ], + [ + 200.285, + 361.204 + ], + [ + 217.504, + 348.694 + ], + [ + 210.701, + 340.334 + ], + [ + 194.013, + 353.914 + ] + ] + ], + [ + [ + [ + 226.73, + 330.02 + ], + [ + 212.037, + 341.976 + ], + [ + 216.13, + 347.005 + ], + [ + 222.227, + 342.576 + ], + [ + 231.146, + 336.437 + ] + ] + ], + [ + [ + [ + 217.101, + 315.392 + ], + [ + 201.04, + 328.462 + ], + [ + 212.037, + 341.976 + ], + [ + 227.011, + 329.791 + ] + ] + ], + [ + [ + [ + 185.814, + 340.852 + ], + [ + 194.327, + 333.924 + ], + [ + 179.575, + 315.919 + ], + [ + 169.725, + 323.99 + ] + ] + ], + [ + [ + [ + 202.565, + 297.083 + ], + [ + 194.732, + 303.501 + ], + [ + 209.526, + 321.556 + ], + [ + 215.861, + 316.401 + ] + ] + ], + [ + [ + [ + 368.884, + 166.816 + ], + [ + 346.885, + 171.173 + ], + [ + 349.459, + 184.172 + ], + [ + 371.458, + 179.815 + ] + ] + ], + [ + [ + [ + 373.155, + 179.478 + ], + [ + 349.459, + 184.172 + ], + [ + 351.895, + 196.467 + ], + [ + 375.591, + 191.773 + ] + ] + ], + [ + [ + [ + 330.767, + 198.79 + ], + [ + 351.54, + 194.676 + ], + [ + 346.885, + 171.173 + ], + [ + 326.112, + 175.288 + ] + ] + ], + [ + [ + [ + 372.734, + 166.053 + ], + [ + 368.569, + 145.023 + ], + [ + 349.404, + 148.606 + ], + [ + 353.61, + 169.841 + ] + ] + ], + [ + [ + [ + 322.148, + 155.275 + ], + [ + 326.112, + 175.288 + ], + [ + 353.61, + 169.841 + ], + [ + 349.822, + 150.719 + ], + [ + 346.908, + 151.264 + ], + [ + 325.461, + 154.801 + ] + ] + ], + [ + [ + [ + 325.575, + 172.579 + ], + [ + 296.45, + 178.348 + ], + [ + 299.255, + 192.51 + ], + [ + 328.38, + 186.741 + ] + ] + ], + [ + [ + [ + 302.292, + 207.84 + ], + [ + 331.417, + 202.071 + ], + [ + 328.38, + 186.741 + ], + [ + 299.255, + 192.51 + ] + ] + ], + [ + [ + [ + 321.723, + 153.131 + ], + [ + 304.237, + 155.632 + ], + [ + 292.239, + 157.087 + ], + [ + 296.45, + 178.348 + ], + [ + 325.575, + 172.579 + ] + ] + ], + [ + [ + [ + 267.939, + 161.418 + ], + [ + 272.626, + 185.081 + ], + [ + 290.916, + 181.458 + ], + [ + 286.559, + 159.459 + ], + [ + 281.756, + 160.042 + ] + ] + ], + [ + [ + [ + 267.608, + 159.748 + ], + [ + 261.028, + 160.403 + ], + [ + 246.912, + 161.504 + ], + [ + 248.243, + 174.204 + ], + [ + 269.633, + 169.968 + ] + ] + ], + [ + [ + [ + 249.132, + 182.682 + ], + [ + 250.219, + 189.519 + ], + [ + 272.626, + 185.081 + ], + [ + 269.633, + 169.968 + ], + [ + 248.243, + 174.204 + ] + ] + ], + [ + [ + [ + 266.167, + 186.36 + ], + [ + 250.219, + 189.519 + ], + [ + 252.473, + 203.699 + ], + [ + 268.955, + 200.434 + ] + ] + ], + [ + [ + [ + 270.961, + 210.563 + ], + [ + 268.955, + 200.434 + ], + [ + 255.238, + 203.151 + ], + [ + 257.399, + 213.249 + ] + ] + ], + [ + [ + [ + 268.799, + 199.649 + ], + [ + 271.625, + 213.914 + ], + [ + 283.552, + 211.552 + ], + [ + 280.726, + 197.286 + ] + ] + ], + [ + [ + [ + 292.207, + 195.012 + ], + [ + 280.726, + 197.286 + ], + [ + 282.866, + 208.087 + ], + [ + 294.346, + 205.813 + ] + ] + ], + [ + [ + [ + 292.125, + 181.218 + ], + [ + 266.167, + 186.36 + ], + [ + 268.799, + 199.649 + ], + [ + 294.757, + 194.507 + ] + ] + ], + [ + [ + [ + 292.543, + 239.743 + ], + [ + 286.39, + 215.883 + ], + [ + 273.846, + 218.368 + ], + [ + 280.18, + 242.931 + ] + ] + ], + [ + [ + [ + 262.305, + 237.967 + ], + [ + 277.865, + 233.954 + ], + [ + 274.157, + 219.577 + ], + [ + 258.333, + 222.711 + ], + [ + 258.911, + 225.411 + ] + ] + ], + [ + [ + [ + 265.303, + 246.768 + ], + [ + 280.18, + 242.931 + ], + [ + 277.865, + 233.954 + ], + [ + 262.781, + 237.844 + ], + [ + 264.677, + 244.86 + ] + ] + ], + [ + [ + [ + 284.037, + 264.776 + ], + [ + 278.514, + 243.361 + ], + [ + 266.877, + 246.362 + ], + [ + 272.065, + 262.167 + ], + [ + 274.283, + 267.879 + ] + ] + ], + [ + [ + [ + 298.393, + 262.426 + ], + [ + 292.543, + 239.743 + ], + [ + 278.514, + 243.361 + ], + [ + 284.565, + 266.826 + ] + ] + ], + [ + [ + [ + 297.905, + 260.534 + ], + [ + 312.849, + 255.78 + ], + [ + 307.419, + 234.725 + ], + [ + 292.258, + 238.635 + ] + ] + ], + [ + [ + [ + 318.473, + 231.874 + ], + [ + 307.419, + 234.725 + ], + [ + 312.956, + 256.197 + ], + [ + 323.724, + 252.771 + ] + ] + ], + [ + [ + [ + 303.865, + 214.277 + ], + [ + 309.031, + 234.309 + ], + [ + 317.88, + 232.027 + ], + [ + 312.967, + 212.474 + ] + ] + ], + [ + [ + [ + 287.322, + 219.496 + ], + [ + 288.798, + 225.218 + ], + [ + 305.571, + 220.892 + ], + [ + 304.341, + 216.125 + ] + ] + ], + [ + [ + [ + 292.577, + 269.314 + ], + [ + 273.085, + 275.515 + ], + [ + 276.834, + 285.169 + ], + [ + 278.67, + 289.243 + ], + [ + 296.719, + 282.334 + ] + ] + ], + [ + [ + [ + 285.597, + 304.611 + ], + [ + 286.558, + 306.6 + ], + [ + 297.34, + 301.391 + ], + [ + 302.138, + 299.366 + ], + [ + 296.719, + 282.334 + ], + [ + 278.67, + 289.243 + ] + ] + ], + [ + [ + [ + 293.529, + 272.305 + ], + [ + 295.968, + 279.972 + ], + [ + 314.227, + 274.162 + ], + [ + 311.788, + 266.496 + ] + ] + ], + [ + [ + [ + 318.562, + 287.787 + ], + [ + 314.227, + 274.162 + ], + [ + 295.968, + 279.972 + ], + [ + 300.759, + 295.031 + ], + [ + 314.023, + 289.435 + ] + ] + ], + [ + [ + [ + 335.141, + 286.512 + ], + [ + 327.988, + 258.048 + ], + [ + 310.837, + 263.505 + ], + [ + 319.915, + 292.04 + ] + ] + ], + [ + [ + [ + 330.882, + 235.617 + ], + [ + 340.373, + 233.737 + ], + [ + 335.136, + 207.294 + ], + [ + 324.304, + 209.44 + ] + ] + ], + [ + [ + [ + 335.545, + 209.362 + ], + [ + 337.454, + 219.002 + ], + [ + 352.316, + 216.058 + ], + [ + 350.406, + 206.419 + ] + ] + ], + [ + [ + [ + 330.801, + 249.55 + ], + [ + 357.887, + 244.185 + ], + [ + 355.234, + 230.794 + ], + [ + 327.47, + 236.293 + ] + ] + ], + [ + [ + [ + 368.593, + 199.601 + ], + [ + 349.793, + 203.325 + ], + [ + 352.109, + 215.015 + ], + [ + 370.909, + 211.292 + ] + ] + ], + [ + [ + [ + 368.749, + 200.389 + ], + [ + 373.074, + 222.227 + ], + [ + 381.398, + 220.578 + ], + [ + 377.072, + 198.741 + ] + ] + ], + [ + [ + [ + 387.065, + 238.406 + ], + [ + 383.453, + 220.171 + ], + [ + 372.242, + 222.392 + ], + [ + 375.854, + 240.626 + ] + ] + ], + [ + [ + [ + 354.275, + 225.95 + ], + [ + 357.887, + 244.185 + ], + [ + 375.854, + 240.626 + ], + [ + 372.242, + 222.392 + ] + ] + ], + [ + [ + [ + 356.65, + 249.471 + ], + [ + 363.819, + 277.969 + ], + [ + 373.156, + 275.62 + ], + [ + 367.549, + 247.312 + ] + ] + ], + [ + [ + [ + 367.858, + 248.869 + ], + [ + 370.038, + 259.875 + ], + [ + 386.78, + 256.558 + ], + [ + 384.601, + 245.553 + ] + ] + ], + [ + [ + [ + 388.427, + 256.232 + ], + [ + 370.038, + 259.875 + ], + [ + 372.949, + 274.573 + ], + [ + 375.808, + 273.854 + ], + [ + 391.309, + 270.784 + ] + ] + ], + [ + [ + [ + 334.742, + 265.231 + ], + [ + 339.711, + 285.005 + ], + [ + 350.308, + 281.757 + ], + [ + 345.477, + 262.534 + ] + ] + ], + [ + [ + [ + 363.304, + 275.923 + ], + [ + 359.076, + 259.116 + ], + [ + 345.477, + 262.534 + ], + [ + 349.83, + 279.855 + ], + [ + 359.708, + 276.828 + ] + ] + ], + [ + [ + [ + 356.615, + 249.33 + ], + [ + 331.973, + 254.211 + ], + [ + 334.742, + 265.231 + ], + [ + 359.076, + 259.116 + ] + ] + ], + [ + [ + [ + 460.069, + 272.045 + ], + [ + 460.555, + 283.389 + ], + [ + 483.289, + 283.571 + ], + [ + 483.953, + 272.338 + ], + [ + 481.567, + 272.197 + ], + [ + 460.493, + 272.027 + ] + ] + ], + [ + [ + [ + 473.633, + 305.699 + ], + [ + 487.724, + 292.953 + ], + [ + 487.355, + 287.98 + ], + [ + 489.053, + 285.621 + ], + [ + 483.28, + 283.727 + ], + [ + 483.182, + 285.381 + ], + [ + 467.823, + 299.275 + ] + ] + ], + [ + [ + [ + 500.247, + 279.117 + ], + [ + 500.853, + 271.958 + ], + [ + 484.034, + 270.964 + ], + [ + 483.28, + 283.727 + ], + [ + 489.872, + 285.89 + ], + [ + 493.098, + 281.411 + ], + [ + 496.636, + 280.513 + ], + [ + 497.059, + 279.926 + ] + ] + ], + [ + [ + [ + 431.484, + 301.07 + ], + [ + 440.686, + 314.884 + ], + [ + 452.456, + 305.714 + ], + [ + 443.868, + 292.82 + ] + ] + ], + [ + [ + [ + 475.418, + 307.672 + ], + [ + 464.887, + 296.029 + ], + [ + 453.261, + 305.087 + ], + [ + 464.518, + 317.532 + ] + ] + ], + [ + [ + [ + 440.686, + 314.884 + ], + [ + 447.29, + 324.797 + ], + [ + 451.428, + 329.372 + ], + [ + 464.518, + 317.532 + ], + [ + 453.261, + 305.087 + ] + ] + ], + [ + [ + [ + 433.629, + 299.641 + ], + [ + 445.985, + 291.41 + ], + [ + 448.374, + 291.308 + ], + [ + 447.493, + 270.742 + ], + [ + 444.87, + 270.855 + ], + [ + 425.514, + 272.674 + ] + ] + ], + [ + [ + [ + 460.109, + 272.972 + ], + [ + 447.611, + 273.507 + ], + [ + 448.374, + 291.308 + ], + [ + 460.872, + 290.773 + ] + ] + ], + [ + [ + [ + 362.062, + 323.408 + ], + [ + 365.234, + 333.758 + ], + [ + 369.8, + 338.865 + ], + [ + 395.265, + 319.172 + ], + [ + 391.553, + 314.371 + ] + ] + ], + [ + [ + [ + 391.808, + 346.956 + ], + [ + 379.656, + 331.242 + ], + [ + 368.431, + 339.923 + ], + [ + 381.705, + 354.769 + ] + ] + ], + [ + [ + [ + 406.423, + 333.6 + ], + [ + 395.265, + 319.172 + ], + [ + 379.656, + 331.242 + ], + [ + 390.814, + 345.671 + ] + ] + ], + [ + [ + [ + 359.093, + 324.318 + ], + [ + 390.354, + 314.738 + ], + [ + 386.486, + 299.356 + ], + [ + 354.452, + 309.172 + ] + ] + ], + [ + [ + [ + 381.784, + 280.661 + ], + [ + 380.278, + 280.959 + ], + [ + 367.032, + 284.292 + ], + [ + 372.922, + 303.512 + ], + [ + 386.486, + 299.356 + ] + ] + ], + [ + [ + [ + 358.696, + 284.207 + ], + [ + 347.822, + 287.539 + ], + [ + 354.452, + 309.172 + ], + [ + 372.922, + 303.512 + ], + [ + 366.411, + 282.266 + ] + ] + ], + [ + [ + [ + 403.205, + 276.285 + ], + [ + 408.209, + 298.78 + ], + [ + 421.628, + 294.742 + ], + [ + 415.533, + 274.489 + ] + ] + ], + [ + [ + [ + 402.815, + 274.533 + ], + [ + 399.808, + 274.971 + ], + [ + 381.276, + 278.641 + ], + [ + 384.612, + 291.906 + ], + [ + 405.511, + 286.651 + ] + ] + ], + [ + [ + [ + 421.631, + 294.741 + ], + [ + 412.754, + 297.412 + ], + [ + 425.172, + 321.171 + ], + [ + 432.62, + 315.411 + ], + [ + 423.922, + 302.355 + ] + ] + ], + [ + [ + [ + 424.327, + 319.554 + ], + [ + 420.741, + 312.693 + ], + [ + 400.346, + 325.743 + ], + [ + 406.326, + 333.475 + ] + ] + ], + [ + [ + [ + 384.284, + 360.512 + ], + [ + 396.957, + 374.685 + ], + [ + 396.859, + 373.761 + ], + [ + 402.518, + 365.367 + ], + [ + 406.873, + 364.117 + ], + [ + 399.107, + 349.05 + ] + ] + ], + [ + [ + [ + 406.224, + 362.857 + ], + [ + 413.512, + 360.765 + ], + [ + 415.17, + 361.503 + ], + [ + 419.655, + 357.446 + ], + [ + 407.903, + 342.248 + ], + [ + 399.107, + 349.05 + ] + ] + ], + [ + [ + [ + 430.261, + 348.519 + ], + [ + 418.86, + 333.775 + ], + [ + 407.903, + 342.248 + ], + [ + 419.958, + 357.838 + ] + ] + ], + [ + [ + [ + 434.047, + 322.03 + ], + [ + 418.86, + 333.775 + ], + [ + 430.026, + 348.214 + ], + [ + 444.139, + 335.448 + ], + [ + 439.763, + 330.61 + ] + ] + ], + [ + [ + [ + 261.017, + 407.317 + ], + [ + 255.974, + 400.377 + ], + [ + 240.299, + 411.765 + ], + [ + 242.425, + 414.691 + ], + [ + 243.893, + 417.704 + ] + ] + ], + [ + [ + [ + 226.831, + 397.744 + ], + [ + 238.151, + 413.325 + ], + [ + 247.048, + 406.862 + ], + [ + 235.728, + 391.28 + ] + ] + ], + [ + [ + [ + 262.885, + 409.889 + ], + [ + 276.839, + 401.425 + ], + [ + 268.987, + 390.617 + ], + [ + 255.828, + 400.176 + ] + ] + ], + [ + [ + [ + 275.173, + 399.132 + ], + [ + 287.263, + 391.799 + ], + [ + 279.126, + 380.598 + ], + [ + 267.725, + 388.881 + ] + ] + ], + [ + [ + [ + 302.946, + 385.59 + ], + [ + 292.238, + 371.072 + ], + [ + 279.126, + 380.598 + ], + [ + 288.929, + 394.092 + ] + ] + ], + [ + [ + [ + 292.238, + 371.072 + ], + [ + 282.227, + 357.5 + ], + [ + 266.673, + 368.799 + ], + [ + 276.585, + 382.444 + ] + ] + ], + [ + [ + [ + 265.808, + 369.428 + ], + [ + 282.227, + 357.5 + ], + [ + 276.67, + 349.967 + ], + [ + 260.307, + 361.854 + ] + ] + ], + [ + [ + [ + 264.372, + 336.681 + ], + [ + 249.741, + 347.31 + ], + [ + 260.307, + 361.854 + ], + [ + 275.043, + 351.149 + ] + ] + ], + [ + [ + [ + 249.016, + 335.759 + ], + [ + 254.759, + 343.665 + ], + [ + 264.334, + 336.708 + ], + [ + 259.069, + 329.569 + ] + ] + ], + [ + [ + [ + 232.497, + 346.471 + ], + [ + 238.854, + 355.22 + ], + [ + 254.759, + 343.665 + ], + [ + 248.849, + 335.53 + ], + [ + 244.52, + 338.196 + ] + ] + ], + [ + [ + [ + 218.255, + 385.94 + ], + [ + 226.831, + 397.744 + ], + [ + 243.753, + 385.451 + ], + [ + 235.177, + 373.646 + ] + ] + ], + [ + [ + [ + 218.255, + 385.94 + ], + [ + 237.868, + 371.692 + ], + [ + 231.794, + 363.331 + ], + [ + 212.181, + 377.579 + ] + ] + ], + [ + [ + [ + 222.718, + 350.839 + ], + [ + 203.106, + 365.087 + ], + [ + 212.181, + 377.579 + ], + [ + 231.794, + 363.331 + ] + ] + ], + [ + [ + [ + 232.951, + 347.095 + ], + [ + 228.658, + 350.05 + ], + [ + 224.395, + 353.147 + ], + [ + 237.868, + 371.692 + ], + [ + 246.346, + 365.532 + ] + ] + ], + [ + [ + [ + 277.658, + 409.246 + ], + [ + 261.563, + 419.008 + ], + [ + 272.942, + 437.096 + ], + [ + 290.62, + 425.974 + ] + ] + ], + [ + [ + [ + 245.595, + 425.991 + ], + [ + 256.153, + 447.659 + ], + [ + 272.942, + 437.096 + ], + [ + 260.332, + 417.052 + ] + ] + ], + [ + [ + [ + 260.025, + 445.223 + ], + [ + 267.128, + 459.802 + ], + [ + 282.473, + 450.427 + ], + [ + 272.647, + 437.282 + ] + ] + ], + [ + [ + [ + 288.1, + 473.822 + ], + [ + 274.402, + 455.358 + ], + [ + 265.375, + 460.874 + ], + [ + 271.318, + 473.07 + ], + [ + 277.163, + 470.855 + ], + [ + 287.416, + 474.433 + ] + ] + ], + [ + [ + [ + 294.516, + 466.539 + ], + [ + 282.473, + 450.427 + ], + [ + 274.402, + 455.358 + ], + [ + 287.411, + 472.893 + ] + ] + ], + [ + [ + [ + 294.607, + 466.661 + ], + [ + 302.576, + 459.536 + ], + [ + 292.731, + 446.365 + ], + [ + 284.202, + 452.74 + ] + ] + ], + [ + [ + [ + 310.512, + 451.647 + ], + [ + 301.399, + 439.886 + ], + [ + 292.731, + 446.365 + ], + [ + 302.221, + 459.061 + ] + ] + ], + [ + [ + [ + 312.436, + 454.13 + ], + [ + 324.448, + 443.389 + ], + [ + 312.175, + 427.549 + ], + [ + 299.468, + 437.394 + ] + ] + ], + [ + [ + [ + 325.185, + 422.184 + ], + [ + 314.458, + 430.496 + ], + [ + 322.762, + 441.212 + ], + [ + 332.679, + 432.344 + ] + ] + ], + [ + [ + [ + 316.309, + 411.432 + ], + [ + 305.923, + 419.48 + ], + [ + 314.458, + 430.496 + ], + [ + 324.584, + 422.65 + ] + ] + ], + [ + [ + [ + 306.838, + 397.31 + ], + [ + 302.625, + 400.207 + ], + [ + 312.418, + 414.447 + ], + [ + 316.911, + 410.966 + ] + ] + ], + [ + [ + [ + 287.877, + 402.473 + ], + [ + 291.555, + 407.82 + ], + [ + 308.416, + 396.225 + ], + [ + 305.251, + 391.934 + ] + ] + ], + [ + [ + [ + 276.233, + 407.407 + ], + [ + 293.216, + 429.325 + ], + [ + 301.78, + 422.69 + ], + [ + 286.844, + 400.97 + ] + ] + ], + [ + [ + [ + 353.061, + 416.368 + ], + [ + 347.547, + 408.893 + ], + [ + 335.131, + 418.051 + ], + [ + 341.509, + 426.697 + ] + ] + ], + [ + [ + [ + 335.662, + 392.781 + ], + [ + 321.773, + 403.026 + ], + [ + 333.657, + 419.138 + ], + [ + 347.547, + 408.893 + ] + ] + ], + [ + [ + [ + 353.699, + 417.234 + ], + [ + 370.581, + 402.139 + ], + [ + 364.117, + 393.376 + ], + [ + 345.973, + 406.759 + ] + ] + ], + [ + [ + [ + 323.428, + 401.806 + ], + [ + 335.877, + 392.623 + ], + [ + 328.723, + 382.925 + ], + [ + 316.274, + 392.108 + ] + ] + ], + [ + [ + [ + 353.806, + 379.398 + ], + [ + 345.965, + 368.768 + ], + [ + 328.036, + 381.993 + ], + [ + 335.877, + 392.623 + ] + ] + ], + [ + [ + [ + 345.965, + 368.768 + ], + [ + 359.434, + 387.027 + ], + [ + 370.803, + 376.861 + ], + [ + 358.185, + 359.755 + ] + ] + ], + [ + [ + [ + 359.144, + 361.055 + ], + [ + 370.803, + 376.861 + ], + [ + 379.641, + 368.958 + ], + [ + 367.237, + 355.086 + ] + ] + ], + [ + [ + [ + 379.821, + 368.797 + ], + [ + 372.716, + 375.15 + ], + [ + 384.142, + 387.929 + ], + [ + 391.247, + 381.576 + ] + ] + ], + [ + [ + [ + 359.434, + 387.027 + ], + [ + 370.581, + 402.139 + ], + [ + 385.178, + 389.088 + ], + [ + 372.716, + 375.15 + ] + ] + ], + [ + [ + [ + 357.841, + 354.044 + ], + [ + 366.41, + 347.723 + ], + [ + 358.553, + 338.936 + ], + [ + 351.271, + 315.176 + ], + [ + 339.539, + 320.093 + ] + ] + ], + [ + [ + [ + 327.696, + 298.123 + ], + [ + 330.245, + 302.853 + ], + [ + 345.541, + 296.477 + ], + [ + 344.278, + 292.354 + ], + [ + 339.834, + 293.716 + ] + ] + ], + [ + [ + [ + 339.539, + 320.093 + ], + [ + 351.271, + 315.176 + ], + [ + 345.541, + 296.477 + ], + [ + 330.245, + 302.853 + ] + ] + ], + [ + [ + [ + 344.849, + 345.242 + ], + [ + 325.865, + 357.285 + ], + [ + 333.104, + 367.099 + ], + [ + 349.938, + 354.682 + ] + ] + ], + [ + [ + [ + 341.802, + 334.405 + ], + [ + 319.325, + 348.419 + ], + [ + 325.865, + 357.285 + ], + [ + 346.931, + 343.921 + ] + ] + ], + [ + [ + [ + 335.584, + 370.461 + ], + [ + 319.325, + 348.419 + ], + [ + 308.075, + 355.433 + ], + [ + 324.947, + 378.307 + ] + ] + ], + [ + [ + [ + 293.41, + 364.576 + ], + [ + 311.083, + 388.534 + ], + [ + 324.947, + 378.307 + ], + [ + 308.075, + 355.433 + ] + ] + ], + [ + [ + [ + 280.342, + 314.934 + ], + [ + 263.569, + 324.119 + ], + [ + 276.399, + 341.513 + ], + [ + 290.788, + 332.367 + ], + [ + 280.926, + 314.652 + ] + ] + ], + [ + [ + [ + 296.889, + 311.604 + ], + [ + 283.237, + 318.201 + ], + [ + 282.98, + 318.341 + ], + [ + 290.788, + 332.367 + ], + [ + 303.706, + 324.155 + ] + ] + ], + [ + [ + [ + 277.9, + 340.558 + ], + [ + 284.68, + 349.75 + ], + [ + 299.222, + 340.507 + ], + [ + 293.11, + 330.891 + ] + ] + ], + [ + [ + [ + 297.415, + 362.079 + ], + [ + 308.529, + 355.149 + ], + [ + 299.222, + 340.507 + ], + [ + 287.159, + 348.174 + ] + ] + ], + [ + [ + [ + 326.467, + 315.008 + ], + [ + 316.117, + 320.629 + ], + [ + 328.204, + 342.883 + ], + [ + 338.151, + 336.681 + ] + ] + ], + [ + [ + [ + 309.319, + 303.688 + ], + [ + 317.972, + 319.621 + ], + [ + 328.81, + 313.735 + ], + [ + 320.856, + 298.98 + ], + [ + 318.17, + 299.955 + ] + ] + ], + [ + [ + [ + 296.603, + 311.076 + ], + [ + 305.054, + 326.637 + ], + [ + 317.972, + 319.621 + ], + [ + 310.119, + 305.161 + ], + [ + 300.081, + 309.396 + ] + ] + ], + [ + [ + [ + 493.551, + -73.547 + ], + [ + 494.02, + -64.214 + ], + [ + 513.355, + -65.187 + ], + [ + 512.829, + -75.638 + ] + ] + ], + [ + [ + [ + 493.326, + -78.009 + ], + [ + 479.283, + -76.485 + ], + [ + 479.912, + -63.988 + ], + [ + 493.996, + -64.697 + ] + ] + ], + [ + [ + [ + 459.402, + -64.503 + ], + [ + 479.834, + -65.531 + ], + [ + 479.384, + -74.48 + ], + [ + 459.117, + -72.282 + ] + ] + ], + [ + [ + [ + 457.766, + -44.983 + ], + [ + 480.81, + -46.143 + ], + [ + 479.834, + -65.531 + ], + [ + 457.058, + -64.385 + ] + ] + ], + [ + [ + [ + 462.196, + -45.206 + ], + [ + 462.676, + -32.065 + ], + [ + 477.688, + -32.82 + ], + [ + 477.028, + -45.953 + ] + ] + ], + [ + [ + [ + 478.38, + -19.077 + ], + [ + 477.688, + -32.82 + ], + [ + 461.58, + -32.01 + ], + [ + 462.028, + -19.767 + ] + ] + ], + [ + [ + [ + 478.512, + -16.454 + ], + [ + 498.486, + -15.611 + ], + [ + 497.766, + -29.919 + ], + [ + 477.885, + -28.919 + ] + ] + ], + [ + [ + [ + 515.707, + -18.441 + ], + [ + 514.229, + -47.825 + ], + [ + 496.909, + -46.953 + ], + [ + 498.307, + -19.176 + ] + ] + ], + [ + [ + [ + 515.887, + -14.877 + ], + [ + 533.112, + -14.15 + ], + [ + 535.957, + -37.768 + ], + [ + 514.698, + -38.495 + ] + ] + ], + [ + [ + [ + 531.546, + -37.919 + ], + [ + 533.857, + -57.096 + ], + [ + 513.727, + -57.785 + ], + [ + 514.698, + -38.495 + ] + ] + ], + [ + [ + [ + 512.742, + -77.371 + ], + [ + 513.727, + -57.785 + ], + [ + 525.506, + -57.382 + ], + [ + 524.711, + -78.669 + ] + ] + ], + [ + [ + [ + 524.648, + -80.367 + ], + [ + 525.506, + -57.382 + ], + [ + 536.506, + -57.006 + ], + [ + 539.515, + -81.98 + ] + ] + ], + [ + [ + [ + 476.63, + -11.73 + ], + [ + 458.954, + -12.476 + ], + [ + 459.561, + 4.163 + ], + [ + 475.93, + 4.854 + ] + ] + ], + [ + [ + [ + 461.802, + 13.833 + ], + [ + 475.528, + 14.384 + ], + [ + 475.93, + 4.854 + ], + [ + 461.452, + 4.242 + ] + ] + ], + [ + [ + [ + 497.144, + -10.864 + ], + [ + 476.63, + -11.73 + ], + [ + 476.026, + 2.581 + ], + [ + 496.54, + 3.447 + ] + ] + ], + [ + [ + [ + 514.302, + -10.14 + ], + [ + 497.144, + -10.864 + ], + [ + 496.6, + 2.02 + ], + [ + 513.758, + 2.744 + ] + ] + ], + [ + [ + [ + 513.203, + 15.897 + ], + [ + 529.413, + 16.548 + ], + [ + 531.151, + 2.127 + ], + [ + 513.815, + 1.395 + ] + ] + ], + [ + [ + [ + 514.205, + -7.859 + ], + [ + 513.815, + 1.395 + ], + [ + 529.254, + 2.047 + ], + [ + 530.366, + -7.177 + ] + ] + ], + [ + [ + [ + 462.763, + 13.871 + ], + [ + 463.209, + 26.091 + ], + [ + 480.486, + 26.785 + ], + [ + 480.975, + 14.603 + ] + ] + ], + [ + [ + [ + 464.291, + 41.188 + ], + [ + 479.883, + 41.814 + ], + [ + 480.486, + 26.785 + ], + [ + 463.74, + 26.113 + ] + ] + ], + [ + [ + [ + 471.714, + 58.73 + ], + [ + 472.405, + 41.514 + ], + [ + 463.406, + 41.152 + ], + [ + 464.036, + 58.391 + ], + [ + 465.486, + 58.422 + ] + ] + ], + [ + [ + [ + 483.266, + 61.806 + ], + [ + 486.561, + 62.062 + ], + [ + 487.362, + 42.114 + ], + [ + 472.405, + 41.514 + ], + [ + 471.613, + 61.229 + ] + ] + ], + [ + [ + [ + 498.5, + 59.684 + ], + [ + 499.187, + 42.589 + ], + [ + 487.362, + 42.114 + ], + [ + 486.693, + 58.765 + ] + ] + ], + [ + [ + [ + 498.368, + 62.981 + ], + [ + 503.416, + 63.373 + ], + [ + 523.515, + 65.508 + ], + [ + 526.035, + 44.588 + ], + [ + 499.15, + 43.508 + ] + ] + ], + [ + [ + [ + 525.604, + 16.395 + ], + [ + 517.368, + 16.064 + ], + [ + 516.238, + 44.194 + ], + [ + 522.226, + 44.435 + ] + ] + ], + [ + [ + [ + 370.853, + -41.583 + ], + [ + 359.853, + -36.907 + ], + [ + 352.879, + -30.116 + ], + [ + 363.961, + -15.486 + ], + [ + 378.371, + -23.894 + ] + ] + ], + [ + [ + [ + 356.293, + -11.013 + ], + [ + 363.961, + -15.486 + ], + [ + 352.706, + -30.345 + ], + [ + 346.22, + -24.029 + ] + ] + ], + [ + [ + [ + 374.683, + 4.481 + ], + [ + 363.269, + -15.083 + ], + [ + 357.168, + -11.523 + ], + [ + 364.013, + -2.68 + ], + [ + 368.602, + 7.282 + ] + ] + ], + [ + [ + [ + 387.629, + -2.112 + ], + [ + 378.371, + -23.894 + ], + [ + 363.269, + -15.083 + ], + [ + 374.394, + 3.986 + ] + ] + ], + [ + [ + [ + 378.975, + -22.473 + ], + [ + 388.53, + 0.006 + ], + [ + 399.552, + -5.072 + ], + [ + 391.191, + -26.446 + ] + ] + ], + [ + [ + [ + 408.256, + -19.76 + ], + [ + 403.215, + -18.604 + ], + [ + 399.759, + -29.232 + ], + [ + 391.191, + -26.446 + ], + [ + 398.486, + -7.797 + ], + [ + 401.508, + -9.19 + ], + [ + 410.604, + -9.522 + ] + ] + ], + [ + [ + [ + 409.354, + -32.352 + ], + [ + 399.759, + -29.232 + ], + [ + 403.215, + -18.604 + ], + [ + 412.043, + -20.629 + ] + ] + ], + [ + [ + [ + 370.999, + -41.24 + ], + [ + 374.308, + -33.453 + ], + [ + 394.451, + -42.014 + ], + [ + 391.141, + -49.801 + ] + ] + ], + [ + [ + [ + 409.354, + -32.352 + ], + [ + 403.593, + -57.462 + ], + [ + 390.289, + -51.807 + ], + [ + 399.869, + -29.268 + ] + ] + ], + [ + [ + [ + 430.954, + -65.679 + ], + [ + 436.956, + -43.476 + ], + [ + 451.213, + -45.356 + ], + [ + 450.334, + -69.43 + ], + [ + 436.162, + -67.892 + ] + ] + ], + [ + [ + [ + 414.411, + -40.503 + ], + [ + 436.956, + -43.476 + ], + [ + 431.097, + -65.152 + ], + [ + 410.741, + -56.5 + ] + ] + ], + [ + [ + [ + 417.047, + -40.85 + ], + [ + 419.54, + -29.98 + ], + [ + 439.738, + -32.644 + ], + [ + 438.286, + -43.652 + ] + ] + ], + [ + [ + [ + 414.961, + -29.376 + ], + [ + 419.761, + -8.453 + ], + [ + 428.198, + -8.761 + ], + [ + 425.3, + -30.74 + ] + ] + ], + [ + [ + [ + 442.294, + -13.263 + ], + [ + 439.738, + -32.644 + ], + [ + 425.3, + -30.74 + ], + [ + 427.675, + -12.729 + ] + ] + ], + [ + [ + [ + 448.968, + -45.06 + ], + [ + 438.286, + -43.652 + ], + [ + 440.647, + -25.754 + ], + [ + 449.662, + -26.083 + ] + ] + ], + [ + [ + [ + 452.413, + -26.183 + ], + [ + 440.647, + -25.754 + ], + [ + 442.535, + -11.433 + ], + [ + 452.938, + -11.812 + ] + ] + ], + [ + [ + [ + 388.83, + 8.918 + ], + [ + 390.566, + 15.138 + ], + [ + 411.624, + 11.899 + ], + [ + 411.176, + -0.35 + ], + [ + 408.752, + -0.261 + ] + ] + ], + [ + [ + [ + 373.172, + 19.503 + ], + [ + 390.056, + 13.312 + ], + [ + 388.656, + 8.292 + ], + [ + 371.623, + 16.139 + ] + ] + ], + [ + [ + [ + 377.212, + 32.56 + ], + [ + 394.833, + 30.432 + ], + [ + 390.056, + 13.312 + ], + [ + 372.422, + 19.778 + ], + [ + 376.309, + 28.213 + ] + ] + ], + [ + [ + [ + 375.301, + 32.79 + ], + [ + 378.794, + 49.602 + ], + [ + 390.025, + 48.246 + ], + [ + 387.974, + 31.26 + ] + ] + ], + [ + [ + [ + 380.453, + 57.584 + ], + [ + 380.915, + 62.627 + ], + [ + 382.293, + 62.501 + ], + [ + 401.542, + 61.282 + ], + [ + 399.825, + 47.063 + ], + [ + 378.794, + 49.602 + ] + ] + ], + [ + [ + [ + 401.542, + 61.282 + ], + [ + 402.463, + 61.224 + ], + [ + 413.411, + 60.84 + ], + [ + 412.987, + 49.214 + ], + [ + 400.27, + 50.75 + ] + ] + ], + [ + [ + [ + 411.198, + 0.251 + ], + [ + 411.677, + 13.358 + ], + [ + 422.857, + 12.949 + ], + [ + 422.378, + -0.157 + ] + ] + ], + [ + [ + [ + 432.857, + -0.836 + ], + [ + 422.367, + -0.452 + ], + [ + 422.857, + 12.949 + ], + [ + 433.346, + 12.566 + ] + ] + ], + [ + [ + [ + 432.834, + -1.469 + ], + [ + 433.385, + 13.633 + ], + [ + 452.014, + 12.953 + ], + [ + 451.462, + -2.149 + ] + ] + ], + [ + [ + [ + 434.037, + 31.475 + ], + [ + 455.727, + 30.683 + ], + [ + 455.075, + 12.841 + ], + [ + 433.385, + 13.633 + ] + ] + ], + [ + [ + [ + 413.411, + 60.84 + ], + [ + 422.662, + 60.515 + ], + [ + 432.987, + 60.444 + ], + [ + 432.363, + 43.348 + ], + [ + 412.798, + 44.063 + ] + ] + ], + [ + [ + [ + 453.784, + 30.754 + ], + [ + 431.932, + 31.552 + ], + [ + 432.506, + 47.28 + ], + [ + 454.359, + 46.482 + ] + ] + ], + [ + [ + [ + 432.987, + 60.444 + ], + [ + 442.873, + 60.376 + ], + [ + 456.822, + 60.673 + ], + [ + 456.301, + 46.411 + ], + [ + 432.506, + 47.28 + ] + ] + ], + [ + [ + [ + 339.34, + 38.521 + ], + [ + 315.448, + 47.476 + ], + [ + 318.271, + 57.818 + ], + [ + 342.611, + 51.841 + ] + ] + ], + [ + [ + [ + 345.646, + 64.201 + ], + [ + 342.611, + 51.841 + ], + [ + 318.271, + 57.818 + ], + [ + 321.012, + 67.859 + ], + [ + 323.184, + 67.473 + ], + [ + 343.175, + 64.498 + ] + ] + ], + [ + [ + [ + 321.55, + 69.831 + ], + [ + 315.448, + 47.476 + ], + [ + 303.516, + 51.949 + ], + [ + 309.006, + 72.061 + ] + ] + ], + [ + [ + [ + 288.329, + 57.641 + ], + [ + 294.764, + 74.81 + ], + [ + 302.208, + 73.269 + ], + [ + 309.006, + 72.061 + ], + [ + 303.516, + 51.949 + ] + ] + ], + [ + [ + [ + 339.583, + 39.511 + ], + [ + 342.596, + 51.782 + ], + [ + 369.431, + 46.207 + ], + [ + 366.433, + 31.777 + ], + [ + 365.518, + 29.79 + ] + ] + ], + [ + [ + [ + 342.596, + 51.782 + ], + [ + 346.154, + 66.269 + ], + [ + 359.896, + 64.618 + ], + [ + 356.623, + 48.868 + ] + ] + ], + [ + [ + [ + 368.789, + 46.34 + ], + [ + 356.623, + 48.868 + ], + [ + 359.694, + 63.646 + ], + [ + 371.604, + 62.555 + ], + [ + 371.167, + 57.784 + ] + ] + ], + [ + [ + [ + 317.594, + 1.019 + ], + [ + 331.202, + 14.994 + ], + [ + 338.252, + 33.803 + ], + [ + 342.871, + 32.071 + ], + [ + 335.579, + 12.614 + ], + [ + 321.03, + -2.326 + ] + ] + ], + [ + [ + [ + 350.768, + 27.559 + ], + [ + 344.206, + 10.052 + ], + [ + 335.799, + 13.203 + ], + [ + 342.361, + 30.71 + ] + ] + ], + [ + [ + [ + 321.129, + -2.225 + ], + [ + 335.579, + 12.614 + ], + [ + 335.799, + 13.203 + ], + [ + 344.206, + 10.052 + ], + [ + 343.833, + 9.056 + ], + [ + 343.872, + 9.025 + ], + [ + 328.15, + -9.062 + ] + ] + ], + [ + [ + [ + 328.396, + -8.78 + ], + [ + 343.872, + 9.025 + ], + [ + 352.801, + 2.115 + ], + [ + 337.505, + -17.649 + ] + ] + ], + [ + [ + [ + 358.111, + 12.521 + ], + [ + 346.73, + 16.787 + ], + [ + 350.792, + 27.623 + ], + [ + 362.967, + 23.06 + ] + ] + ], + [ + [ + [ + 353.086, + 1.895 + ], + [ + 343.833, + 9.056 + ], + [ + 346.73, + 16.787 + ], + [ + 358.545, + 12.358 + ], + [ + 354.664, + 3.934 + ] + ] + ], + [ + [ + [ + 338.252, + 33.803 + ], + [ + 331.69, + 16.296 + ], + [ + 322.022, + 20.841 + ], + [ + 328.281, + 37.54 + ] + ] + ], + [ + [ + [ + 301.356, + 30.555 + ], + [ + 308.181, + 45.074 + ], + [ + 328.281, + 37.54 + ], + [ + 322.022, + 20.841 + ] + ] + ], + [ + [ + [ + 320.165, + 3.659 + ], + [ + 311.062, + 12.522 + ], + [ + 318.047, + 22.71 + ], + [ + 331.69, + 16.296 + ], + [ + 331.202, + 14.994 + ] + ] + ], + [ + [ + [ + 296.258, + 19.71 + ], + [ + 301.356, + 30.555 + ], + [ + 318.047, + 22.71 + ], + [ + 310.416, + 11.58 + ] + ] + ], + [ + [ + [ + 284.25, + 40.958 + ], + [ + 302.266, + 32.49 + ], + [ + 295.602, + 18.314 + ], + [ + 279.276, + 27.689 + ] + ] + ], + [ + [ + [ + 286.644, + 53.146 + ], + [ + 308.181, + 45.074 + ], + [ + 302.266, + 32.49 + ], + [ + 282.401, + 41.827 + ] + ] + ], + [ + [ + [ + 230.391, + 68.621 + ], + [ + 236.506, + 89.216 + ], + [ + 243.219, + 87.223 + ], + [ + 248.016, + 85.944 + ], + [ + 241.861, + 65.215 + ] + ] + ], + [ + [ + [ + 262.748, + 82.018 + ], + [ + 264.919, + 81.505 + ], + [ + 258.606, + 60.243 + ], + [ + 241.861, + 65.215 + ], + [ + 248.016, + 85.944 + ] + ] + ], + [ + [ + [ + 232.761, + 67.917 + ], + [ + 258.606, + 60.243 + ], + [ + 255.867, + 51.018 + ], + [ + 230.022, + 58.691 + ] + ] + ], + [ + [ + [ + 264.919, + 81.505 + ], + [ + 282.417, + 77.366 + ], + [ + 290.007, + 75.795 + ], + [ + 286.086, + 65.333 + ], + [ + 262.221, + 72.418 + ] + ] + ], + [ + [ + [ + 286.086, + 65.333 + ], + [ + 277.447, + 42.285 + ], + [ + 269.485, + 44.649 + ], + [ + 276.473, + 68.187 + ] + ] + ], + [ + [ + [ + 255.673, + 50.364 + ], + [ + 262.221, + 72.418 + ], + [ + 276.473, + 68.187 + ], + [ + 269.925, + 46.132 + ] + ] + ], + [ + [ + [ + 225.26, + 51.341 + ], + [ + 225.651, + 52.657 + ], + [ + 238.286, + 48.906 + ], + [ + 240.2, + 27.544 + ], + [ + 234.048, + 25.069 + ], + [ + 220.694, + 47.66 + ] + ] + ], + [ + [ + [ + 209.148, + 35.42 + ], + [ + 221.868, + 45.674 + ], + [ + 234.048, + 25.069 + ], + [ + 218.875, + 18.964 + ] + ] + ], + [ + [ + [ + 206.775, + 11.258 + ], + [ + 194.737, + 26.19 + ], + [ + 208.192, + 37.037 + ], + [ + 218.672, + 19.306 + ], + [ + 216.2, + 18.311 + ], + [ + 215.15, + 17.465 + ], + [ + 213.802, + 16.923 + ] + ] + ], + [ + [ + [ + 270.868, + 32.006 + ], + [ + 262.803, + 36.638 + ], + [ + 260.893, + 35.87 + ], + [ + 259.985, + 36.392 + ], + [ + 257.692, + 35.47 + ], + [ + 257.662, + 42.07 + ], + [ + 272.94, + 37.533 + ] + ] + ], + [ + [ + [ + 240.144, + 28.174 + ], + [ + 238.511, + 46.397 + ], + [ + 257.668, + 40.709 + ], + [ + 257.693, + 35.235 + ] + ] + ], + [ + [ + [ + 224.359, + 71.905 + ], + [ + 208.523, + 76.85 + ], + [ + 213.232, + 91.929 + ], + [ + 220.845, + 89.552 + ], + [ + 228.89, + 87.163 + ] + ] + ], + [ + [ + [ + 219.936, + 62.169 + ], + [ + 205.359, + 66.721 + ], + [ + 208.523, + 76.85 + ], + [ + 222.956, + 72.343 + ] + ] + ], + [ + [ + [ + 213.311, + 92.181 + ], + [ + 209.791, + 80.91 + ], + [ + 194.628, + 85.646 + ], + [ + 198.148, + 96.916 + ] + ] + ], + [ + [ + [ + 205.359, + 66.721 + ], + [ + 188.924, + 71.854 + ], + [ + 193.356, + 86.043 + ], + [ + 209.791, + 80.91 + ] + ] + ], + [ + [ + [ + 204.709, + 43.657 + ], + [ + 198.361, + 47.722 + ], + [ + 206.932, + 66.23 + ], + [ + 221.726, + 61.61 + ], + [ + 220.073, + 56.043 + ] + ] + ], + [ + [ + [ + 184.216, + 56.778 + ], + [ + 188.924, + 71.854 + ], + [ + 206.932, + 66.23 + ], + [ + 198.361, + 47.722 + ] + ] + ], + [ + [ + [ + 206.588, + 42.454 + ], + [ + 189.327, + 28.538 + ], + [ + 183.678, + 35.545 + ], + [ + 195.901, + 49.297 + ] + ] + ], + [ + [ + [ + 185.282, + 56.096 + ], + [ + 195.901, + 49.297 + ], + [ + 185.66, + 37.774 + ], + [ + 181.263, + 43.228 + ] + ] + ], + [ + [ + [ + 184.864, + 84.789 + ], + [ + 167.465, + 90.223 + ], + [ + 172.162, + 105.262 + ], + [ + 189.561, + 99.828 + ] + ] + ], + [ + [ + [ + 172.706, + 107.003 + ], + [ + 167.465, + 90.223 + ], + [ + 147.394, + 96.491 + ], + [ + 152.635, + 113.271 + ] + ] + ], + [ + [ + [ + 143.621, + 83.78 + ], + [ + 166.693, + 76.575 + ], + [ + 163.123, + 65.143 + ], + [ + 140.051, + 72.348 + ] + ] + ], + [ + [ + [ + 148.33, + 96.199 + ], + [ + 170.645, + 89.229 + ], + [ + 166.693, + 76.575 + ], + [ + 144.378, + 83.544 + ] + ] + ], + [ + [ + [ + 162.827, + 64.195 + ], + [ + 165.084, + 71.424 + ], + [ + 180.87, + 66.494 + ], + [ + 178.612, + 59.265 + ] + ] + ], + [ + [ + [ + 184.438, + 84.922 + ], + [ + 178.877, + 67.116 + ], + [ + 165.084, + 71.424 + ], + [ + 170.645, + 89.229 + ] + ] + ], + [ + [ + [ + 175.843, + 37.115 + ], + [ + 188.615, + 21.272 + ], + [ + 179.25, + 13.722 + ], + [ + 166.478, + 29.565 + ] + ] + ], + [ + [ + [ + 200.906, + 6.526 + ], + [ + 191.296, + -1.221 + ], + [ + 179.25, + 13.722 + ], + [ + 188.86, + 21.469 + ] + ] + ], + [ + [ + [ + 172.891, + 34.736 + ], + [ + 166.478, + 29.565 + ], + [ + 161.195, + 36.119 + ], + [ + 170.932, + 51.326 + ], + [ + 174.361, + 50.255 + ], + [ + 170.458, + 37.754 + ] + ] + ], + [ + [ + [ + 160.957, + 36.414 + ], + [ + 144.877, + 44.043 + ], + [ + 151.4, + 60.735 + ], + [ + 172.698, + 54.084 + ], + [ + 161.195, + 36.119 + ] + ] + ], + [ + [ + [ + 150.84, + 59.303 + ], + [ + 144.877, + 44.043 + ], + [ + 133.989, + 49.209 + ], + [ + 139.449, + 60.715 + ], + [ + 140.059, + 62.67 + ] + ] + ], + [ + [ + [ + 175.208, + -11.026 + ], + [ + 169.642, + -4.121 + ], + [ + 178.123, + 2.716 + ], + [ + 183.689, + -4.189 + ] + ] + ], + [ + [ + [ + 178.857, + 3.307 + ], + [ + 169.642, + -4.121 + ], + [ + 155.152, + 13.853 + ], + [ + 164.367, + 21.282 + ] + ] + ], + [ + [ + [ + 134.345, + -25.791 + ], + [ + 131.299, + -24.895 + ], + [ + 139.134, + 1.743 + ], + [ + 141.266, + 3.462 + ], + [ + 152.946, + -21.692 + ] + ] + ], + [ + [ + [ + 174.794, + -10.512 + ], + [ + 169.906, + -14.453 + ], + [ + 151.471, + -18.516 + ], + [ + 141.266, + 3.462 + ], + [ + 154.76, + 14.34 + ] + ] + ], + [ + [ + [ + 151.709, + 18.344 + ], + [ + 140.21, + 28.327 + ], + [ + 144.614, + 35.54 + ], + [ + 155.087, + 30.571 + ], + [ + 159.73, + 24.81 + ] + ] + ], + [ + [ + [ + 137.334, + 7.864 + ], + [ + 130.79, + 12.898 + ], + [ + 140.21, + 28.327 + ], + [ + 151.047, + 18.918 + ] + ] + ], + [ + [ + [ + 118.628, + 22.254 + ], + [ + 124.587, + 34.812 + ], + [ + 139.309, + 26.851 + ], + [ + 130.79, + 12.898 + ] + ] + ], + [ + [ + [ + 127.734, + 46.864 + ], + [ + 146.184, + 38.11 + ], + [ + 139.309, + 26.851 + ], + [ + 122.541, + 35.919 + ] + ] + ], + [ + [ + [ + 126.694, + -23.54 + ], + [ + 114.921, + -20.077 + ], + [ + 119.967, + -2.922 + ], + [ + 131.74, + -6.385 + ] + ] + ], + [ + [ + [ + 123.401, + 8.75 + ], + [ + 112.177, + 14.076 + ], + [ + 116.745, + 23.703 + ], + [ + 138.227, + 7.177 + ], + [ + 134.953, + 4.538 + ], + [ + 131.74, + -6.385 + ], + [ + 119.967, + -2.922 + ] + ] + ], + [ + [ + [ + 107.016, + 1.533 + ], + [ + 119.841, + -3.354 + ], + [ + 115.63, + -17.669 + ], + [ + 100.076, + -13.094 + ] + ] + ], + [ + [ + [ + 112.177, + 14.076 + ], + [ + 123.401, + 8.75 + ], + [ + 119.841, + -3.354 + ], + [ + 106.346, + 1.788 + ] + ] + ], + [ + [ + [ + 15.771, + 281.047 + ], + [ + 20.731, + 290.609 + ], + [ + 34.795, + 283.315 + ], + [ + 29.835, + 273.752 + ] + ] + ], + [ + [ + [ + 55.07, + 312.552 + ], + [ + 58.947, + 305.155 + ], + [ + 41.336, + 295.926 + ], + [ + 41.039, + 295.354 + ], + [ + 34.294, + 301.665 + ] + ] + ], + [ + [ + [ + 44.919, + 329.856 + ], + [ + 21.539, + 319.613 + ], + [ + 16.323, + 334.184 + ], + [ + 42.47, + 339.778 + ], + [ + 44.367, + 330.909 + ] + ] + ], + [ + [ + [ + 52.369, + 311.137 + ], + [ + 43.432, + 306.454 + ], + [ + 33.736, + 324.956 + ], + [ + 43, + 329.015 + ] + ] + ], + [ + [ + [ + 15.383, + 280.298 + ], + [ + 5.294, + 285.53 + ], + [ + 15.094, + 304.425 + ], + [ + 25.626, + 308.196 + ], + [ + 28.965, + 298.872 + ], + [ + 23.542, + 296.03 + ] + ] + ], + [ + [ + [ + 16.39, + 333.997 + ], + [ + 19.598, + 325.034 + ], + [ + -2.742, + 328.219 + ], + [ + -2.078, + 332.014 + ], + [ + 13.094, + 333.292 + ] + ] + ], + [ + [ + [ + -1.299, + 327.816 + ], + [ + 16.99, + 324.618 + ], + [ + 7.415, + 306.157 + ], + [ + -4.396, + 310.1 + ] + ] + ], + [ + [ + [ + -2.255, + 287.512 + ], + [ + -11.019, + 292.058 + ], + [ + -7.673, + 311.193 + ], + [ + 7.415, + 306.157 + ] + ] + ], + [ + [ + [ + 74.079, + 271.014 + ], + [ + 70.82, + 267.53 + ], + [ + 54.326, + 278.987 + ], + [ + 65.074, + 288.196 + ] + ] + ], + [ + [ + [ + 56.097, + 303.661 + ], + [ + 64.472, + 287.679 + ], + [ + 54.326, + 278.987 + ], + [ + 38.318, + 290.107 + ], + [ + 41.336, + 295.926 + ] + ] + ], + [ + [ + [ + 29.681, + 273.454 + ], + [ + 38.318, + 290.107 + ], + [ + 50.819, + 281.423 + ], + [ + 42.125, + 267 + ] + ] + ], + [ + [ + [ + 61.06, + 257.099 + ], + [ + 42.088, + 266.939 + ], + [ + 50.819, + 281.423 + ], + [ + 70.82, + 267.53 + ] + ] + ], + [ + [ + [ + 89.653, + 246.559 + ], + [ + 86.909, + 241.267 + ], + [ + 59.533, + 255.466 + ], + [ + 75.847, + 272.904 + ] + ] + ], + [ + [ + [ + -15.487, + 294.375 + ], + [ + -43.454, + 308.88 + ], + [ + -40.296, + 318.405 + ], + [ + -12.506, + 311.42 + ] + ] + ], + [ + [ + [ + -15.929, + 312.28 + ], + [ + -25.51, + 314.688 + ], + [ + -22.053, + 334.892 + ], + [ + -15.058, + 333.696 + ], + [ + -13.769, + 333.804 + ], + [ + -12.212, + 333.538 + ] + ] + ], + [ + [ + [ + -34.101, + 337.087 + ], + [ + -22.031, + 335.022 + ], + [ + -25.51, + 314.688 + ], + [ + -40.296, + 318.405 + ] + ] + ], + [ + [ + [ + -63.287, + 337.327 + ], + [ + -61.177, + 339.481 + ], + [ + -38.034, + 325.225 + ], + [ + -42.808, + 310.828 + ], + [ + -44.391, + 311.649 + ], + [ + -47.729, + 309.781 + ] + ] + ], + [ + [ + [ + -34.757, + 335.108 + ], + [ + -38.034, + 325.225 + ], + [ + -61.177, + 339.481 + ], + [ + -55.779, + 344.992 + ], + [ + -54.584, + 344.033 + ] + ] + ], + [ + [ + [ + -68.595, + 299.845 + ], + [ + -76.953, + 314.644 + ], + [ + -64.446, + 321.708 + ], + [ + -56.059, + 306.86 + ] + ] + ], + [ + [ + [ + -83.923, + 326.983 + ], + [ + -70.066, + 334.809 + ], + [ + -63.097, + 322.47 + ], + [ + -76.953, + 314.644 + ] + ] + ], + [ + [ + [ + -69.057, + 300.664 + ], + [ + -79.815, + 294.644 + ], + [ + -86.36, + 306.233 + ], + [ + -75.627, + 312.295 + ] + ] + ], + [ + [ + [ + -91.364, + 289.471 + ], + [ + -97.331, + 300.037 + ], + [ + -86.36, + 306.233 + ], + [ + -80.368, + 295.624 + ] + ] + ], + [ + [ + [ + -89.537, + 286.237 + ], + [ + -109.371, + 275.139 + ], + [ + -116.876, + 288.427 + ], + [ + -97.087, + 299.604 + ] + ] + ], + [ + [ + [ + -118.264, + 270.163 + ], + [ + -124.164, + 280.706 + ], + [ + -134.968, + 298.152 + ], + [ + -125.416, + 303.547 + ], + [ + -109.371, + 275.139 + ] + ] + ], + [ + [ + [ + -131.337, + 300.203 + ], + [ + -140.321, + 314.711 + ], + [ + -121.606, + 325.281 + ], + [ + -113.221, + 310.435 + ] + ] + ], + [ + [ + [ + -141.298, + 314.159 + ], + [ + -149.59, + 327.55 + ], + [ + -129.346, + 338.984 + ], + [ + -121.606, + 325.281 + ] + ] + ], + [ + [ + [ + -160.335, + 339.117 + ], + [ + -136.898, + 352.355 + ], + [ + -129.346, + 338.984 + ], + [ + -152.244, + 326.051 + ] + ] + ], + [ + [ + [ + -114.71, + 361.904 + ], + [ + -104.844, + 344.435 + ], + [ + -114.62, + 338.913 + ], + [ + -124.487, + 356.382 + ] + ] + ], + [ + [ + [ + -125.754, + 332.625 + ], + [ + -136.898, + 352.355 + ], + [ + -125.764, + 358.643 + ], + [ + -114.62, + 338.913 + ] + ] + ], + [ + [ + [ + -81.284, + 354.671 + ], + [ + -70.066, + 334.809 + ], + [ + -79.457, + 329.505 + ], + [ + -90.676, + 349.367 + ] + ] + ], + [ + [ + [ + -93.743, + 376.729 + ], + [ + -81.284, + 354.671 + ], + [ + -94.449, + 347.235 + ], + [ + -106.907, + 369.293 + ] + ] + ], + [ + [ + [ + -114.068, + 360.768 + ], + [ + -104.988, + 365.896 + ], + [ + -94.449, + 347.235 + ], + [ + -103.529, + 342.107 + ] + ] + ], + [ + [ + [ + 13.079, + 367.084 + ], + [ + 35.982, + 371.984 + ], + [ + 38.881, + 358.434 + ], + [ + 15.978, + 353.535 + ] + ] + ], + [ + [ + [ + 41.399, + 346.666 + ], + [ + 18.496, + 341.766 + ], + [ + 15.978, + 353.535 + ], + [ + 38.881, + 358.434 + ] + ] + ], + [ + [ + [ + 9.42, + 384.191 + ], + [ + 32.323, + 389.091 + ], + [ + 35.982, + 371.984 + ], + [ + 13.079, + 367.084 + ] + ] + ], + [ + [ + [ + 18.496, + 341.766 + ], + [ + 10.795, + 340.119 + ], + [ + -2.773, + 338.976 + ], + [ + -4.521, + 350.109 + ], + [ + 15.782, + 354.453 + ] + ] + ], + [ + [ + [ + 15.782, + 354.453 + ], + [ + -4.521, + 350.109 + ], + [ + -6.487, + 362.636 + ], + [ + 13.133, + 366.833 + ] + ] + ], + [ + [ + [ + -6.715, + 364.084 + ], + [ + -11.532, + 379.709 + ], + [ + 9.42, + 384.191 + ], + [ + 13.133, + 366.833 + ], + [ + -6.487, + 362.636 + ] + ] + ], + [ + [ + [ + 8.891, + 384.078 + ], + [ + -11.532, + 379.709 + ], + [ + -14.203, + 388.37 + ], + [ + -14.975, + 390.001 + ], + [ + 5.135, + 397.502 + ] + ] + ], + [ + [ + [ + -18.824, + 400.509 + ], + [ + 2.238, + 407.852 + ], + [ + 5.135, + 397.502 + ], + [ + -14.015, + 390.359 + ] + ] + ], + [ + [ + [ + 28.861, + 405.272 + ], + [ + 32.323, + 389.091 + ], + [ + 20.686, + 386.602 + ], + [ + 17.224, + 402.783 + ] + ] + ], + [ + [ + [ + 25.139, + 415.836 + ], + [ + 27.463, + 404.973 + ], + [ + 4.423, + 400.044 + ], + [ + 2.238, + 407.852 + ] + ] + ], + [ + [ + [ + 19.526, + 440.703 + ], + [ + 22.351, + 435.7 + ], + [ + 26.499, + 416.311 + ], + [ + 13.903, + 411.919 + ], + [ + 4.663, + 432.308 + ] + ] + ], + [ + [ + [ + -5.327, + 423.282 + ], + [ + 5.884, + 429.614 + ], + [ + 13.903, + 411.919 + ], + [ + 1.743, + 407.68 + ] + ] + ], + [ + [ + [ + -19.794, + 400.171 + ], + [ + -25.047, + 411.26 + ], + [ + -26.875, + 414.496 + ], + [ + -6.549, + 425.976 + ], + [ + 1.743, + 407.68 + ] + ] + ], + [ + [ + [ + -28.447, + 343.963 + ], + [ + -29.574, + 358.301 + ], + [ + -13.53, + 360.819 + ], + [ + -10.554, + 341.861 + ], + [ + -14.311, + 341.545 + ] + ] + ], + [ + [ + [ + -18.214, + 373.043 + ], + [ + -15.593, + 364.542 + ], + [ + -14.973, + 360.593 + ], + [ + -29.574, + 358.301 + ], + [ + -30.436, + 369.275 + ] + ] + ], + [ + [ + [ + -45.778, + 350.637 + ], + [ + -38.51, + 366.785 + ], + [ + -30.436, + 369.275 + ], + [ + -28.48, + 344.381 + ], + [ + -33.962, + 345.319 + ] + ] + ], + [ + [ + [ + -23.048, + 390.978 + ], + [ + -35.703, + 385.495 + ], + [ + -43.212, + 402.829 + ], + [ + -31.956, + 409.186 + ], + [ + -30.213, + 406.1 + ] + ] + ], + [ + [ + [ + -18.688, + 386.627 + ], + [ + -14.822, + 374.089 + ], + [ + -28.883, + 369.753 + ], + [ + -35.703, + 385.495 + ], + [ + -21.141, + 391.804 + ] + ] + ], + [ + [ + [ + -52.508, + 395.445 + ], + [ + -42.47, + 401.115 + ], + [ + -36.417, + 387.145 + ], + [ + -48.69, + 372.663 + ], + [ + -52.22, + 374.835 + ], + [ + -45.556, + 383.136 + ] + ] + ], + [ + [ + [ + -46.877, + 348.195 + ], + [ + -53.159, + 351.023 + ], + [ + -64.212, + 359.896 + ], + [ + -52.22, + 374.835 + ], + [ + -38.647, + 366.481 + ] + ] + ], + [ + [ + [ + -54.466, + 398.912 + ], + [ + -45.556, + 383.136 + ], + [ + -54.559, + 371.921 + ], + [ + -69.874, + 390.21 + ] + ] + ], + [ + [ + [ + -68.441, + 388.499 + ], + [ + -54.559, + 371.921 + ], + [ + -62.621, + 361.878 + ], + [ + -66.125, + 364.691 + ], + [ + -79.307, + 382.363 + ] + ] + ], + [ + [ + [ + -169.601, + 359.538 + ], + [ + -154.078, + 369.399 + ], + [ + -145.019, + 355.138 + ], + [ + -161.213, + 345.992 + ] + ] + ], + [ + [ + [ + -163.171, + 383.714 + ], + [ + -154.078, + 369.399 + ], + [ + -168.459, + 360.263 + ], + [ + -176.91, + 373.91 + ] + ] + ], + [ + [ + [ + -162.92, + 383.319 + ], + [ + -151.827, + 391.234 + ], + [ + -139.621, + 374.317 + ], + [ + -151.677, + 365.619 + ] + ] + ], + [ + [ + [ + -132.98, + 392.111 + ], + [ + -145.791, + 382.868 + ], + [ + -152.109, + 391.625 + ], + [ + -139.769, + 400.43 + ] + ] + ], + [ + [ + [ + -127.199, + 383.28 + ], + [ + -139.621, + 374.317 + ], + [ + -145.791, + 382.868 + ], + [ + -133.878, + 391.463 + ] + ] + ], + [ + [ + [ + -145.829, + 356.414 + ], + [ + -151.677, + 365.619 + ], + [ + -133.676, + 378.607 + ], + [ + -126.469, + 367.348 + ] + ] + ], + [ + [ + [ + -123.671, + 385.825 + ], + [ + -112.226, + 371.802 + ], + [ + -124.781, + 364.711 + ], + [ + -133.676, + 378.607 + ] + ] + ], + [ + [ + [ + -165.51, + 390.926 + ], + [ + -184.172, + 377.61 + ], + [ + -190.19, + 387.328 + ], + [ + -173.673, + 399.847 + ] + ] + ], + [ + [ + [ + -186.399, + 413.754 + ], + [ + -173.673, + 399.847 + ], + [ + -188.236, + 388.809 + ], + [ + -196.4, + 401.991 + ] + ] + ], + [ + [ + [ + -154.4, + 400.557 + ], + [ + -166.824, + 415.779 + ], + [ + -158.527, + 422.551 + ], + [ + -145.664, + 406.791 + ] + ] + ], + [ + [ + [ + -165.51, + 390.926 + ], + [ + -179.091, + 405.768 + ], + [ + -166.824, + 415.779 + ], + [ + -153.522, + 399.481 + ] + ] + ], + [ + [ + [ + -179.091, + 405.768 + ], + [ + -187.177, + 414.605 + ], + [ + -178.095, + 425.287 + ], + [ + -167.918, + 414.887 + ] + ] + ], + [ + [ + [ + -158.343, + 422.701 + ], + [ + -167.918, + 414.887 + ], + [ + -176.669, + 423.829 + ], + [ + -167.789, + 434.274 + ] + ] + ], + [ + [ + [ + -140.439, + 413.961 + ], + [ + -150.691, + 426.522 + ], + [ + -136.829, + 440.064 + ], + [ + -124.243, + 427.181 + ] + ] + ], + [ + [ + [ + -153.429, + 448.582 + ], + [ + -141.065, + 435.926 + ], + [ + -149.048, + 428.127 + ], + [ + -159.711, + 441.192 + ] + ] + ], + [ + [ + [ + -156.028, + 451.242 + ], + [ + -142.391, + 467.282 + ], + [ + -134.179, + 458.878 + ], + [ + -149.175, + 444.227 + ] + ] + ], + [ + [ + [ + -142.391, + 467.282 + ], + [ + -127.767, + 484.482 + ], + [ + -121.677, + 478.824 + ], + [ + -138.044, + 462.833 + ] + ] + ], + [ + [ + [ + -109.679, + 467.677 + ], + [ + -126.613, + 451.133 + ], + [ + -138.044, + 462.833 + ], + [ + -121.677, + 478.824 + ] + ] + ], + [ + [ + [ + -109.679, + 467.677 + ], + [ + -108.247, + 466.347 + ], + [ + -94.677, + 451.311 + ], + [ + -100.768, + 446.341 + ], + [ + -115.785, + 461.712 + ] + ] + ], + [ + [ + [ + -82.443, + 428.22 + ], + [ + -89.531, + 422.435 + ], + [ + -105.734, + 442.287 + ], + [ + -98.261, + 448.386 + ], + [ + -94.549, + 444.274 + ] + ] + ], + [ + [ + [ + -138.164, + 415.818 + ], + [ + -130.615, + 421.98 + ], + [ + -114.412, + 402.128 + ], + [ + -121.961, + 395.966 + ] + ] + ], + [ + [ + [ + -98.034, + 415.495 + ], + [ + -78.801, + 431.192 + ], + [ + -74.353, + 425.294 + ], + [ + -70.273, + 418.759 + ], + [ + -90.705, + 404.782 + ] + ] + ], + [ + [ + [ + -82.143, + 392.265 + ], + [ + -90.705, + 404.782 + ], + [ + -71.616, + 417.841 + ], + [ + -63.233, + 404.415 + ], + [ + -62.604, + 403.3 + ] + ] + ], + [ + [ + [ + -81.63, + 391.515 + ], + [ + -97.691, + 382.444 + ], + [ + -112.322, + 403.833 + ], + [ + -98.034, + 415.495 + ] + ] + ], + [ + [ + [ + -122.661, + 395.395 + ], + [ + -112.322, + 403.833 + ], + [ + -98.276, + 383.299 + ], + [ + -108.209, + 377.689 + ] + ] + ], + [ + [ + [ + -47.648, + 412.412 + ], + [ + -55.28, + 424.363 + ], + [ + -42.469, + 432.544 + ], + [ + -34.394, + 419.899 + ] + ] + ], + [ + [ + [ + -55.405, + 403.894 + ], + [ + -56.086, + 405.101 + ], + [ + -64.455, + 418.504 + ], + [ + -55.28, + 424.363 + ], + [ + -45.707, + 409.372 + ] + ] + ], + [ + [ + [ + -69.749, + 426.984 + ], + [ + -47.04, + 441.486 + ], + [ + -41.66, + 433.061 + ], + [ + -64.455, + 418.504 + ] + ] + ], + [ + [ + [ + -54.299, + 449.867 + ], + [ + -61.991, + 444.066 + ], + [ + -72.393, + 458.55 + ], + [ + -63.79, + 464.729 + ] + ] + ], + [ + [ + [ + -75.064, + 434.208 + ], + [ + -86.691, + 449.626 + ], + [ + -88.552, + 451.689 + ], + [ + -74.64, + 461.679 + ], + [ + -61.991, + 444.066 + ] + ] + ], + [ + [ + [ + -67.588, + 428.364 + ], + [ + -73.108, + 435.683 + ], + [ + -53.012, + 450.838 + ], + [ + -47.04, + 441.486 + ] + ] + ], + [ + [ + [ + -6.804, + 436.194 + ], + [ + -16.72, + 430.594 + ], + [ + -23.99, + 443.466 + ], + [ + -14.074, + 449.067 + ] + ] + ], + [ + [ + [ + -27.43, + 419.695 + ], + [ + -37.674, + 435.738 + ], + [ + -23.99, + 443.466 + ], + [ + -14.643, + 426.917 + ] + ] + ], + [ + [ + [ + -45.348, + 453.588 + ], + [ + -37.495, + 458.023 + ], + [ + -27.996, + 441.204 + ], + [ + -34.937, + 437.284 + ] + ] + ], + [ + [ + [ + -6.237, + 435.191 + ], + [ + -14.351, + 449.556 + ], + [ + 0.526, + 457.958 + ], + [ + 8.639, + 443.593 + ] + ] + ], + [ + [ + [ + 9.309, + 442.407 + ], + [ + 0.526, + 457.958 + ], + [ + 6.111, + 461.113 + ], + [ + 14.895, + 445.561 + ] + ] + ], + [ + [ + [ + -1.682, + 478.251 + ], + [ + 7.542, + 461.921 + ], + [ + -0.193, + 457.552 + ], + [ + -9.416, + 473.883 + ] + ] + ], + [ + [ + [ + -50.967, + 475.573 + ], + [ + -39.159, + 457.084 + ], + [ + -45.683, + 453.399 + ], + [ + -57.052, + 471.203 + ] + ] + ], + [ + [ + [ + -38.96, + 487.303 + ], + [ + -24.83, + 465.177 + ], + [ + -39.159, + 457.084 + ], + [ + -52.327, + 477.704 + ] + ] + ], + [ + [ + [ + -4.036, + 476.921 + ], + [ + -24.83, + 465.177 + ], + [ + -32.181, + 476.688 + ], + [ + -10.743, + 488.796 + ] + ] + ], + [ + [ + [ + -9.509, + 489.493 + ], + [ + -32.181, + 476.688 + ], + [ + -37.551, + 485.096 + ], + [ + -15.834, + 500.692 + ] + ] + ], + [ + [ + [ + -100.42, + 469.627 + ], + [ + -102.166, + 471.562 + ], + [ + -109.61, + 478.478 + ], + [ + -98.534, + 490.622 + ], + [ + -88.538, + 481.506 + ] + ] + ], + [ + [ + [ + -124.655, + 488.143 + ], + [ + -112.059, + 502.957 + ], + [ + -98.534, + 490.622 + ], + [ + -111.739, + 476.143 + ] + ] + ], + [ + [ + [ + -112.059, + 502.957 + ], + [ + -111.904, + 503.14 + ], + [ + -108.515, + 500.821 + ], + [ + -98.439, + 501.811 + ], + [ + -91.358, + 509.046 + ], + [ + -90.583, + 519.14 + ], + [ + -90.661, + 519.248 + ], + [ + -78.545, + 508.395 + ], + [ + -96.47, + 488.74 + ] + ] + ], + [ + [ + [ + -72.75, + 497.291 + ], + [ + -88.538, + 481.506 + ], + [ + -96.47, + 488.74 + ], + [ + -81.513, + 505.141 + ] + ] + ], + [ + [ + [ + -51.523, + 484.19 + ], + [ + -70.06, + 470.879 + ], + [ + -77.672, + 479.833 + ], + [ + -62.823, + 494.312 + ] + ] + ], + [ + [ + [ + -71.184, + 498.857 + ], + [ + -64.397, + 492.777 + ], + [ + -77.672, + 479.833 + ], + [ + -83.434, + 486.61 + ] + ] + ], + [ + [ + [ + -73.03, + 474.373 + ], + [ + -84.995, + 465.78 + ], + [ + -93.85, + 476.195 + ], + [ + -83.434, + 486.61 + ] + ] + ], + [ + [ + [ + -101.44, + 468.608 + ], + [ + -93.85, + 476.195 + ], + [ + -83.016, + 463.452 + ], + [ + -91.372, + 457.451 + ] + ] + ], + [ + [ + [ + -46.079, + 516.842 + ], + [ + -30.396, + 529.091 + ], + [ + -22.545, + 515.19 + ], + [ + -37.162, + 505.424 + ] + ] + ], + [ + [ + [ + -33.01, + 500.108 + ], + [ + -37.162, + 505.424 + ], + [ + -23.263, + 514.71 + ], + [ + -20.208, + 509.301 + ] + ] + ], + [ + [ + [ + -46.079, + 516.842 + ], + [ + -31.698, + 498.428 + ], + [ + -43.518, + 489.939 + ], + [ + -57.539, + 507.893 + ] + ] + ], + [ + [ + [ + -62.951, + 503.666 + ], + [ + -57.539, + 507.893 + ], + [ + -45.028, + 491.873 + ], + [ + -47.668, + 489.977 + ] + ] + ], + [ + [ + [ + -80.67, + 537.053 + ], + [ + -61.071, + 521.921 + ], + [ + -71.647, + 512.021 + ], + [ + -86.759, + 525.558 + ] + ] + ], + [ + [ + [ + -82.684, + 538.607 + ], + [ + -76.113, + 551.013 + ], + [ + -61.597, + 543.324 + ], + [ + -70.638, + 529.308 + ] + ] + ], + [ + [ + [ + -61.267, + 504.982 + ], + [ + -70.414, + 513.176 + ], + [ + -50.115, + 532.177 + ], + [ + -41.147, + 520.694 + ] + ] + ], + [ + [ + [ + -61.616, + 567.708 + ], + [ + -66.401, + 545.869 + ], + [ + -73.093, + 549.413 + ], + [ + -63.449, + 567.62 + ] + ] + ], + [ + [ + [ + -32.003, + 527.835 + ], + [ + -41.147, + 520.694 + ], + [ + -56.748, + 540.67 + ], + [ + -44.023, + 549.116 + ] + ] + ], + [ + [ + [ + -42.338, + 550.234 + ], + [ + -56.748, + 540.67 + ], + [ + -56.861, + 540.816 + ], + [ + -63.3, + 544.226 + ], + [ + -48.513, + 561.168 + ] + ] + ], + [ + [ + [ + -61.128, + 569.936 + ], + [ + -54.567, + 570.25 + ], + [ + -49.074, + 560.525 + ], + [ + -63.3, + 544.226 + ], + [ + -66.401, + 545.869 + ] + ] + ], + [ + [ + [ + -67.768, + 172.611 + ], + [ + -76.218, + 193.384 + ], + [ + -64.673, + 199.339 + ], + [ + -53.477, + 181.663 + ] + ] + ], + [ + [ + [ + -53.693, + 205.002 + ], + [ + -43.081, + 188.248 + ], + [ + -53.477, + 181.663 + ], + [ + -64.673, + 199.339 + ] + ] + ], + [ + [ + [ + -78.659, + 199.385 + ], + [ + -87.724, + 215.585 + ], + [ + -68.17, + 227.86 + ], + [ + -53.693, + 205.002 + ], + [ + -76.218, + 193.384 + ] + ] + ], + [ + [ + [ + -68.17, + 227.86 + ], + [ + -46.933, + 241.193 + ], + [ + -44.269, + 236.949 + ], + [ + -33.006, + 222.482 + ], + [ + -55.671, + 208.126 + ] + ] + ], + [ + [ + [ + -29.871, + 198.231 + ], + [ + -41.73, + 216.956 + ], + [ + -35.658, + 220.802 + ], + [ + -33.105, + 217.522 + ], + [ + -20.406, + 204.226 + ] + ] + ], + [ + [ + [ + -44.824, + 191 + ], + [ + -47.867, + 195.804 + ], + [ + -33.926, + 204.634 + ], + [ + -30.883, + 199.83 + ] + ] + ], + [ + [ + [ + -68.962, + 234.942 + ], + [ + -79.61, + 253.97 + ], + [ + -62.558, + 263.512 + ], + [ + -59.233, + 257.57 + ], + [ + -51.793, + 245.72 + ] + ] + ], + [ + [ + [ + -69.825, + 236.484 + ], + [ + -81.687, + 229.037 + ], + [ + -91.817, + 247.139 + ], + [ + -79.61, + 253.97 + ] + ] + ], + [ + [ + [ + -90.071, + 219.779 + ], + [ + -102.147, + 241.359 + ], + [ + -91.817, + 247.139 + ], + [ + -80.033, + 226.081 + ] + ] + ], + [ + [ + [ + -64.391, + 262.486 + ], + [ + -73.216, + 257.548 + ], + [ + -85.647, + 279.763 + ], + [ + -76.822, + 284.701 + ] + ] + ], + [ + [ + [ + -86.005, + 280.404 + ], + [ + -78.746, + 267.431 + ], + [ + -92.834, + 259.548 + ], + [ + -100.093, + 272.52 + ] + ] + ], + [ + [ + [ + -102.147, + 241.359 + ], + [ + -115.92, + 265.974 + ], + [ + -101.078, + 274.28 + ], + [ + -87.304, + 249.665 + ] + ] + ], + [ + [ + [ + 35.671, + 148.154 + ], + [ + 27.681, + 131.834 + ], + [ + 12.497, + 140.741 + ], + [ + 21.665, + 156.37 + ] + ] + ], + [ + [ + [ + 26.712, + 121.833 + ], + [ + 7.051, + 131.458 + ], + [ + 12.497, + 140.741 + ], + [ + 30.733, + 130.044 + ] + ] + ], + [ + [ + [ + -10.701, + 135.029 + ], + [ + -12.971, + 139.222 + ], + [ + 1.964, + 147.312 + ], + [ + 2.045, + 147.449 + ], + [ + 12.748, + 141.17 + ], + [ + 8.082, + 133.216 + ], + [ + -2.915, + 138.6 + ] + ] + ], + [ + [ + [ + 36.549, + 147.639 + ], + [ + 8.055, + 164.353 + ], + [ + 15.635, + 175.276 + ], + [ + 21.538, + 171.18 + ], + [ + 42.414, + 159.619 + ] + ] + ], + [ + [ + [ + -29.55, + 169.83 + ], + [ + -38.143, + 185.694 + ], + [ + -24.314, + 194.452 + ], + [ + -15.026, + 181.42 + ] + ] + ], + [ + [ + [ + -4.723, + 189.64 + ], + [ + -15.026, + 181.42 + ], + [ + -22.262, + 191.573 + ], + [ + -13.432, + 197.165 + ], + [ + -13.03, + 196.744 + ] + ] + ], + [ + [ + [ + -15.565, + 180.989 + ], + [ + -2.284, + 191.587 + ], + [ + 5.008, + 185.351 + ], + [ + 8.272, + 183.086 + ], + [ + -7.107, + 168.237 + ] + ] + ], + [ + [ + [ + 14.432, + 173.543 + ], + [ + 4.756, + 159.599 + ], + [ + 0.244, + 157.155 + ], + [ + -7.107, + 168.237 + ], + [ + 5.097, + 180.02 + ] + ] + ], + [ + [ + [ + -9.993, + 133.722 + ], + [ + -23.203, + 127.664 + ], + [ + -32.08, + 144.054 + ], + [ + -19.33, + 150.961 + ] + ] + ], + [ + [ + [ + -48.665, + 135.071 + ], + [ + -41.199, + 139.115 + ], + [ + -33.013, + 121.265 + ], + [ + -40.714, + 117.733 + ] + ] + ], + [ + [ + [ + -32.08, + 144.054 + ], + [ + -21.855, + 125.177 + ], + [ + -32.557, + 120.269 + ], + [ + -41.199, + 139.115 + ] + ] + ], + [ + [ + [ + -57.483, + 157.49 + ], + [ + -48.879, + 161.557 + ], + [ + -37.739, + 140.989 + ], + [ + -47.876, + 135.499 + ], + [ + -53.727, + 148.256 + ] + ] + ], + [ + [ + [ + -37.223, + 183.996 + ], + [ + -29.922, + 170.517 + ], + [ + -59.335, + 156.615 + ], + [ + -63.662, + 167.25 + ] + ] + ], + [ + [ + [ + -27.325, + 93.727 + ], + [ + -35.018, + 106.265 + ], + [ + -37.321, + 111.288 + ], + [ + -23.456, + 117.646 + ], + [ + -16.331, + 102.112 + ], + [ + -20.005, + 97.727 + ], + [ + -20.344, + 98.011 + ] + ] + ], + [ + [ + [ + -19.333, + 121.053 + ], + [ + -11.954, + 104.963 + ], + [ + 3.108, + 92.342 + ], + [ + -3.775, + 84.127 + ], + [ + -20.005, + 97.727 + ], + [ + -16.331, + 102.112 + ], + [ + -24.03, + 118.899 + ] + ] + ], + [ + [ + [ + -27.374, + 93.697 + ], + [ + -20.344, + 98.011 + ], + [ + -4.617, + 84.833 + ], + [ + -14.615, + 72.901 + ] + ] + ], + [ + [ + [ + -11.954, + 104.963 + ], + [ + -19.333, + 121.053 + ], + [ + -0.372, + 129.748 + ], + [ + 5.234, + 127.004 + ], + [ + -10.14, + 103.443 + ] + ] + ], + [ + [ + [ + 1.77, + 93.463 + ], + [ + -10.14, + 103.443 + ], + [ + -1.508, + 116.673 + ], + [ + 12.509, + 106.28 + ] + ] + ], + [ + [ + [ + 13.394, + 105.624 + ], + [ + -1.508, + 116.673 + ], + [ + 4.3, + 125.572 + ], + [ + 22.601, + 116.612 + ] + ] + ], + [ + [ + [ + 43.526, + 203.145 + ], + [ + 61.649, + 192.564 + ], + [ + 56.156, + 181.972 + ], + [ + 53.728, + 177.013 + ], + [ + 34.741, + 188.098 + ] + ] + ], + [ + [ + [ + 29.4, + 178.95 + ], + [ + 34.741, + 188.098 + ], + [ + 52.018, + 178.011 + ], + [ + 47.555, + 168.896 + ] + ] + ], + [ + [ + [ + 27.474, + 175.65 + ], + [ + 27.151, + 175.828 + ], + [ + 12.017, + 186.329 + ], + [ + 19.463, + 199.083 + ], + [ + 35.64, + 189.638 + ] + ] + ], + [ + [ + [ + 12.017, + 186.329 + ], + [ + 7.943, + 189.157 + ], + [ + -4.768, + 200.027 + ], + [ + 2.632, + 211.045 + ], + [ + 20.393, + 200.676 + ] + ] + ], + [ + [ + [ + 13.239, + 220.827 + ], + [ + 27.349, + 212.59 + ], + [ + 20.393, + 200.676 + ], + [ + 5.532, + 209.352 + ] + ] + ], + [ + [ + [ + 59.595, + 193.763 + ], + [ + 49.582, + 199.609 + ], + [ + 62.088, + 223.724 + ], + [ + 72.369, + 218.392 + ] + ] + ], + [ + [ + [ + 48.342, + 230.853 + ], + [ + 58.564, + 250.561 + ], + [ + 72.848, + 243.153 + ], + [ + 62.626, + 223.445 + ] + ] + ], + [ + [ + [ + 84.699, + 237.006 + ], + [ + 74.478, + 217.298 + ], + [ + 62.626, + 223.445 + ], + [ + 72.848, + 243.153 + ] + ] + ], + [ + [ + [ + 10.34, + 222.52 + ], + [ + 19.99, + 236.887 + ], + [ + 32.933, + 229.22 + ], + [ + 24.272, + 214.385 + ] + ] + ], + [ + [ + [ + 44.073, + 222.621 + ], + [ + 19.99, + 236.887 + ], + [ + 26.866, + 247.124 + ], + [ + 49.751, + 233.568 + ] + ] + ], + [ + [ + [ + 57.395, + 248.307 + ], + [ + 49.751, + 233.568 + ], + [ + 34.069, + 242.857 + ], + [ + 41.241, + 256.685 + ] + ] + ], + [ + [ + [ + 26.866, + 247.124 + ], + [ + 36.768, + 261.866 + ], + [ + 42.41, + 258.94 + ], + [ + 34.069, + 242.857 + ] + ] + ], + [ + [ + [ + -16.154, + 216.341 + ], + [ + -7.984, + 226.068 + ], + [ + 1.287, + 219.841 + ], + [ + -7.19, + 207.22 + ], + [ + -8.574, + 208.404 + ] + ] + ], + [ + [ + [ + -22.209, + 235.623 + ], + [ + -7.984, + 226.068 + ], + [ + -15.495, + 217.126 + ], + [ + -22.203, + 224.15 + ], + [ + -26.779, + 230.027 + ] + ] + ], + [ + [ + [ + 0.315, + 220.494 + ], + [ + -6.789, + 225.266 + ], + [ + 2.904, + 239.697 + ], + [ + 10.008, + 234.925 + ] + ] + ], + [ + [ + [ + -23.118, + 236.233 + ], + [ + -12.073, + 249.756 + ], + [ + 2.904, + 239.697 + ], + [ + -6.789, + 225.266 + ] + ] + ], + [ + [ + [ + 11.994, + 233.591 + ], + [ + -12.073, + 249.756 + ], + [ + -1.528, + 262.669 + ], + [ + 21.249, + 247.37 + ] + ] + ], + [ + [ + [ + -1.528, + 262.669 + ], + [ + 9.406, + 276.057 + ], + [ + 17.628, + 271.793 + ], + [ + 8.304, + 256.065 + ] + ] + ], + [ + [ + [ + 32.479, + 264.09 + ], + [ + 21.249, + 247.37 + ], + [ + 8.304, + 256.065 + ], + [ + 17.628, + 271.793 + ] + ] + ], + [ + [ + [ + -33.571, + 231.021 + ], + [ + -40.333, + 239.706 + ], + [ + -46.57, + 249.641 + ], + [ + -32.79, + 258.292 + ], + [ + -21.578, + 245.706 + ] + ] + ], + [ + [ + [ + -22.956, + 264.466 + ], + [ + -12.939, + 256.285 + ], + [ + -21.578, + 245.706 + ], + [ + -32.79, + 258.292 + ] + ] + ], + [ + [ + [ + -46.57, + 249.641 + ], + [ + -52.796, + 259.558 + ], + [ + -53.433, + 260.696 + ], + [ + -35.53, + 270.714 + ], + [ + -29.674, + 260.248 + ] + ] + ], + [ + [ + [ + -12.072, + 287.197 + ], + [ + 5.053, + 278.315 + ], + [ + -3.189, + 268.223 + ], + [ + -17.408, + 278.101 + ] + ] + ], + [ + [ + [ + -11.289, + 258.305 + ], + [ + -24.075, + 266.733 + ], + [ + -17.408, + 278.101 + ], + [ + -3.189, + 268.223 + ] + ] + ], + [ + [ + [ + -32.992, + 272.61 + ], + [ + -22.596, + 292.655 + ], + [ + -12.072, + 287.197 + ], + [ + -24.075, + 266.733 + ] + ] + ], + [ + [ + [ + -56.998, + 298.945 + ], + [ + -46.284, + 304.941 + ], + [ + -31.384, + 297.213 + ], + [ + -47.311, + 281.634 + ] + ] + ], + [ + [ + [ + -31.384, + 297.213 + ], + [ + -22.596, + 292.655 + ], + [ + -30.169, + 278.053 + ], + [ + -41.964, + 286.864 + ] + ] + ], + [ + [ + [ + -55.695, + 296.618 + ], + [ + -48.206, + 283.234 + ], + [ + -60.429, + 276.395 + ], + [ + -67.918, + 289.778 + ] + ] + ], + [ + [ + [ + -49.824, + 262.716 + ], + [ + -58.182, + 277.653 + ], + [ + -48.206, + 283.234 + ], + [ + -39.848, + 268.298 + ] + ] + ], + [ + [ + [ + -208.95, + 527.659 + ], + [ + -222.6, + 517.593 + ], + [ + -236.705, + 539.41 + ], + [ + -222.49, + 548.601 + ] + ] + ], + [ + [ + [ + -233.818, + 507.358 + ], + [ + -249.283, + 531.278 + ], + [ + -236.705, + 539.41 + ], + [ + -221.74, + 516.264 + ] + ] + ], + [ + [ + [ + -233.141, + 506.31 + ], + [ + -252.115, + 492.319 + ], + [ + -260.038, + 505.864 + ], + [ + -240.866, + 518.259 + ] + ] + ], + [ + [ + [ + -264.454, + 521.47 + ], + [ + -249.283, + 531.278 + ], + [ + -240.866, + 518.259 + ], + [ + -256.618, + 508.075 + ] + ] + ], + [ + [ + [ + -264.346, + 521.54 + ], + [ + -270.814, + 532.597 + ], + [ + -254.032, + 543.448 + ], + [ + -247.083, + 532.701 + ] + ] + ], + [ + [ + [ + -262.423, + 556.428 + ], + [ + -254.032, + 543.448 + ], + [ + -272.372, + 531.59 + ], + [ + -273.628, + 533.737 + ], + [ + -270.247, + 535.651 + ], + [ + -264.5, + 551.029 + ], + [ + -265.732, + 554.507 + ] + ] + ], + [ + [ + [ + -255.031, + 544.993 + ], + [ + -263.017, + 557.346 + ], + [ + -249.527, + 565.177 + ], + [ + -241.947, + 553.453 + ] + ] + ], + [ + [ + [ + -237.66, + 572.065 + ], + [ + -230.437, + 560.894 + ], + [ + -241.947, + 553.453 + ], + [ + -249.527, + 565.177 + ] + ] + ], + [ + [ + [ + -219.412, + 578.804 + ], + [ + -213.891, + 570.265 + ], + [ + -229.832, + 559.958 + ], + [ + -235.849, + 569.263 + ] + ] + ], + [ + [ + [ + -211.469, + 587.268 + ], + [ + -197.011, + 565.044 + ], + [ + -206.534, + 558.887 + ], + [ + -221.223, + 581.606 + ] + ] + ], + [ + [ + [ + -183.78, + 544.705 + ], + [ + -195.749, + 535.879 + ], + [ + -209.419, + 557.022 + ], + [ + -197.011, + 565.044 + ] + ] + ], + [ + [ + [ + -208.875, + 527.543 + ], + [ + -213.578, + 534.818 + ], + [ + -200.521, + 543.26 + ], + [ + -196.337, + 536.788 + ] + ] + ], + [ + [ + [ + -186.266, + 586.431 + ], + [ + -202.654, + 573.718 + ], + [ + -210.664, + 586.031 + ], + [ + -198.007, + 593.378 + ], + [ + -193.008, + 591.505 + ], + [ + -191.444, + 592.057 + ] + ] + ], + [ + [ + [ + -178.423, + 577.838 + ], + [ + -196.308, + 563.963 + ], + [ + -202.654, + 573.718 + ], + [ + -186.305, + 586.401 + ] + ] + ], + [ + [ + [ + -182.902, + 543.356 + ], + [ + -196.308, + 563.963 + ], + [ + -183.784, + 573.679 + ], + [ + -168.989, + 553.616 + ] + ] + ], + [ + [ + [ + -175.969, + 579.742 + ], + [ + -158.823, + 561.113 + ], + [ + -168.989, + 553.616 + ], + [ + -183.784, + 573.679 + ] + ] + ], + [ + [ + [ + -198.728, + 522.488 + ], + [ + -193.061, + 515.657 + ], + [ + -204.432, + 505.08 + ], + [ + -211.716, + 512.911 + ] + ] + ], + [ + [ + [ + -193.106, + 492.4 + ], + [ + -204.683, + 504.847 + ], + [ + -193.061, + 515.657 + ], + [ + -182.191, + 502.553 + ] + ] + ], + [ + [ + [ + -183.5, + 533.377 + ], + [ + -178.067, + 526.827 + ], + [ + -192.438, + 514.906 + ], + [ + -198.553, + 522.277 + ] + ] + ], + [ + [ + [ + -170.633, + 542.542 + ], + [ + -166.098, + 537.075 + ], + [ + -178.224, + 527.016 + ], + [ + -183.334, + 533.176 + ] + ] + ], + [ + [ + [ + -172.64, + 544.96 + ], + [ + -155.553, + 557.56 + ], + [ + -147.858, + 549.199 + ], + [ + -164.621, + 535.294 + ] + ] + ], + [ + [ + [ + -141.933, + 539.999 + ], + [ + -156.943, + 526.037 + ], + [ + -164.621, + 535.294 + ], + [ + -149.3, + 548.003 + ] + ] + ], + [ + [ + [ + -160.712, + 522.531 + ], + [ + -140.563, + 541.273 + ], + [ + -127.426, + 527 + ], + [ + -145.405, + 508.026 + ] + ] + ], + [ + [ + [ + -127.426, + 527 + ], + [ + -118.761, + 517.586 + ], + [ + -119.637, + 515.201 + ], + [ + -116.203, + 505.677 + ], + [ + -116.099, + 505.616 + ], + [ + -116.694, + 504.916 + ], + [ + -133.374, + 520.722 + ] + ] + ], + [ + [ + [ + -130.533, + 493.933 + ], + [ + -145.405, + 508.026 + ], + [ + -133.374, + 520.722 + ], + [ + -121.978, + 509.923 + ], + [ + -120.523, + 505.89 + ], + [ + -120.419, + 505.829 + ] + ] + ], + [ + [ + [ + -173.908, + 468.929 + ], + [ + -184.866, + 480.709 + ], + [ + -172.031, + 492.647 + ], + [ + -161.074, + 480.867 + ] + ] + ], + [ + [ + [ + -191.799, + 493.616 + ], + [ + -174.147, + 510.035 + ], + [ + -164.494, + 499.658 + ], + [ + -182.146, + 483.239 + ] + ] + ], + [ + [ + [ + -138.703, + 501.675 + ], + [ + -128.04, + 491.571 + ], + [ + -136.868, + 481.188 + ], + [ + -148.63, + 492.442 + ] + ] + ], + [ + [ + [ + -145.662, + 470.844 + ], + [ + -158.571, + 483.194 + ], + [ + -148.63, + 492.442 + ], + [ + -136.868, + 481.188 + ] + ] + ], + [ + [ + [ + -147.548, + 472.648 + ], + [ + -155.53, + 463.26 + ], + [ + -167.594, + 474.802 + ], + [ + -158.571, + 483.194 + ] + ] + ], + [ + [ + [ + -171.656, + 471.024 + ], + [ + -167.594, + 474.802 + ], + [ + -155.588, + 463.316 + ], + [ + -159.838, + 458.318 + ] + ] + ], + [ + [ + [ + -226.195, + 451.779 + ], + [ + -235.967, + 468.482 + ], + [ + -218.953, + 480.854 + ], + [ + -207.628, + 465.281 + ] + ] + ], + [ + [ + [ + -218.953, + 480.854 + ], + [ + -237.512, + 467.358 + ], + [ + -242.726, + 476.27 + ], + [ + -224.996, + 489.163 + ] + ] + ], + [ + [ + [ + -249.677, + 488.152 + ], + [ + -233.132, + 500.353 + ], + [ + -224.996, + 489.163 + ], + [ + -242.726, + 476.27 + ] + ] + ], + [ + [ + [ + -209.354, + 497.379 + ], + [ + -222.875, + 486.247 + ], + [ + -230.551, + 496.803 + ], + [ + -217.66, + 506.308 + ] + ] + ], + [ + [ + [ + -209.187, + 497.517 + ], + [ + -200.049, + 487.693 + ], + [ + -214.985, + 475.397 + ], + [ + -222.875, + 486.247 + ] + ] + ], + [ + [ + [ + -189.4, + 478.536 + ], + [ + -207.628, + 465.281 + ], + [ + -214.985, + 475.397 + ], + [ + -198.842, + 488.687 + ] + ] + ], + [ + [ + [ + -207.845, + 465.123 + ], + [ + -189.4, + 478.536 + ], + [ + -176.061, + 464.195 + ], + [ + -192.989, + 448.794 + ] + ] + ], + [ + [ + [ + -181.172, + 435.806 + ], + [ + -192.989, + 448.794 + ], + [ + -177.495, + 462.89 + ], + [ + -167.385, + 452.021 + ] + ] + ], + [ + [ + [ + -227.741, + 450.655 + ], + [ + -207.845, + 465.123 + ], + [ + -197.183, + 453.404 + ], + [ + -219.695, + 436.9 + ] + ] + ], + [ + [ + [ + -210.746, + 421.604 + ], + [ + -219.695, + 436.9 + ], + [ + -210.122, + 443.919 + ], + [ + -199.699, + 429.703 + ] + ] + ], + [ + [ + [ + -181.197, + 435.833 + ], + [ + -192.747, + 422.247 + ], + [ + -199.677, + 429.719 + ], + [ + -185.254, + 440.293 + ] + ] + ], + [ + [ + [ + -201.282, + 405.426 + ], + [ + -210.746, + 421.604 + ], + [ + -199.677, + 429.719 + ], + [ + -189.738, + 419.003 + ] + ] + ], + [ + [ + [ + 250.123, + 509.847 + ], + [ + 254.737, + 505.722 + ], + [ + 252.571, + 494.082 + ], + [ + 255.206, + 489.417 + ], + [ + 250.64, + 486.838 + ], + [ + 239.206, + 495.6 + ] + ] + ], + [ + [ + [ + 253.216, + 488.294 + ], + [ + 256.832, + 481.892 + ], + [ + 247.313, + 472.899 + ], + [ + 232.226, + 486.49 + ], + [ + 239.206, + 495.6 + ], + [ + 250.64, + 486.838 + ] + ] + ], + [ + [ + [ + 238.026, + 464.126 + ], + [ + 222.618, + 473.951 + ], + [ + 232.226, + 486.49 + ], + [ + 247.313, + 472.899 + ] + ] + ], + [ + [ + [ + 260.646, + 479.788 + ], + [ + 262.559, + 479.071 + ], + [ + 251.187, + 455.732 + ], + [ + 238.026, + 464.126 + ], + [ + 258.544, + 483.509 + ] + ] + ], + [ + [ + [ + 248.888, + 508.236 + ], + [ + 239.398, + 495.85 + ], + [ + 223.537, + 508.652 + ], + [ + 233.968, + 521.577 + ] + ] + ], + [ + [ + [ + 222.267, + 509.677 + ], + [ + 239.398, + 495.85 + ], + [ + 228.828, + 482.056 + ], + [ + 211.356, + 496.158 + ] + ] + ], + [ + [ + [ + 213.294, + 494.593 + ], + [ + 228.828, + 482.056 + ], + [ + 224.421, + 476.304 + ], + [ + 207.33, + 487.204 + ] + ] + ], + [ + [ + [ + 197.265, + 419.725 + ], + [ + 167.334, + 441.47 + ], + [ + 184.01, + 462.131 + ], + [ + 212.85, + 441.178 + ] + ] + ], + [ + [ + [ + 233.519, + 461.307 + ], + [ + 249.071, + 451.389 + ], + [ + 239.043, + 430.808 + ], + [ + 219.78, + 442.394 + ] + ] + ], + [ + [ + [ + 220.597, + 402.775 + ], + [ + 201.222, + 416.85 + ], + [ + 213.509, + 433.762 + ], + [ + 232.884, + 419.687 + ] + ] + ], + [ + [ + [ + 235.199, + 433.12 + ], + [ + 231.65, + 425.837 + ], + [ + 229.152, + 422.398 + ], + [ + 213.509, + 433.762 + ], + [ + 219.78, + 442.394 + ] + ] + ], + [ + [ + [ + 206.824, + 544.759 + ], + [ + 196.409, + 533.112 + ], + [ + 185.939, + 542.474 + ], + [ + 196.354, + 554.121 + ] + ] + ], + [ + [ + [ + 197.385, + 555.274 + ], + [ + 185.939, + 542.474 + ], + [ + 177.478, + 550.039 + ], + [ + 188.924, + 562.84 + ] + ] + ], + [ + [ + [ + 177.206, + 550.282 + ], + [ + 185.187, + 543.146 + ], + [ + 173.85, + 530.467 + ], + [ + 165.869, + 537.603 + ] + ] + ], + [ + [ + [ + 196.409, + 533.112 + ], + [ + 184.333, + 519.606 + ], + [ + 173.111, + 529.64 + ], + [ + 185.187, + 543.146 + ] + ] + ], + [ + [ + [ + 217.754, + 517.129 + ], + [ + 197.951, + 534.836 + ], + [ + 207.105, + 545.074 + ], + [ + 226.39, + 527.83 + ] + ] + ], + [ + [ + [ + 220.286, + 514.865 + ], + [ + 207.438, + 498.946 + ], + [ + 194.106, + 510.867 + ], + [ + 207.724, + 526.097 + ] + ] + ], + [ + [ + [ + 186.071, + 521.549 + ], + [ + 197.951, + 534.836 + ], + [ + 207.724, + 526.097 + ], + [ + 195.844, + 512.811 + ] + ] + ], + [ + [ + [ + 181.466, + 515.707 + ], + [ + 192.268, + 506.049 + ], + [ + 176.419, + 488.324 + ], + [ + 165.618, + 497.983 + ] + ] + ], + [ + [ + [ + 186.088, + 479.679 + ], + [ + 176.419, + 488.324 + ], + [ + 192.274, + 506.055 + ], + [ + 201.046, + 498.211 + ] + ] + ], + [ + [ + [ + 181.463, + 515.704 + ], + [ + 165.618, + 497.983 + ], + [ + 154.798, + 507.657 + ], + [ + 170.644, + 525.379 + ] + ] + ], + [ + [ + [ + 170.652, + 525.389 + ], + [ + 154.798, + 507.657 + ], + [ + 147.327, + 514.337 + ], + [ + 163.182, + 532.069 + ] + ] + ], + [ + [ + [ + 161.012, + 492.725 + ], + [ + 173.544, + 481.519 + ], + [ + 164.967, + 470.846 + ], + [ + 151.881, + 481.364 + ] + ] + ], + [ + [ + [ + 173.935, + 463.639 + ], + [ + 164.967, + 470.846 + ], + [ + 173.67, + 481.675 + ], + [ + 182.279, + 473.977 + ] + ] + ], + [ + [ + [ + 174.544, + 463.149 + ], + [ + 168.315, + 455.432 + ], + [ + 153.921, + 467.001 + ], + [ + 160.133, + 474.731 + ] + ] + ], + [ + [ + [ + 146.853, + 458.206 + ], + [ + 153.921, + 467.001 + ], + [ + 168.936, + 454.933 + ], + [ + 162.439, + 446.884 + ] + ] + ], + [ + [ + [ + 137.334, + 463.264 + ], + [ + 151.881, + 481.364 + ], + [ + 160.133, + 474.731 + ], + [ + 145.91, + 457.034 + ] + ] + ], + [ + [ + [ + 126.518, + 497.705 + ], + [ + 140.828, + 513.709 + ], + [ + 150.505, + 505.057 + ], + [ + 136.195, + 489.052 + ] + ] + ], + [ + [ + [ + 150.505, + 505.057 + ], + [ + 162.385, + 494.434 + ], + [ + 154.701, + 484.872 + ], + [ + 142.34, + 495.925 + ] + ] + ], + [ + [ + [ + 138.712, + 464.977 + ], + [ + 126.475, + 473.868 + ], + [ + 137.668, + 487.736 + ], + [ + 148.918, + 477.676 + ] + ] + ], + [ + [ + [ + 127.906, + 496.464 + ], + [ + 137.668, + 487.736 + ], + [ + 125.585, + 472.765 + ], + [ + 114.147, + 481.075 + ] + ] + ], + [ + [ + [ + 105.285, + 564.471 + ], + [ + 96.912, + 556.855 + ], + [ + 76.319, + 579.492 + ], + [ + 82.368, + 584.963 + ] + ] + ], + [ + [ + [ + 108.161, + 542.333 + ], + [ + 95.142, + 555.244 + ], + [ + 106.667, + 565.729 + ], + [ + 119.122, + 554.592 + ] + ] + ], + [ + [ + [ + 92.722, + 531.614 + ], + [ + 89.223, + 536.341 + ], + [ + 102.557, + 547.89 + ], + [ + 108.537, + 541.96 + ], + [ + 105.983, + 539.104 + ] + ] + ], + [ + [ + [ + 65.099, + 538.085 + ], + [ + 79.849, + 549.004 + ], + [ + 93.142, + 531.046 + ], + [ + 76.497, + 521.644 + ] + ] + ], + [ + [ + [ + 65.45, + 538.345 + ], + [ + 57.956, + 549.154 + ], + [ + 72.027, + 559.57 + ], + [ + 79.849, + 549.004 + ] + ] + ], + [ + [ + [ + 53.029, + 558.429 + ], + [ + 64.915, + 569.179 + ], + [ + 72.027, + 559.57 + ], + [ + 58.949, + 549.889 + ] + ] + ], + [ + [ + [ + 83.519, + 586.003 + ], + [ + 71.032, + 574.711 + ], + [ + 63.12, + 582.117 + ], + [ + 74.114, + 594.412 + ] + ] + ], + [ + [ + [ + 53.556, + 591.068 + ], + [ + 65.701, + 604.652 + ], + [ + 75.464, + 595.922 + ], + [ + 63.12, + 582.117 + ] + ] + ], + [ + [ + [ + 41.161, + 602.668 + ], + [ + 43.141, + 604.783 + ], + [ + 51.993, + 616.909 + ], + [ + 65.701, + 604.652 + ], + [ + 53.556, + 591.068 + ] + ] + ], + [ + [ + [ + 40.765, + 576.728 + ], + [ + 47.214, + 582.312 + ], + [ + 61.712, + 566.282 + ], + [ + 53.288, + 558.663 + ] + ] + ], + [ + [ + [ + 43.928, + 600.079 + ], + [ + 55.369, + 589.371 + ], + [ + 39.277, + 575.44 + ], + [ + 31.443, + 586.74 + ] + ] + ], + [ + [ + [ + 62.657, + 626.008 + ], + [ + 77.154, + 616.268 + ], + [ + 72.466, + 609.291 + ], + [ + 59.364, + 621.006 + ], + [ + 61.493, + 623.922 + ] + ] + ], + [ + [ + [ + 68.388, + 644.197 + ], + [ + 89.2, + 634.196 + ], + [ + 77.154, + 616.268 + ], + [ + 59.445, + 628.166 + ] + ] + ], + [ + [ + [ + 89.2, + 634.196 + ], + [ + 108.627, + 624.86 + ], + [ + 98.293, + 609.481 + ], + [ + 80.587, + 621.377 + ] + ] + ], + [ + [ + [ + 72.06, + 608.687 + ], + [ + 80.587, + 621.377 + ], + [ + 95.58, + 611.303 + ], + [ + 85.655, + 596.531 + ] + ] + ], + [ + [ + [ + 147.07, + 580.94 + ], + [ + 127.407, + 601.551 + ], + [ + 131.39, + 605.351 + ], + [ + 131.721, + 604.95 + ], + [ + 141.676, + 603.106 + ], + [ + 142.274, + 603.445 + ], + [ + 156.122, + 591.064 + ] + ] + ], + [ + [ + [ + 145.056, + 583.051 + ], + [ + 140.085, + 577.493 + ], + [ + 122.028, + 596.42 + ], + [ + 127.407, + 601.551 + ] + ] + ], + [ + [ + [ + 102.715, + 577.995 + ], + [ + 90.35, + 589.051 + ], + [ + 100.96, + 604.843 + ], + [ + 116.814, + 591.446 + ] + ] + ], + [ + [ + [ + 121.811, + 616.27 + ], + [ + 109.617, + 597.528 + ], + [ + 103.375, + 602.802 + ], + [ + 114.716, + 619.68 + ] + ] + ], + [ + [ + [ + 127.337, + 615.869 + ], + [ + 127.319, + 613.773 + ], + [ + 132.998, + 606.885 + ], + [ + 116.814, + 591.446 + ], + [ + 109.617, + 597.528 + ], + [ + 122.929, + 617.988 + ] + ] + ], + [ + [ + [ + 110.841, + 575.295 + ], + [ + 124.149, + 590.179 + ], + [ + 132.851, + 582.399 + ], + [ + 119.542, + 567.515 + ] + ] + ], + [ + [ + [ + 142.106, + 574.123 + ], + [ + 126.529, + 556.701 + ], + [ + 117.273, + 564.977 + ], + [ + 132.851, + 582.399 + ] + ] + ], + [ + [ + [ + -8.148, + 559.16 + ], + [ + -4.13, + 552.046 + ], + [ + -23.669, + 541.011 + ], + [ + -27.686, + 548.125 + ] + ] + ], + [ + [ + [ + -24.503, + 540.54 + ], + [ + -13.823, + 546.572 + ], + [ + -4.922, + 530.812 + ], + [ + -15.602, + 524.781 + ] + ] + ], + [ + [ + [ + 4.68, + 536.447 + ], + [ + -5.013, + 530.973 + ], + [ + -13.823, + 546.572 + ], + [ + -4.13, + 552.046 + ] + ] + ], + [ + [ + [ + -9.081, + 560.812 + ], + [ + 6.327, + 570.797 + ], + [ + 14.72, + 555.938 + ], + [ + -1.238, + 546.925 + ] + ] + ], + [ + [ + [ + 2.831, + 539.722 + ], + [ + -1.238, + 546.925 + ], + [ + 14.72, + 555.938 + ], + [ + 18.788, + 548.734 + ] + ] + ], + [ + [ + [ + 31.951, + 569.709 + ], + [ + 22.276, + 564.245 + ], + [ + 14.091, + 576.052 + ], + [ + 22.611, + 583.181 + ] + ] + ], + [ + [ + [ + 7.367, + 568.956 + ], + [ + 7.52, + 569.055 + ], + [ + 14.748, + 575.103 + ], + [ + 22.276, + 564.245 + ], + [ + 12.99, + 559 + ] + ] + ], + [ + [ + [ + 20.573, + 545.574 + ], + [ + 12.99, + 559 + ], + [ + 32.349, + 569.934 + ], + [ + 41.171, + 557.208 + ] + ] + ], + [ + [ + [ + 25.859, + 516.217 + ], + [ + 37.147, + 496.23 + ], + [ + 24.211, + 488.924 + ], + [ + 12.922, + 508.911 + ] + ] + ], + [ + [ + [ + -2.524, + 500.187 + ], + [ + 12.922, + 508.911 + ], + [ + 22.681, + 491.632 + ], + [ + 7.235, + 482.908 + ] + ] + ], + [ + [ + [ + -3.67, + 525.383 + ], + [ + 14.792, + 535.811 + ], + [ + 19.588, + 527.32 + ], + [ + 1.125, + 516.892 + ] + ] + ], + [ + [ + [ + 24.288, + 515.33 + ], + [ + 7.396, + 505.79 + ], + [ + 1.125, + 516.892 + ], + [ + 18.017, + 526.433 + ] + ] + ], + [ + [ + [ + -2.431, + 523.188 + ], + [ + 7.396, + 505.79 + ], + [ + -2.285, + 500.322 + ], + [ + -12.112, + 517.721 + ] + ] + ], + [ + [ + [ + 34.774, + 544.75 + ], + [ + 46.04, + 524.803 + ], + [ + 32.658, + 517.244 + ], + [ + 21.391, + 537.192 + ] + ] + ], + [ + [ + [ + 52.487, + 542.722 + ], + [ + 39.926, + 535.628 + ], + [ + 35.241, + 543.923 + ], + [ + 47.036, + 550.585 + ] + ] + ], + [ + [ + [ + 57.263, + 531.141 + ], + [ + 46.04, + 524.803 + ], + [ + 39.926, + 535.628 + ], + [ + 50.15, + 541.402 + ] + ] + ], + [ + [ + [ + 36.835, + 509.439 + ], + [ + 52.471, + 518.27 + ], + [ + 56.633, + 510.902 + ], + [ + 40.997, + 502.071 + ] + ] + ], + [ + [ + [ + 31.243, + 516.445 + ], + [ + 48.119, + 525.976 + ], + [ + 52.471, + 518.27 + ], + [ + 35.595, + 508.739 + ] + ] + ], + [ + [ + [ + 61.029, + 533.268 + ], + [ + 72.761, + 516.345 + ], + [ + 58.203, + 508.122 + ], + [ + 48.119, + 525.976 + ] + ] + ], + [ + [ + [ + 54.247, + 628.7 + ], + [ + 37.611, + 638.639 + ], + [ + 42.63, + 647.041 + ], + [ + 59.293, + 637.746 + ] + ] + ], + [ + [ + [ + 57.631, + 638.672 + ], + [ + 42.63, + 647.041 + ], + [ + 45.762, + 652.282 + ], + [ + 61.109, + 644.907 + ] + ] + ], + [ + [ + [ + 40.142, + 613.905 + ], + [ + 28.09, + 622.703 + ], + [ + 37.611, + 638.639 + ], + [ + 51.493, + 630.346 + ], + [ + 49.381, + 626.56 + ] + ] + ], + [ + [ + [ + 26.535, + 664.31 + ], + [ + 47.056, + 654.449 + ], + [ + 40.15, + 642.89 + ], + [ + 20.727, + 652.224 + ] + ] + ], + [ + [ + [ + -8.252, + 614.139 + ], + [ + -5.069, + 624.766 + ], + [ + 10.541, + 620.09 + ], + [ + 2.783, + 606.183 + ], + [ + -5.029, + 612.868 + ] + ] + ], + [ + [ + [ + 32.271, + 605.496 + ], + [ + 22.937, + 595.523 + ], + [ + 18.425, + 591.747 + ], + [ + 2.386, + 605.473 + ], + [ + 10.541, + 620.09 + ], + [ + 19.567, + 617.386 + ] + ] + ], + [ + [ + [ + 32.787, + 605.013 + ], + [ + 19.567, + 617.386 + ], + [ + 7.377, + 621.038 + ], + [ + 13.55, + 633.317 + ], + [ + 40.226, + 613.844 + ], + [ + 37.3, + 609.835 + ] + ] + ], + [ + [ + [ + -4.099, + 628.003 + ], + [ + -9.173, + 611.065 + ], + [ + -26.079, + 617.729 + ], + [ + -21.445, + 633.199 + ] + ] + ], + [ + [ + [ + -33.749, + 622.311 + ], + [ + -29.733, + 635.681 + ], + [ + -21.445, + 633.199 + ], + [ + -25.662, + 619.123 + ] + ] + ], + [ + [ + [ + -1.424, + 636.935 + ], + [ + -4.099, + 628.003 + ], + [ + -29.733, + 635.681 + ], + [ + -27.682, + 642.511 + ] + ] + ], + [ + [ + [ + -40.543, + 623.43 + ], + [ + -47.54, + 624.916 + ], + [ + -43.053, + 646.047 + ], + [ + -27.605, + 642.766 + ], + [ + -34.168, + 620.917 + ] + ] + ], + [ + [ + [ + -15.957, + 682.838 + ], + [ + -18.169, + 676.911 + ], + [ + -33.335, + 681.319 + ], + [ + -31.557, + 689.694 + ], + [ + -30.578, + 689.864 + ] + ] + ], + [ + [ + [ + -34.342, + 669.871 + ], + [ + -31.994, + 680.929 + ], + [ + -18.169, + 676.911 + ], + [ + -22.056, + 666.498 + ] + ] + ], + [ + [ + [ + -7.505, + 677.444 + ], + [ + -12.143, + 663.776 + ], + [ + -22.056, + 666.498 + ], + [ + -16.379, + 681.708 + ] + ] + ], + [ + [ + [ + -33.988, + 669.774 + ], + [ + -26.288, + 667.659 + ], + [ + -30.037, + 650.005 + ], + [ + -37.835, + 651.661 + ] + ] + ], + [ + [ + [ + -17.105, + 649.15 + ], + [ + -29.652, + 651.815 + ], + [ + -26.288, + 667.659 + ], + [ + -12.143, + 663.776 + ] + ] + ], + [ + [ + [ + 6.511, + 649.962 + ], + [ + -1.352, + 653.17 + ], + [ + 7.63, + 671.859 + ], + [ + 15.27, + 668.188 + ] + ] + ], + [ + [ + [ + -7.256, + 678.179 + ], + [ + 7.304, + 671.182 + ], + [ + -1.352, + 653.17 + ], + [ + -13.992, + 658.326 + ] + ] + ], + [ + [ + [ + -17.619, + 647.634 + ], + [ + -13.992, + 658.326 + ], + [ + 8.423, + 649.182 + ], + [ + 5.336, + 642.759 + ] + ] + ], + [ + [ + [ + -44.464, + 574.586 + ], + [ + -32.89, + 581.123 + ], + [ + -21.345, + 560.682 + ], + [ + -32.919, + 554.145 + ] + ] + ], + [ + [ + [ + -12.947, + 566.952 + ], + [ + -13.2, + 566.788 + ], + [ + -21.99, + 561.823 + ], + [ + -32.89, + 581.123 + ], + [ + -27.475, + 584.181 + ], + [ + -26.241, + 585.623 + ], + [ + -16.898, + 577.628 + ], + [ + -18.587, + 575.654 + ] + ] + ], + [ + [ + [ + -9.239, + 605.49 + ], + [ + 0.104, + 597.495 + ], + [ + -16.898, + 577.628 + ], + [ + -26.241, + 585.623 + ] + ] + ], + [ + [ + [ + 0.104, + 597.495 + ], + [ + 15.57, + 584.259 + ], + [ + 6.281, + 576.487 + ], + [ + -2.272, + 570.944 + ], + [ + -12.591, + 582.661 + ] + ] + ], + [ + [ + [ + -13.688, + 568.094 + ], + [ + -18.587, + 575.654 + ], + [ + -12.591, + 582.661 + ], + [ + -4.822, + 573.84 + ] + ] + ], + [ + [ + [ + -38.779, + 594.49 + ], + [ + -44.349, + 609.933 + ], + [ + -50.022, + 613.23 + ], + [ + -48.537, + 620.22 + ], + [ + -41.931, + 618.817 + ], + [ + -10.194, + 606.308 + ], + [ + -9.239, + 605.49 + ], + [ + -26.095, + 585.794 + ], + [ + -39.192, + 593.364 + ] + ] + ], + [ + [ + [ + -27.475, + 584.181 + ], + [ + -46.314, + 573.541 + ], + [ + -48.217, + 576.912 + ], + [ + -44.438, + 579.079 + ], + [ + -39.192, + 593.364 + ], + [ + -26.095, + 585.794 + ] + ] + ], + [ + [ + [ + 169.399, + 552.937 + ], + [ + 160.688, + 543.196 + ], + [ + 138.573, + 562.97 + ], + [ + 147.284, + 572.712 + ] + ] + ], + [ + [ + [ + 147.216, + 532.8 + ], + [ + 140.534, + 538.774 + ], + [ + 151.685, + 551.246 + ], + [ + 158.367, + 545.271 + ] + ] + ], + [ + [ + [ + 139.409, + 562.222 + ], + [ + 151.685, + 551.246 + ], + [ + 140.534, + 538.774 + ], + [ + 128.258, + 549.751 + ] + ] + ], + [ + [ + [ + 168.687, + 553.573 + ], + [ + 161.735, + 559.79 + ], + [ + 173.425, + 572.864 + ], + [ + 180.377, + 566.647 + ] + ] + ], + [ + [ + [ + 174.312, + 573.857 + ], + [ + 161.735, + 559.79 + ], + [ + 147.521, + 572.5 + ], + [ + 160.098, + 586.566 + ] + ] + ], + [ + [ + [ + 149.574, + 530.691 + ], + [ + 135.263, + 514.686 + ], + [ + 123.157, + 525.511 + ], + [ + 137.468, + 541.516 + ] + ] + ], + [ + [ + [ + 129.135, + 548.967 + ], + [ + 137.468, + 541.516 + ], + [ + 123.157, + 525.511 + ], + [ + 114.701, + 533.071 + ], + [ + 115.147, + 533.323 + ] + ] + ], + [ + [ + [ + 89.794, + 520.453 + ], + [ + 111.537, + 532.733 + ], + [ + 113.111, + 534.493 + ], + [ + 121.902, + 526.633 + ], + [ + 100.772, + 506.686 + ] + ] + ], + [ + [ + [ + 103.86, + 509.602 + ], + [ + 109.205, + 514.647 + ], + [ + 123.271, + 502.069 + ], + [ + 116.186, + 494.146 + ] + ] + ], + [ + [ + [ + 134.584, + 515.293 + ], + [ + 122.987, + 502.323 + ], + [ + 109.205, + 514.647 + ], + [ + 121.902, + 526.633 + ] + ] + ], + [ + [ + [ + 71.362, + 466.666 + ], + [ + 70.332, + 468.952 + ], + [ + 65.968, + 477.259 + ], + [ + 86.035, + 489.951 + ], + [ + 92.362, + 479.948 + ] + ] + ], + [ + [ + [ + 65.692, + 504.809 + ], + [ + 78.217, + 485.006 + ], + [ + 63.297, + 475.569 + ], + [ + 55.968, + 489.517 + ], + [ + 51.771, + 496.947 + ] + ] + ], + [ + [ + [ + 72.811, + 510.86 + ], + [ + 86.035, + 489.951 + ], + [ + 78.217, + 485.006 + ], + [ + 64.746, + 506.305 + ] + ] + ], + [ + [ + [ + 94.583, + 504.9 + ], + [ + 82.167, + 496.067 + ], + [ + 73.854, + 509.211 + ], + [ + 85.776, + 515.944 + ] + ] + ], + [ + [ + [ + 108.045, + 489.867 + ], + [ + 92.362, + 479.948 + ], + [ + 82.167, + 496.067 + ], + [ + 95.523, + 505.569 + ] + ] + ], + [ + [ + [ + 89.822, + 478.341 + ], + [ + 108.045, + 489.867 + ], + [ + 110.414, + 486.896 + ], + [ + 104.99, + 480.829 + ], + [ + 113.205, + 474.861 + ], + [ + 97.846, + 462.242 + ] + ] + ], + [ + [ + [ + 110.46, + 444.219 + ], + [ + 107.407, + 443.061 + ], + [ + 97.846, + 462.242 + ], + [ + 101.587, + 465.315 + ], + [ + 115.977, + 451.814 + ] + ] + ], + [ + [ + [ + 113.205, + 474.861 + ], + [ + 125.979, + 465.581 + ], + [ + 115.977, + 451.814 + ], + [ + 101.587, + 465.315 + ] + ] + ], + [ + [ + [ + 106.498, + 444.885 + ], + [ + 90.281, + 438.736 + ], + [ + 83.699, + 451.942 + ], + [ + 99.143, + 459.64 + ] + ] + ], + [ + [ + [ + 80.813, + 432.977 + ], + [ + 75.527, + 446.918 + ], + [ + 75.177, + 447.694 + ], + [ + 83.699, + 451.942 + ], + [ + 91.19, + 436.912 + ] + ] + ], + [ + [ + [ + 69.944, + 465.769 + ], + [ + 79.852, + 472.036 + ], + [ + 89.534, + 454.85 + ], + [ + 77.501, + 448.853 + ], + [ + 77.178, + 449.706 + ] + ] + ], + [ + [ + [ + 113.097, + 384.837 + ], + [ + 109.68, + 395.815 + ], + [ + 120.734, + 399.256 + ], + [ + 132.534, + 415.497 + ], + [ + 135.886, + 413.062 + ], + [ + 115.8, + 385.415 + ] + ] + ], + [ + [ + [ + 114.285, + 381.02 + ], + [ + 97.179, + 377.36 + ], + [ + 92.846, + 394.981 + ], + [ + 108.429, + 399.832 + ] + ] + ], + [ + [ + [ + 89.377, + 415.007 + ], + [ + 102.44, + 419.073 + ], + [ + 108.429, + 399.832 + ], + [ + 94.973, + 395.643 + ], + [ + 93.351, + 402.241 + ] + ] + ], + [ + [ + [ + 120.061, + 424.559 + ], + [ + 118.067, + 423.938 + ], + [ + 112.088, + 439.703 + ], + [ + 113.501, + 440.239 + ], + [ + 119.185, + 448.062 + ], + [ + 138.751, + 433.848 + ], + [ + 127.877, + 418.88 + ] + ] + ], + [ + [ + [ + 149.007, + 426.397 + ], + [ + 138.133, + 411.43 + ], + [ + 127.877, + 418.88 + ], + [ + 138.751, + 433.848 + ] + ] + ], + [ + [ + [ + 159.684, + 441.094 + ], + [ + 149.007, + 426.397 + ], + [ + 136.659, + 435.368 + ], + [ + 147.336, + 450.065 + ] + ] + ], + [ + [ + [ + 144.77, + 446.533 + ], + [ + 136.659, + 435.368 + ], + [ + 119.764, + 447.642 + ], + [ + 127.875, + 458.808 + ] + ] + ], + [ + [ + [ + 87.213, + 414.334 + ], + [ + 84.147, + 424.184 + ], + [ + 82.515, + 428.489 + ], + [ + 112.088, + 439.703 + ], + [ + 118.067, + 423.938 + ] + ] + ], + [ + [ + [ + 52.076, + 442.152 + ], + [ + 68.98, + 449.765 + ], + [ + 71.09, + 445.08 + ], + [ + 74.963, + 434.867 + ], + [ + 54.898, + 428.963 + ] + ] + ], + [ + [ + [ + 55.76, + 429.216 + ], + [ + 63.444, + 431.477 + ], + [ + 67.401, + 412.981 + ], + [ + 59.591, + 411.31 + ] + ] + ], + [ + [ + [ + 74.963, + 434.867 + ], + [ + 79.607, + 422.619 + ], + [ + 81.658, + 416.031 + ], + [ + 67.401, + 412.981 + ], + [ + 63.444, + 431.477 + ] + ] + ], + [ + [ + [ + 81.138, + 415.92 + ], + [ + 84.915, + 403.786 + ], + [ + 85.111, + 402.989 + ], + [ + 61.534, + 397.945 + ], + [ + 58.714, + 411.123 + ] + ] + ], + [ + [ + [ + 88.863, + 388.272 + ], + [ + 64.709, + 383.105 + ], + [ + 61.534, + 397.945 + ], + [ + 85.236, + 403.015 + ], + [ + 85.246, + 402.983 + ] + ] + ], + [ + [ + [ + 66.494, + 374.761 + ], + [ + 64.709, + 383.105 + ], + [ + 89.505, + 388.41 + ], + [ + 91.543, + 380.12 + ] + ] + ], + [ + [ + [ + 52.514, + 417.162 + ], + [ + 35.287, + 413.477 + ], + [ + 30.565, + 435.548 + ], + [ + 47.792, + 439.233 + ] + ] + ], + [ + [ + [ + 57.358, + 394.519 + ], + [ + 40.131, + 390.834 + ], + [ + 37.539, + 402.947 + ], + [ + 54.766, + 406.633 + ] + ] + ], + [ + [ + [ + 51.295, + 416.902 + ], + [ + 53.548, + 406.372 + ], + [ + 37.539, + 402.947 + ], + [ + 35.287, + 413.477 + ] + ] + ], + [ + [ + [ + 57.184, + 394.482 + ], + [ + 59.637, + 383.014 + ], + [ + 42.584, + 379.366 + ], + [ + 40.131, + 390.834 + ] + ] + ], + [ + [ + [ + 62.611, + 369.965 + ], + [ + 45.384, + 366.279 + ], + [ + 42.584, + 379.366 + ], + [ + 59.811, + 383.051 + ] + ] + ], + [ + [ + [ + 45.875, + 495.647 + ], + [ + 50.036, + 488.281 + ], + [ + 53.518, + 481.653 + ], + [ + 38.543, + 473.195 + ], + [ + 30.702, + 487.077 + ] + ] + ], + [ + [ + [ + 32.08, + 484.637 + ], + [ + 38.543, + 473.195 + ], + [ + 28.423, + 467.479 + ], + [ + 21.961, + 478.921 + ] + ] + ], + [ + [ + [ + 56.87, + 465.799 + ], + [ + 49.249, + 461.494 + ], + [ + 41.649, + 474.949 + ], + [ + 49.679, + 479.485 + ] + ] + ], + [ + [ + [ + 29.177, + 467.905 + ], + [ + 41.649, + 474.949 + ], + [ + 49.249, + 461.494 + ], + [ + 36.777, + 454.45 + ] + ] + ], + [ + [ + [ + 60.71, + 467.967 + ], + [ + 61.226, + 466.983 + ], + [ + 67.009, + 454.142 + ], + [ + 53.598, + 448.102 + ], + [ + 46.811, + 460.118 + ] + ] + ], + [ + [ + [ + 48.81, + 445.946 + ], + [ + 48.484, + 447.469 + ], + [ + 38.878, + 445.414 + ], + [ + 34.501, + 453.164 + ], + [ + 46.811, + 460.118 + ], + [ + 53.598, + 448.102 + ] + ] + ], + [ + [ + [ + 106.854, + 345.309 + ], + [ + 100.878, + 373.243 + ], + [ + 114.29, + 376.112 + ], + [ + 120.846, + 345.466 + ], + [ + 112.146, + 340.261 + ] + ] + ], + [ + [ + [ + 140.422, + 313.283 + ], + [ + 112.146, + 340.261 + ], + [ + 119.182, + 344.47 + ], + [ + 145.877, + 319.001 + ] + ] + ], + [ + [ + [ + 78.021, + 365.418 + ], + [ + 79.869, + 356.779 + ], + [ + 51.979, + 350.813 + ], + [ + 50.131, + 359.451 + ] + ] + ], + [ + [ + [ + 60.836, + 326.111 + ], + [ + 55.403, + 336.478 + ], + [ + 54.938, + 338.654 + ], + [ + 72.906, + 343.777 + ], + [ + 76.328, + 334.229 + ] + ] + ], + [ + [ + [ + 51.902, + 350.796 + ], + [ + 69.073, + 354.47 + ], + [ + 72.906, + 343.777 + ], + [ + 54.525, + 338.536 + ] + ] + ], + [ + [ + [ + 80.152, + 368.809 + ], + [ + 100.878, + 373.243 + ], + [ + 103.931, + 358.976 + ], + [ + 84.587, + 353.407 + ] + ] + ], + [ + [ + [ + 106.854, + 345.309 + ], + [ + 109.588, + 342.702 + ], + [ + 97.425, + 327.867 + ], + [ + 93.284, + 331.263 + ], + [ + 91.268, + 330.206 + ], + [ + 87.81, + 342.215 + ], + [ + 106.373, + 347.56 + ] + ] + ], + [ + [ + [ + 97.425, + 327.867 + ], + [ + 109.588, + 342.702 + ], + [ + 124.019, + 328.933 + ], + [ + 112.806, + 315.257 + ] + ] + ], + [ + [ + [ + 112.806, + 315.257 + ], + [ + 124.019, + 328.933 + ], + [ + 134.008, + 319.402 + ], + [ + 123.452, + 306.528 + ] + ] + ], + [ + [ + [ + 130.608, + 300.661 + ], + [ + 123.452, + 306.528 + ], + [ + 134.008, + 319.402 + ], + [ + 140.87, + 312.856 + ], + [ + 138.992, + 310.888 + ] + ] + ], + [ + [ + [ + 118.144, + 301.35 + ], + [ + 112.873, + 294.921 + ], + [ + 90.707, + 322.572 + ], + [ + 91.654, + 323.068 + ] + ] + ], + [ + [ + [ + 75.479, + 316.513 + ], + [ + 89.623, + 323.925 + ], + [ + 95.975, + 316 + ], + [ + 80.903, + 306.162 + ] + ] + ], + [ + [ + [ + 76.827, + 313.94 + ], + [ + 86.84, + 294.834 + ], + [ + 78.783, + 289.575 + ], + [ + 68.344, + 309.495 + ] + ] + ], + [ + [ + [ + 83.838, + 274.891 + ], + [ + 76.816, + 288.291 + ], + [ + 92.626, + 298.611 + ], + [ + 101.923, + 284.369 + ] + ] + ], + [ + [ + [ + 94.903, + 253.777 + ], + [ + 83.838, + 274.891 + ], + [ + 103.404, + 285.145 + ], + [ + 112.057, + 274.7 + ] + ] + ], + [ + [ + [ + 119.125, + 302.546 + ], + [ + 126.793, + 296.26 + ], + [ + 110.579, + 276.484 + ], + [ + 103.404, + 285.145 + ], + [ + 105.954, + 286.481 + ] + ] + ], + [ + [ + [ + 172.215, + 369.128 + ], + [ + 185.371, + 387.238 + ], + [ + 198.139, + 377.962 + ], + [ + 190.363, + 367.259 + ], + [ + 183.318, + 359.875 + ] + ] + ], + [ + [ + [ + 154.423, + 385.445 + ], + [ + 158.849, + 391.537 + ], + [ + 178.253, + 377.44 + ], + [ + 172.889, + 370.055 + ] + ] + ], + [ + [ + [ + 197.444, + 378.467 + ], + [ + 184.239, + 388.06 + ], + [ + 193.779, + 401.193 + ], + [ + 206.984, + 391.6 + ] + ] + ], + [ + [ + [ + 200.975, + 411.097 + ], + [ + 217.776, + 398.891 + ], + [ + 210.581, + 388.987 + ], + [ + 193.779, + 401.193 + ] + ] + ], + [ + [ + [ + 182.703, + 424.372 + ], + [ + 200.975, + 411.097 + ], + [ + 191.097, + 397.5 + ], + [ + 172.825, + 410.775 + ] + ] + ], + [ + [ + [ + 147.035, + 415.516 + ], + [ + 158.013, + 430.628 + ], + [ + 167.799, + 423.519 + ], + [ + 156.821, + 408.407 + ] + ] + ], + [ + [ + [ + 163.567, + 438.273 + ], + [ + 182.703, + 424.372 + ], + [ + 177.149, + 416.727 + ], + [ + 158.013, + 430.628 + ] + ] + ], + [ + [ + [ + 149.568, + 413.676 + ], + [ + 166.17, + 401.615 + ], + [ + 153.812, + 384.604 + ], + [ + 138.013, + 397.771 + ] + ] + ], + [ + [ + [ + 165.724, + 338.602 + ], + [ + 156.609, + 346.198 + ], + [ + 169.46, + 361.616 + ], + [ + 179.61, + 353.157 + ] + ] + ], + [ + [ + [ + 147.903, + 353.454 + ], + [ + 161.227, + 369.442 + ], + [ + 169.934, + 362.186 + ], + [ + 156.609, + 346.198 + ] + ] + ], + [ + [ + [ + 143.413, + 331.936 + ], + [ + 155.836, + 346.842 + ], + [ + 165.135, + 339.092 + ], + [ + 151.21, + 324.497 + ] + ] + ], + [ + [ + [ + 135.052, + 338.035 + ], + [ + 147.903, + 353.454 + ], + [ + 155.836, + 346.842 + ], + [ + 142.541, + 330.89 + ] + ] + ], + [ + [ + [ + 137.065, + 340.45 + ], + [ + 129.513, + 347.656 + ], + [ + 139.537, + 359.684 + ], + [ + 147.537, + 353.016 + ] + ] + ], + [ + [ + [ + 125.368, + 347.275 + ], + [ + 122.113, + 362.488 + ], + [ + 133.3, + 364.881 + ], + [ + 139.537, + 359.684 + ], + [ + 127.5, + 345.241 + ] + ] + ], + [ + [ + [ + 123.869, + 362.864 + ], + [ + 121.983, + 371.679 + ], + [ + 132.924, + 374.02 + ], + [ + 141.946, + 384.844 + ], + [ + 147.787, + 379.976 + ], + [ + 134.425, + 363.944 + ], + [ + 133.3, + 364.881 + ] + ] + ], + [ + [ + [ + 161.227, + 369.442 + ], + [ + 147.537, + 353.016 + ], + [ + 134.425, + 363.944 + ], + [ + 148.115, + 380.37 + ] + ] + ], + [ + [ + [ + 141.889, + 384.776 + ], + [ + 132.924, + 374.02 + ], + [ + 121.762, + 371.631 + ], + [ + 121.14, + 374.535 + ], + [ + 121.323, + 374.574 + ], + [ + 133.695, + 391.605 + ] + ] + ], + [ + [ + [ + -320.457, + 300.419 + ], + [ + -332.741, + 289.04 + ], + [ + -342.613, + 298.453 + ], + [ + -331.193, + 312.009 + ] + ] + ], + [ + [ + [ + -339.603, + 276.498 + ], + [ + -353.541, + 285.481 + ], + [ + -342.613, + 298.453 + ], + [ + -329.451, + 285.902 + ] + ] + ], + [ + [ + [ + -351.474, + 287.935 + ], + [ + -361.612, + 294.469 + ], + [ + -352.184, + 307.16 + ], + [ + -342.335, + 298.784 + ] + ] + ], + [ + [ + [ + -373.838, + 298.562 + ], + [ + -360.506, + 314.238 + ], + [ + -352.184, + 307.16 + ], + [ + -363.514, + 291.908 + ] + ] + ], + [ + [ + [ + -373.838, + 298.562 + ], + [ + -390.013, + 308.987 + ], + [ + -384.387, + 316.56 + ], + [ + -369.383, + 303.8 + ] + ] + ], + [ + [ + [ + -388.482, + 338.375 + ], + [ + -376.041, + 327.794 + ], + [ + -389.159, + 310.136 + ], + [ + -403.058, + 319.094 + ] + ] + ], + [ + [ + [ + -389.806, + 339.501 + ], + [ + -388.027, + 341.855 + ], + [ + -372.707, + 356.826 + ], + [ + -361.496, + 344.723 + ], + [ + -376.963, + 328.578 + ] + ] + ], + [ + [ + [ + -300.64, + 339.243 + ], + [ + -316.549, + 324.507 + ], + [ + -325.028, + 333.66 + ], + [ + -309.119, + 348.397 + ] + ] + ], + [ + [ + [ + -322.466, + 357.323 + ], + [ + -311.852, + 345.865 + ], + [ + -325.028, + 333.66 + ], + [ + -335.641, + 345.118 + ] + ] + ], + [ + [ + [ + -318.99, + 298.836 + ], + [ + -330.66, + 311.435 + ], + [ + -318.772, + 322.447 + ], + [ + -307.101, + 309.848 + ] + ] + ], + [ + [ + [ + -305.484, + 308.103 + ], + [ + -318.772, + 322.447 + ], + [ + -309.719, + 330.833 + ], + [ + -296.432, + 316.488 + ] + ] + ], + [ + [ + [ + -298.14, + 318.332 + ], + [ + -309.719, + 330.833 + ], + [ + -302.649, + 337.382 + ], + [ + -291.07, + 324.881 + ] + ] + ], + [ + [ + [ + -356.011, + 366.749 + ], + [ + -346.444, + 355.062 + ], + [ + -359.699, + 342.783 + ], + [ + -370.863, + 354.835 + ], + [ + -366.133, + 359.458 + ] + ] + ], + [ + [ + [ + -319.732, + 359.854 + ], + [ + -337.156, + 343.715 + ], + [ + -347.242, + 356.037 + ], + [ + -330.533, + 371.515 + ] + ] + ], + [ + [ + [ + -332.77, + 369.442 + ], + [ + -347.242, + 356.037 + ], + [ + -355.629, + 366.282 + ], + [ + -344.173, + 374.534 + ], + [ + -339.907, + 377.147 + ] + ] + ], + [ + [ + [ + -437.336, + 391.813 + ], + [ + -446.748, + 400.88 + ], + [ + -433.887, + 412.653 + ], + [ + -425.062, + 401.716 + ] + ] + ], + [ + [ + [ + -413.281, + 413.668 + ], + [ + -426.258, + 403.198 + ], + [ + -433.887, + 412.653 + ], + [ + -421.564, + 423.934 + ] + ] + ], + [ + [ + [ + -436.94, + 442.991 + ], + [ + -421.564, + 423.934 + ], + [ + -436.664, + 410.11 + ], + [ + -452.906, + 429.867 + ] + ] + ], + [ + [ + [ + -453.856, + 431.022 + ], + [ + -436.664, + 410.11 + ], + [ + -445.316, + 402.191 + ], + [ + -465.397, + 421.534 + ] + ] + ], + [ + [ + [ + -422.533, + 453.436 + ], + [ + -408.184, + 435.651 + ], + [ + -422.014, + 424.492 + ], + [ + -436.262, + 442.15 + ] + ] + ], + [ + [ + [ + -398.255, + 423.345 + ], + [ + -412.085, + 412.186 + ], + [ + -422.014, + 424.492 + ], + [ + -408.184, + 435.651 + ] + ] + ], + [ + [ + [ + -410.138, + 438.073 + ], + [ + -424.404, + 455.755 + ], + [ + -415.627, + 462.971 + ], + [ + -410.035, + 461.996 + ], + [ + -404.141, + 465.413 + ], + [ + -393.255, + 449.984 + ] + ] + ], + [ + [ + [ + -401.277, + 467.074 + ], + [ + -398.32, + 475.246 + ], + [ + -397.659, + 475.65 + ], + [ + -385.356, + 455.558 + ], + [ + -393.255, + 449.984 + ], + [ + -404.141, + 465.413 + ] + ] + ], + [ + [ + [ + -398.255, + 423.345 + ], + [ + -410.138, + 438.073 + ], + [ + -400.145, + 445.123 + ], + [ + -388.757, + 431.008 + ] + ] + ], + [ + [ + [ + -389.763, + 432.256 + ], + [ + -400.145, + 445.123 + ], + [ + -389.054, + 452.948 + ], + [ + -380.807, + 439.481 + ] + ] + ], + [ + [ + [ + -388.9, + 424.725 + ], + [ + -373.89, + 436.835 + ], + [ + -362.782, + 418.696 + ], + [ + -376.326, + 409.14 + ] + ] + ], + [ + [ + [ + -357.326, + 409.786 + ], + [ + -369.765, + 401.009 + ], + [ + -376.326, + 409.14 + ], + [ + -362.782, + 418.696 + ] + ] + ], + [ + [ + [ + -384.474, + 390.631 + ], + [ + -402.881, + 413.445 + ], + [ + -388.9, + 424.725 + ], + [ + -369.765, + 401.009 + ] + ] + ], + [ + [ + [ + -357.326, + 409.786 + ], + [ + -342.424, + 385.45 + ], + [ + -346.673, + 382.848 + ], + [ + -354.326, + 377.336 + ], + [ + -370.609, + 400.414 + ] + ] + ], + [ + [ + [ + -366.608, + 368.487 + ], + [ + -384.474, + 390.631 + ], + [ + -370.609, + 400.414 + ], + [ + -354.326, + 377.336 + ] + ] + ], + [ + [ + [ + -384.814, + 357.75 + ], + [ + -389.636, + 363.018 + ], + [ + -373.852, + 377.466 + ], + [ + -369.468, + 372.032 + ], + [ + -372.25, + 370.028 + ] + ] + ], + [ + [ + [ + -405.271, + 365.834 + ], + [ + -398.166, + 372.337 + ], + [ + -383.291, + 356.087 + ], + [ + -389.178, + 350.333 + ] + ] + ], + [ + [ + [ + -417.414, + 401.719 + ], + [ + -402.881, + 413.445 + ], + [ + -390.578, + 398.196 + ], + [ + -405.111, + 386.47 + ] + ] + ], + [ + [ + [ + -395.602, + 374.685 + ], + [ + -407.882, + 363.443 + ], + [ + -418.941, + 374.096 + ], + [ + -405.243, + 386.635 + ] + ] + ], + [ + [ + [ + -416.227, + 400.248 + ], + [ + -405.243, + 386.635 + ], + [ + -417.051, + 375.826 + ], + [ + -430.473, + 388.754 + ] + ] + ], + [ + [ + [ + -417.254, + 364.275 + ], + [ + -429.831, + 348.355 + ], + [ + -444.98, + 358.825 + ], + [ + -431.638, + 378.13 + ] + ] + ], + [ + [ + [ + -437.006, + 339.274 + ], + [ + -438.54, + 340.263 + ], + [ + -453.096, + 347.082 + ], + [ + -444.98, + 358.825 + ], + [ + -429.831, + 348.355 + ] + ] + ], + [ + [ + [ + -417.198, + 364.345 + ], + [ + -407.277, + 354.789 + ], + [ + -415.961, + 343.798 + ], + [ + -426.717, + 352.297 + ] + ] + ], + [ + [ + [ + -393.347, + 342.777 + ], + [ + -401.32, + 332.231 + ], + [ + -415.961, + 343.798 + ], + [ + -406.646, + 355.588 + ] + ] + ], + [ + [ + [ + -401.32, + 332.231 + ], + [ + -409.43, + 321.502 + ], + [ + -424.296, + 331.083 + ], + [ + -414.908, + 342.966 + ] + ] + ], + [ + [ + [ + -436.511, + 339.9 + ], + [ + -426.717, + 352.297 + ], + [ + -414.908, + 342.966 + ], + [ + -423.802, + 331.709 + ] + ] + ], + [ + [ + [ + -486.743, + 364.565 + ], + [ + -481.003, + 376.818 + ], + [ + -465.033, + 368.11 + ], + [ + -471.679, + 357.508 + ] + ] + ], + [ + [ + [ + -453.096, + 347.082 + ], + [ + -472.512, + 356.178 + ], + [ + -463.843, + 370.008 + ], + [ + -445.29, + 358.377 + ] + ] + ], + [ + [ + [ + -433.474, + 375.474 + ], + [ + -440.428, + 365.412 + ], + [ + -455.842, + 378.02 + ], + [ + -446.349, + 387.876 + ] + ] + ], + [ + [ + [ + -460.133, + 403.94 + ], + [ + -444.956, + 389.321 + ], + [ + -455.842, + 378.02 + ], + [ + -472.206, + 391.406 + ] + ] + ], + [ + [ + [ + -488.823, + 396.625 + ], + [ + -477.769, + 405.712 + ], + [ + -468.295, + 395.466 + ], + [ + -476.027, + 387.44 + ], + [ + -476.366, + 386.716 + ] + ] + ], + [ + [ + [ + -459.808, + 404.278 + ], + [ + -468.295, + 395.466 + ], + [ + -478.054, + 406.02 + ], + [ + -469.186, + 413.311 + ] + ] + ], + [ + [ + [ + -517.15, + 377.09 + ], + [ + -517.612, + 379.13 + ], + [ + -492.638, + 399.66 + ], + [ + -487.473, + 395.552 + ], + [ + -502.981, + 370.452 + ] + ] + ], + [ + [ + [ + -487.048, + 363.914 + ], + [ + -502.537, + 371.171 + ], + [ + -487.473, + 395.552 + ], + [ + -476.366, + 386.716 + ] + ] + ], + [ + [ + [ + -355.398, + 465.346 + ], + [ + -377.451, + 451.841 + ], + [ + -384.569, + 463.465 + ], + [ + -362.516, + 476.97 + ] + ] + ], + [ + [ + [ + -369.505, + 488.382 + ], + [ + -362.516, + 476.97 + ], + [ + -373.157, + 470.454 + ], + [ + -380.146, + 481.866 + ] + ] + ], + [ + [ + [ + -384.569, + 463.465 + ], + [ + -393.566, + 478.157 + ], + [ + -382.154, + 485.146 + ], + [ + -373.157, + 470.454 + ] + ] + ], + [ + [ + [ + -365.724, + 432.691 + ], + [ + -377.451, + 451.841 + ], + [ + -364.3, + 459.894 + ], + [ + -352.573, + 440.744 + ] + ] + ], + [ + [ + [ + -341.217, + 485.234 + ], + [ + -325.755, + 494.702 + ], + [ + -315.273, + 477.585 + ], + [ + -330.735, + 468.117 + ] + ] + ], + [ + [ + [ + -311.265, + 466.04 + ], + [ + -324.5, + 457.935 + ], + [ + -330.735, + 468.117 + ], + [ + -317.5, + 476.222 + ] + ] + ], + [ + [ + [ + -328.233, + 493.185 + ], + [ + -343.792, + 483.657 + ], + [ + -349.045, + 492.234 + ], + [ + -333.486, + 501.762 + ] + ] + ], + [ + [ + [ + -332.934, + 502.1 + ], + [ + -349.045, + 492.234 + ], + [ + -352.842, + 498.435 + ], + [ + -336.731, + 508.3 + ] + ] + ], + [ + [ + [ + -360.388, + 473.495 + ], + [ + -371.513, + 491.662 + ], + [ + -354.917, + 501.824 + ], + [ + -343.792, + 483.657 + ] + ] + ], + [ + [ + [ + -314.663, + 422.59 + ], + [ + -324.22, + 438.196 + ], + [ + -317.436, + 442.351 + ], + [ + -307.879, + 426.744 + ] + ] + ], + [ + [ + [ + -307.763, + 426.555 + ], + [ + -317.436, + 442.351 + ], + [ + -301.39, + 452.177 + ], + [ + -291.717, + 436.381 + ] + ] + ], + [ + [ + [ + -302.841, + 451.288 + ], + [ + -312.161, + 445.581 + ], + [ + -321.028, + 460.061 + ], + [ + -311.708, + 465.769 + ] + ] + ], + [ + [ + [ + -313.412, + 420.547 + ], + [ + -325.309, + 413.262 + ], + [ + -332.84, + 425.561 + ], + [ + -320.943, + 432.846 + ] + ] + ], + [ + [ + [ + -365.724, + 432.691 + ], + [ + -344.984, + 445.392 + ], + [ + -336.51, + 431.554 + ], + [ + -357.25, + 418.853 + ] + ] + ], + [ + [ + [ + -354.83, + 420.335 + ], + [ + -349.627, + 423.522 + ], + [ + -340.217, + 408.155 + ], + [ + -345.42, + 404.969 + ] + ] + ], + [ + [ + [ + -326.568, + 415.319 + ], + [ + -339.685, + 407.286 + ], + [ + -349.627, + 423.522 + ], + [ + -336.51, + 431.554 + ] + ] + ], + [ + [ + [ + -311.472, + 525.083 + ], + [ + -305.307, + 515.015 + ], + [ + -324.378, + 503.337 + ], + [ + -330.543, + 513.405 + ] + ] + ], + [ + [ + [ + -297.068, + 501.56 + ], + [ + -316.892, + 489.42 + ], + [ + -325.132, + 502.875 + ], + [ + -305.307, + 515.015 + ] + ] + ], + [ + [ + [ + -282.058, + 524.711 + ], + [ + -282.147, + 524.657 + ], + [ + -282.06, + 524.715 + ] + ] + ], + [ + [ + [ + -274.775, + 515.212 + ], + [ + -297.068, + 501.56 + ], + [ + -303.285, + 511.713 + ], + [ + -280.787, + 525.489 + ] + ] + ], + [ + [ + [ + -265.131, + 494.418 + ], + [ + -276.542, + 487.43 + ], + [ + -288.433, + 506.848 + ], + [ + -276.631, + 514.075 + ] + ] + ], + [ + [ + [ + -305.002, + 470.003 + ], + [ + -316.892, + 489.42 + ], + [ + -302.267, + 498.377 + ], + [ + -290.376, + 478.959 + ] + ] + ], + [ + [ + [ + -293.881, + 451.842 + ], + [ + -305.002, + 470.003 + ], + [ + -292.904, + 477.411 + ], + [ + -281.782, + 459.25 + ] + ] + ], + [ + [ + [ + -292.552, + 452.655 + ], + [ + -282.22, + 458.982 + ], + [ + -275.334, + 447.737 + ], + [ + -285.666, + 441.411 + ] + ] + ], + [ + [ + [ + -262.062, + 455.745 + ], + [ + -275.281, + 447.65 + ], + [ + -282.22, + 458.982 + ], + [ + -269.002, + 467.077 + ] + ] + ], + [ + [ + [ + -280.123, + 485.238 + ], + [ + -263.276, + 495.555 + ], + [ + -258.008, + 486.55 + ], + [ + -274.676, + 476.343 + ] + ] + ], + [ + [ + [ + -251.092, + 474.727 + ], + [ + -267.524, + 464.664 + ], + [ + -274.676, + 476.343 + ], + [ + -258.008, + 486.55 + ] + ] + ], + [ + [ + [ + -262.273, + 456.089 + ], + [ + -267.524, + 464.664 + ], + [ + -252.378, + 473.94 + ], + [ + -247.299, + 465.258 + ] + ] + ], + [ + [ + [ + -254.717, + 430.025 + ], + [ + -263.997, + 445.179 + ], + [ + -253.097, + 451.853 + ], + [ + -243.817, + 436.699 + ] + ] + ], + [ + [ + [ + -241.769, + 458.79 + ], + [ + -232.794, + 443.449 + ], + [ + -243.817, + 436.699 + ], + [ + -253.097, + 451.853 + ] + ] + ], + [ + [ + [ + -224.551, + 424.901 + ], + [ + -230.078, + 421.516 + ], + [ + -240.587, + 438.677 + ], + [ + -234.714, + 442.273 + ] + ] + ], + [ + [ + [ + -263.001, + 443.552 + ], + [ + -255.485, + 431.279 + ], + [ + -275.678, + 418.914 + ], + [ + -283.194, + 431.187 + ] + ] + ], + [ + [ + [ + -281.9, + 429.074 + ], + [ + -274.468, + 416.937 + ], + [ + -291.262, + 406.653 + ], + [ + -298.694, + 418.79 + ] + ] + ], + [ + [ + [ + -215.912, + 409.395 + ], + [ + -220.782, + 406.145 + ], + [ + -230.163, + 421.465 + ], + [ + -224.869, + 424.706 + ] + ] + ], + [ + [ + [ + -225.785, + 384.402 + ], + [ + -235.032, + 396.634 + ], + [ + -215.833, + 409.448 + ], + [ + -209.828, + 399.183 + ] + ] + ], + [ + [ + [ + -235.379, + 373.042 + ], + [ + -251.763, + 357.865 + ], + [ + -260.262, + 367.04 + ], + [ + -243.878, + 382.217 + ] + ] + ], + [ + [ + [ + -238.446, + 401.15 + ], + [ + -224.685, + 382.948 + ], + [ + -235.379, + 373.042 + ], + [ + -250.808, + 389.699 + ] + ] + ], + [ + [ + [ + -300.984, + 422.529 + ], + [ + -289.852, + 404.35 + ], + [ + -298.592, + 398.998 + ], + [ + -309.724, + 417.177 + ] + ] + ], + [ + [ + [ + -309.014, + 392.616 + ], + [ + -320.146, + 410.795 + ], + [ + -309.724, + 417.177 + ], + [ + -298.592, + 398.998 + ] + ] + ], + [ + [ + [ + -317.381, + 364.38 + ], + [ + -331.904, + 380.057 + ], + [ + -319.255, + 389.62 + ], + [ + -306.44, + 372.67 + ] + ] + ], + [ + [ + [ + -318.986, + 408.902 + ], + [ + -311, + 395.86 + ], + [ + -321.919, + 387.605 + ], + [ + -330.604, + 401.787 + ] + ] + ], + [ + [ + [ + -331.064, + 402.538 + ], + [ + -321.919, + 387.605 + ], + [ + -330.113, + 381.411 + ], + [ + -333.722, + 385.307 + ], + [ + -340.671, + 396.656 + ] + ] + ], + [ + [ + [ + -304.793, + 354.152 + ], + [ + -292.762, + 365.297 + ], + [ + -280.439, + 351.993 + ], + [ + -292.47, + 340.849 + ] + ] + ], + [ + [ + [ + -292.708, + 340.628 + ], + [ + -280.439, + 351.993 + ], + [ + -271.122, + 341.935 + ], + [ + -283.391, + 330.57 + ] + ] + ], + [ + [ + [ + -271.484, + 342.325 + ], + [ + -285.507, + 357.464 + ], + [ + -276.006, + 366.265 + ], + [ + -261.982, + 351.127 + ] + ] + ], + [ + [ + [ + -267.146, + 374.472 + ], + [ + -251.763, + 357.865 + ], + [ + -260.623, + 349.659 + ], + [ + -276.006, + 366.265 + ] + ] + ], + [ + [ + [ + -306.469, + 352.599 + ], + [ + -317.381, + 364.38 + ], + [ + -304.954, + 373.795 + ], + [ + -295.087, + 363.143 + ] + ] + ], + [ + [ + [ + 546.04, + 67.383 + ], + [ + 547.698, + 58.273 + ], + [ + 532.305, + 56.418 + ], + [ + 531.416, + 63.795 + ] + ] + ], + [ + [ + [ + 532.242, + 56.41 + ], + [ + 541.246, + 57.495 + ], + [ + 543.313, + 40.337 + ], + [ + 534.31, + 39.253 + ] + ] + ], + [ + [ + [ + 545.59, + 69.857 + ], + [ + 562.596, + 74.03 + ], + [ + 565.336, + 58.904 + ], + [ + 548.15, + 55.791 + ] + ] + ], + [ + [ + [ + 535.298, + 39.372 + ], + [ + 546.949, + 40.775 + ], + [ + 548.359, + 29.076 + ], + [ + 536.708, + 27.672 + ] + ] + ], + [ + [ + [ + 535.967, + 27.583 + ], + [ + 548.359, + 29.076 + ], + [ + 549.308, + 21.195 + ], + [ + 536.917, + 19.702 + ] + ] + ], + [ + [ + [ + 549.609, + 18.698 + ], + [ + 546.949, + 40.775 + ], + [ + 559.554, + 42.294 + ], + [ + 562.214, + 20.217 + ] + ] + ], + [ + [ + [ + 571.52, + 24.769 + ], + [ + 561.807, + 23.599 + ], + [ + 559.554, + 42.294 + ], + [ + 568.158, + 43.331 + ] + ] + ], + [ + [ + [ + 600.086, + 24.779 + ], + [ + 586.21, + 23.108 + ], + [ + 584.352, + 33.319 + ], + [ + 598.077, + 35.817 + ] + ] + ], + [ + [ + [ + 581.795, + 47.366 + ], + [ + 595.52, + 49.864 + ], + [ + 598.077, + 35.817 + ], + [ + 584.352, + 33.319 + ] + ] + ], + [ + [ + [ + 571.65, + 24.05 + ], + [ + 567.885, + 44.834 + ], + [ + 581.795, + 47.366 + ], + [ + 585.73, + 25.746 + ] + ] + ], + [ + [ + [ + 591.055, + 49.051 + ], + [ + 580.11, + 47.059 + ], + [ + 577.382, + 62.049 + ], + [ + 588.327, + 64.041 + ] + ] + ], + [ + [ + [ + 565.169, + 59.826 + ], + [ + 562.596, + 74.03 + ], + [ + 574.14, + 76.862 + ], + [ + 576.853, + 61.953 + ] + ] + ], + [ + [ + [ + 590.141, + 64.371 + ], + [ + 576.853, + 61.953 + ], + [ + 574.527, + 74.73 + ], + [ + 587.669, + 77.954 + ] + ] + ], + [ + [ + [ + 600.641, + 67.933 + ], + [ + 610.503, + 70.735 + ], + [ + 614.577, + 56.397 + ], + [ + 603.322, + 53.199 + ] + ] + ], + [ + [ + [ + 615.464, + 83.848 + ], + [ + 618.541, + 73.019 + ], + [ + 598.722, + 67.388 + ], + [ + 596.57, + 79.213 + ] + ] + ], + [ + [ + [ + 635.761, + 77.216 + ], + [ + 618.724, + 72.375 + ], + [ + 615.216, + 84.722 + ], + [ + 631.493, + 88.715 + ] + ] + ], + [ + [ + [ + 641.788, + 64.128 + ], + [ + 622.615, + 58.68 + ], + [ + 618.724, + 72.375 + ], + [ + 636.82, + 77.517 + ] + ] + ], + [ + [ + [ + 623.062, + 27.548 + ], + [ + 604.86, + 25.355 + ], + [ + 603.089, + 35.085 + ], + [ + 620.838, + 38.643 + ] + ] + ], + [ + [ + [ + 603.592, + 53.276 + ], + [ + 617.132, + 57.123 + ], + [ + 620.838, + 38.643 + ], + [ + 606.769, + 35.823 + ] + ] + ], + [ + [ + [ + 617.132, + 57.123 + ], + [ + 641.788, + 64.128 + ], + [ + 645.917, + 53.003 + ], + [ + 619.461, + 45.506 + ] + ] + ], + [ + [ + [ + 639.067, + 31.455 + ], + [ + 635.336, + 50.005 + ], + [ + 644.374, + 52.566 + ], + [ + 651.084, + 34.485 + ], + [ + 650.038, + 32.777 + ] + ] + ], + [ + [ + [ + 623.062, + 27.548 + ], + [ + 619.461, + 45.506 + ], + [ + 635.336, + 50.005 + ], + [ + 639.456, + 29.523 + ] + ] + ], + [ + [ + [ + 640.966, + 24.87 + ], + [ + 651.138, + 26.096 + ], + [ + 652.279, + 18.469 + ], + [ + 655.896, + 15.269 + ], + [ + 655.737, + 13.13 + ], + [ + 642.419, + 12.815 + ] + ] + ], + [ + [ + [ + 654.459, + -4.027 + ], + [ + 644.476, + -4.263 + ], + [ + 642.419, + 12.815 + ], + [ + 655.737, + 13.13 + ] + ] + ], + [ + [ + [ + 624.431, + 22.878 + ], + [ + 640.966, + 24.87 + ], + [ + 643.079, + 7.333 + ], + [ + 626.544, + 5.34 + ] + ] + ], + [ + [ + [ + 627.749, + -4.66 + ], + [ + 654.459, + -4.027 + ], + [ + 653.676, + -14.55 + ], + [ + 629.011, + -15.135 + ] + ] + ], + [ + [ + [ + 653.676, + -14.55 + ], + [ + 652.304, + -32.963 + ], + [ + 641.116, + -33.206 + ], + [ + 640.681, + -14.858 + ] + ] + ], + [ + [ + [ + 631.214, + -33.421 + ], + [ + 629.011, + -15.135 + ], + [ + 640.681, + -14.858 + ], + [ + 641.116, + -33.206 + ] + ] + ], + [ + [ + [ + 624.699, + 20.651 + ], + [ + 626.055, + 9.398 + ], + [ + 609.267, + 7.376 + ], + [ + 607.912, + 18.628 + ] + ] + ], + [ + [ + [ + 598.103, + -7.372 + ], + [ + 594.887, + 19.318 + ], + [ + 607.643, + 20.855 + ], + [ + 610.859, + -5.835 + ] + ] + ], + [ + [ + [ + 600.445, + -7.09 + ], + [ + 627.647, + -3.813 + ], + [ + 628.796, + -13.347 + ], + [ + 601.594, + -16.624 + ] + ] + ], + [ + [ + [ + 628.796, + -13.347 + ], + [ + 631.214, + -33.421 + ], + [ + 617.358, + -33.723 + ], + [ + 615.102, + -14.997 + ] + ] + ], + [ + [ + [ + 601.32, + -34.071 + ], + [ + 599.252, + -16.906 + ], + [ + 615.102, + -14.997 + ], + [ + 617.358, + -33.723 + ] + ] + ], + [ + [ + [ + 579.179, + -31.412 + ], + [ + 578.271, + -23.88 + ], + [ + 591.976, + -22.229 + ], + [ + 593.046, + -31.11 + ] + ] + ], + [ + [ + [ + 576.186, + -6.575 + ], + [ + 592.929, + -4.558 + ], + [ + 595.014, + -21.863 + ], + [ + 578.271, + -23.88 + ] + ] + ], + [ + [ + [ + 565.146, + -31.549 + ], + [ + 563.681, + -19.389 + ], + [ + 577.529, + -17.72 + ], + [ + 579.159, + -31.244 + ] + ] + ], + [ + [ + [ + 592.929, + -4.558 + ], + [ + 575.93, + -6.606 + ], + [ + 574.47, + 5.507 + ], + [ + 591.47, + 7.555 + ] + ] + ], + [ + [ + [ + 588.351, + 7.179 + ], + [ + 574.47, + 5.507 + ], + [ + 573.516, + 13.433 + ], + [ + 587.396, + 15.105 + ] + ] + ], + [ + [ + [ + 573.44, + 14.06 + ], + [ + 574.517, + 5.117 + ], + [ + 560.926, + 3.479 + ], + [ + 559.848, + 12.422 + ] + ] + ], + [ + [ + [ + 559.531, + 15.059 + ], + [ + 561.968, + -5.167 + ], + [ + 544.336, + -7.292 + ], + [ + 541.899, + 12.934 + ] + ] + ], + [ + [ + [ + 537.224, + -8.148 + ], + [ + 534.787, + 12.077 + ], + [ + 541.899, + 12.934 + ], + [ + 544.336, + -7.292 + ] + ] + ], + [ + [ + [ + 565.184, + -31.864 + ], + [ + 554.838, + -32.089 + ], + [ + 553.1, + -17.665 + ], + [ + 563.325, + -16.433 + ] + ] + ], + [ + [ + [ + 540.506, + -35.393 + ], + [ + 538.581, + -19.414 + ], + [ + 553.1, + -17.665 + ], + [ + 555.198, + -35.074 + ] + ] + ], + [ + [ + [ + 540.627, + -7.738 + ], + [ + 561.968, + -5.167 + ], + [ + 563.325, + -16.433 + ], + [ + 541.984, + -19.004 + ] + ] + ], + [ + [ + [ + 630.035, + -85.95 + ], + [ + 648.257, + -87.307 + ], + [ + 647.36, + -99.356 + ], + [ + 628.29, + -96.068 + ] + ] + ], + [ + [ + [ + 626.9, + -104.128 + ], + [ + 628.29, + -96.068 + ], + [ + 645.684, + -99.067 + ], + [ + 645.322, + -103.931 + ], + [ + 641.659, + -108.198 + ] + ] + ], + [ + [ + [ + 612.08, + -98.296 + ], + [ + 614.393, + -84.785 + ], + [ + 630.035, + -85.95 + ], + [ + 627.187, + -102.462 + ] + ] + ], + [ + [ + [ + 644.981, + -87.063 + ], + [ + 632.829, + -86.158 + ], + [ + 634.165, + -68.221 + ], + [ + 646.317, + -69.126 + ] + ] + ], + [ + [ + [ + 611.467, + -101.881 + ], + [ + 594.295, + -97.145 + ], + [ + 595.502, + -90.093 + ], + [ + 612.973, + -93.084 + ] + ] + ], + [ + [ + [ + 580.167, + -93.249 + ], + [ + 582.269, + -75.897 + ], + [ + 597.486, + -78.502 + ], + [ + 594.295, + -97.145 + ] + ] + ], + [ + [ + [ + 586.196, + -64.648 + ], + [ + 598.367, + -65.555 + ], + [ + 596.189, + -78.279 + ], + [ + 584.782, + -76.327 + ] + ] + ], + [ + [ + [ + 607.084, + -66.204 + ], + [ + 583.654, + -64.459 + ], + [ + 585.059, + -52.859 + ], + [ + 607.951, + -54.564 + ] + ] + ], + [ + [ + [ + 593.973, + -40.845 + ], + [ + 593.034, + -53.453 + ], + [ + 587.273, + -53.024 + ], + [ + 588.735, + -40.958 + ] + ] + ], + [ + [ + [ + 608.952, + -41.125 + ], + [ + 607.951, + -54.564 + ], + [ + 593.034, + -53.453 + ], + [ + 593.928, + -41.452 + ] + ] + ], + [ + [ + [ + 629.259, + -42.741 + ], + [ + 628.766, + -49.364 + ], + [ + 608.451, + -47.851 + ], + [ + 608.799, + -43.186 + ] + ] + ], + [ + [ + [ + 649.593, + -69.37 + ], + [ + 627.399, + -67.717 + ], + [ + 628.044, + -59.068 + ], + [ + 650.237, + -60.72 + ] + ] + ], + [ + [ + [ + 648.538, + -60.594 + ], + [ + 628.044, + -59.068 + ], + [ + 629.039, + -45.703 + ], + [ + 649.533, + -47.229 + ] + ] + ], + [ + [ + [ + 629.593, + -38.258 + ], + [ + 651.946, + -37.772 + ], + [ + 651.232, + -47.356 + ], + [ + 629.039, + -45.703 + ] + ] + ], + [ + [ + [ + 575.488, + -91.959 + ], + [ + 559.5, + -87.55 + ], + [ + 561.706, + -71.157 + ], + [ + 577.772, + -73.103 + ] + ] + ], + [ + [ + [ + 575.504, + -63.873 + ], + [ + 574.435, + -72.698 + ], + [ + 561.706, + -71.157 + ], + [ + 562.692, + -63.832 + ] + ] + ], + [ + [ + [ + 546.353, + -83.924 + ], + [ + 543.925, + -63.771 + ], + [ + 562.692, + -63.832 + ], + [ + 559.5, + -87.55 + ] + ] + ], + [ + [ + [ + 558.105, + -39.812 + ], + [ + 581.867, + -39.295 + ], + [ + 580.103, + -53.862 + ], + [ + 558.387, + -52.796 + ] + ] + ], + [ + [ + [ + 577.215, + -63.878 + ], + [ + 558.626, + -63.818 + ], + [ + 558.387, + -52.796 + ], + [ + 578.438, + -53.78 + ] + ] + ], + [ + [ + [ + 558.137, + -41.309 + ], + [ + 558.626, + -63.818 + ], + [ + 545.31, + -63.776 + ], + [ + 542.644, + -41.646 + ] + ] + ], + [ + [ + [ + 526.456, + 89.148 + ], + [ + 537.994, + 91.256 + ], + [ + 541.426, + 77.266 + ], + [ + 528.276, + 74.039 + ] + ] + ], + [ + [ + [ + 541.469, + 77.091 + ], + [ + 537.994, + 91.256 + ], + [ + 551.155, + 93.66 + ], + [ + 554.439, + 80.273 + ] + ] + ], + [ + [ + [ + 559.375, + 95.162 + ], + [ + 563.305, + 79.146 + ], + [ + 555.203, + 77.158 + ], + [ + 551.155, + 93.66 + ] + ] + ], + [ + [ + [ + 525.522, + 88.978 + ], + [ + 523.763, + 103.577 + ], + [ + 523.32, + 108.805 + ], + [ + 539.063, + 111.394 + ], + [ + 542.588, + 92.095 + ] + ] + ], + [ + [ + [ + 552.861, + 113.664 + ], + [ + 554.628, + 106.462 + ], + [ + 540.437, + 103.87 + ], + [ + 539.063, + 111.394 + ] + ] + ], + [ + [ + [ + 557.85, + 94.883 + ], + [ + 542.588, + 92.095 + ], + [ + 540.437, + 103.87 + ], + [ + 554.993, + 106.528 + ] + ] + ], + [ + [ + [ + 526.584, + 109.342 + ], + [ + 525.801, + 118.592 + ], + [ + 537.972, + 120.593 + ], + [ + 539.474, + 111.462 + ] + ] + ], + [ + [ + [ + 524.152, + 131.631 + ], + [ + 535.841, + 133.553 + ], + [ + 537.972, + 120.593 + ], + [ + 525.264, + 118.503 + ] + ] + ], + [ + [ + [ + 553.064, + 113.697 + ], + [ + 539.474, + 111.462 + ], + [ + 535.841, + 133.553 + ], + [ + 547.714, + 135.506 + ] + ] + ], + [ + [ + [ + 520.835, + 147.126 + ], + [ + 532.189, + 148.993 + ], + [ + 534.757, + 133.375 + ], + [ + 522.174, + 131.306 + ] + ] + ], + [ + [ + [ + 545.626, + 151.203 + ], + [ + 549.409, + 135.785 + ], + [ + 534.757, + 133.375 + ], + [ + 532.189, + 148.993 + ] + ] + ], + [ + [ + [ + 531.228, + 160.861 + ], + [ + 533.154, + 149.152 + ], + [ + 520.625, + 147.091 + ], + [ + 519.68, + 158.249 + ] + ] + ], + [ + [ + [ + 542.048, + 165.787 + ], + [ + 545.626, + 151.203 + ], + [ + 533.154, + 149.152 + ], + [ + 530.835, + 163.251 + ] + ] + ], + [ + [ + [ + 551.437, + 156.837 + ], + [ + 562.563, + 160.287 + ], + [ + 568.504, + 141.128 + ], + [ + 556.225, + 137.321 + ] + ] + ], + [ + [ + [ + 546.731, + 166.846 + ], + [ + 572.111, + 172.587 + ], + [ + 574.753, + 164.067 + ], + [ + 549.345, + 156.189 + ] + ] + ], + [ + [ + [ + 580.694, + 144.908 + ], + [ + 572.111, + 172.587 + ], + [ + 588.117, + 176.207 + ], + [ + 596.32, + 149.753 + ] + ] + ], + [ + [ + [ + 606.354, + 152.865 + ], + [ + 596.32, + 149.753 + ], + [ + 588.954, + 173.507 + ], + [ + 597.94, + 175.54 + ] + ] + ], + [ + [ + [ + 559.346, + 123.871 + ], + [ + 566.648, + 125.663 + ], + [ + 570.584, + 109.617 + ], + [ + 563.283, + 107.826 + ] + ] + ], + [ + [ + [ + 557.325, + 137.662 + ], + [ + 575.113, + 143.178 + ], + [ + 578.686, + 128.616 + ], + [ + 560.631, + 124.187 + ] + ] + ], + [ + [ + [ + 562.906, + 107.733 + ], + [ + 582.622, + 112.57 + ], + [ + 585.193, + 102.091 + ], + [ + 565.477, + 97.254 + ] + ] + ], + [ + [ + [ + 567.966, + 80.289 + ], + [ + 563.899, + 96.867 + ], + [ + 571.74, + 98.791 + ], + [ + 575.807, + 82.213 + ] + ] + ], + [ + [ + [ + 588.492, + 88.645 + ], + [ + 575.039, + 85.345 + ], + [ + 571.74, + 98.791 + ], + [ + 585.193, + 102.091 + ] + ] + ], + [ + [ + [ + 608.599, + 153.561 + ], + [ + 612.672, + 142.585 + ], + [ + 605.131, + 132.351 + ], + [ + 605.414, + 127.874 + ], + [ + 603.113, + 127.537 + ], + [ + 597.946, + 150.257 + ] + ] + ], + [ + [ + [ + 604.994, + 116.234 + ], + [ + 593.09, + 114.404 + ], + [ + 590.485, + 125.685 + ], + [ + 603.433, + 127.584 + ], + [ + 604.09, + 117.182 + ] + ] + ], + [ + [ + [ + 609.235, + 90.414 + ], + [ + 589.26, + 85.514 + ], + [ + 585.44, + 101.086 + ], + [ + 605.415, + 105.987 + ] + ] + ], + [ + [ + [ + 615.2, + 106.484 + ], + [ + 617.49, + 104.08 + ], + [ + 625.026, + 103.237 + ], + [ + 626.953, + 98.043 + ], + [ + 608.476, + 93.51 + ], + [ + 602.977, + 115.923 + ], + [ + 605.102, + 116.25 + ], + [ + 614.312, + 106.583 + ] + ] + ], + [ + [ + [ + 518.529, + 165.389 + ], + [ + 517.117, + 182.068 + ], + [ + 526.318, + 183.494 + ], + [ + 529.835, + 167.946 + ] + ] + ], + [ + [ + [ + 540.012, + 185.617 + ], + [ + 543.319, + 170.996 + ], + [ + 529.835, + 167.946 + ], + [ + 526.318, + 183.494 + ] + ] + ], + [ + [ + [ + 520.983, + 182.667 + ], + [ + 519.551, + 199.582 + ], + [ + 536.267, + 202.173 + ], + [ + 540.012, + 185.617 + ] + ] + ], + [ + [ + [ + 534.291, + 210.913 + ], + [ + 536.267, + 202.173 + ], + [ + 518.041, + 199.348 + ], + [ + 517.355, + 207.448 + ] + ] + ], + [ + [ + [ + 537.294, + 197.636 + ], + [ + 533.959, + 212.377 + ], + [ + 548.08, + 215.266 + ], + [ + 551.349, + 200.815 + ] + ] + ], + [ + [ + [ + 557.259, + 217.144 + ], + [ + 560.485, + 202.881 + ], + [ + 551.349, + 200.815 + ], + [ + 548.08, + 215.266 + ] + ] + ], + [ + [ + [ + 542.704, + 173.716 + ], + [ + 539.333, + 188.62 + ], + [ + 553.476, + 191.819 + ], + [ + 556.847, + 176.915 + ] + ] + ], + [ + [ + [ + 562.524, + 193.865 + ], + [ + 566.511, + 176.241 + ], + [ + 557.462, + 174.195 + ], + [ + 553.476, + 191.819 + ] + ] + ], + [ + [ + [ + 587.484, + 203.509 + ], + [ + 571.27, + 198.696 + ], + [ + 567.283, + 218.185 + ], + [ + 575.747, + 219.917 + ], + [ + 577.334, + 215.065 + ], + [ + 584.956, + 210.322 + ] + ] + ], + [ + [ + [ + 557.904, + 214.293 + ], + [ + 567.67, + 216.292 + ], + [ + 571.27, + 198.696 + ], + [ + 562.051, + 195.959 + ] + ] + ], + [ + [ + [ + 566.243, + 177.425 + ], + [ + 562.051, + 195.959 + ], + [ + 576.399, + 200.218 + ], + [ + 580.809, + 180.72 + ] + ] + ], + [ + [ + [ + 576.399, + 200.218 + ], + [ + 589.807, + 204.199 + ], + [ + 593.258, + 194.9 + ], + [ + 578.587, + 190.545 + ] + ] + ], + [ + [ + [ + 580.884, + 180.389 + ], + [ + 578.587, + 190.545 + ], + [ + 591.502, + 194.379 + ], + [ + 595.47, + 183.688 + ] + ] + ], + [ + [ + [ + 542.503, + 251.102 + ], + [ + 538.303, + 245.696 + ], + [ + 522.375, + 258.069 + ], + [ + 511.672, + 257.163 + ], + [ + 510.071, + 276.062 + ], + [ + 510.248, + 276.16 + ] + ] + ], + [ + [ + [ + 512.78, + 257.257 + ], + [ + 522.375, + 258.069 + ], + [ + 528.599, + 253.234 + ], + [ + 525.628, + 240.454 + ], + [ + 514.284, + 239.493 + ] + ] + ], + [ + [ + [ + 515.29, + 239.579 + ], + [ + 529.704, + 240.799 + ], + [ + 531.41, + 228.981 + ], + [ + 516.295, + 227.701 + ] + ] + ], + [ + [ + [ + 514.89, + 227.582 + ], + [ + 531.41, + 228.981 + ], + [ + 532.824, + 219.186 + ], + [ + 515.894, + 215.723 + ] + ] + ], + [ + [ + [ + 532.787, + 219.443 + ], + [ + 531.398, + 229.062 + ], + [ + 546.061, + 232.062 + ], + [ + 548.006, + 222.556 + ] + ] + ], + [ + [ + [ + 576.27, + 226.203 + ], + [ + 576.236, + 226.117 + ], + [ + 576.294, + 225.938 + ], + [ + 548.479, + 220.247 + ], + [ + 547.313, + 225.946 + ], + [ + 564.446, + 235.389 + ] + ] + ], + [ + [ + [ + 545.357, + 235.503 + ], + [ + 536.02, + 242.758 + ], + [ + 543.149, + 251.934 + ], + [ + 564.446, + 235.389 + ], + [ + 547.313, + 225.946 + ] + ] + ], + [ + [ + [ + -172.782, + 612.014 + ], + [ + -163.288, + 633.414 + ], + [ + -143.23, + 624.516 + ], + [ + -113.701, + 691.081 + ], + [ + -63.005, + 668.591 + ], + [ + -102.027, + 580.626 + ] + ] + ], + [ + [ + [ + 539.187, + 285.15 + ], + [ + 524.275, + 296.735 + ], + [ + 529.507, + 303.469 + ], + [ + 544.419, + 291.885 + ] + ] + ], + [ + [ + [ + -334.284, + 733.959 + ], + [ + -320.065, + 736.074 + ], + [ + -316.8, + 720.145 + ], + [ + -329.77, + 716.744 + ] + ] + ], + [ + [ + [ + -335.312, + 737.877 + ], + [ + -331.678, + 724.018 + ], + [ + -350.523, + 717.177 + ], + [ + -355.039, + 734.942 + ] + ] + ], + [ + [ + [ + -288.812, + 693.525 + ], + [ + -302.325, + 688.461 + ], + [ + -307.655, + 702.685 + ], + [ + -292.48, + 708.372 + ] + ] + ], + [ + [ + [ + -283.508, + 669.994 + ], + [ + -295.917, + 664.175 + ], + [ + -304.686, + 687.576 + ], + [ + -290.692, + 692.82 + ], + [ + -290.656, + 692.676 + ] + ] + ], + [ + [ + [ + -341.947, + 668.911 + ], + [ + -350.291, + 686.708 + ], + [ + -341.4, + 690.04 + ], + [ + -334.525, + 671.693 + ] + ] + ], + [ + [ + [ + -328.891, + 648.714 + ], + [ + -320.126, + 652.824 + ], + [ + -308.326, + 627.658 + ], + [ + -317.091, + 623.549 + ] + ] + ], + [ + [ + [ + -264.509, + 631.853 + ], + [ + -263.949, + 630.635 + ], + [ + -258.454, + 620.442 + ], + [ + -276.67, + 611.901 + ], + [ + -282.147, + 623.583 + ] + ] + ], + [ + [ + [ + -250.188, + 607.115 + ], + [ + -270.057, + 597.798 + ], + [ + -276.67, + 611.901 + ], + [ + -257.591, + 620.847 + ] + ] + ], + [ + [ + [ + -250.188, + 607.115 + ], + [ + -250.123, + 606.995 + ], + [ + -240.452, + 590.332 + ], + [ + -250.623, + 584.428 + ], + [ + -259.265, + 602.859 + ] + ] + ], + [ + [ + [ + -262.488, + 581.656 + ], + [ + -270.057, + 597.798 + ], + [ + -259.265, + 602.859 + ], + [ + -252.14, + 587.663 + ] + ] + ], + [ + [ + [ + -312.694, + 609.26 + ], + [ + -303.64, + 613.505 + ], + [ + -293.899, + 592.73 + ], + [ + -302.953, + 588.485 + ] + ] + ], + [ + [ + [ + -297.37, + 576.569 + ], + [ + -278.849, + 585.253 + ], + [ + -273.525, + 573.901 + ], + [ + -277.742, + 571.453 + ], + [ + -281.548, + 575.236 + ] + ] + ], + [ + [ + [ + -303.547, + 588.206 + ], + [ + -284.435, + 597.168 + ], + [ + -278.849, + 585.253 + ], + [ + -297.96, + 576.292 + ] + ] + ], + [ + [ + [ + -195.442, + 645.521 + ], + [ + -187.49, + 638.537 + ], + [ + -194.601, + 622.506 + ], + [ + -195.306, + 622.271 + ], + [ + -203.861, + 639.252 + ] + ] + ], + [ + [ + [ + -200.4, + 620.569 + ], + [ + -205.694, + 611.94 + ], + [ + -205.498, + 610.622 + ], + [ + -207.634, + 609.382 + ], + [ + -217.194, + 629.325 + ], + [ + -203.861, + 639.252 + ], + [ + -195.306, + 622.271 + ] + ] + ], + [ + [ + [ + -176.512, + 669.317 + ], + [ + -182.9, + 654.917 + ], + [ + -196.986, + 661.165 + ], + [ + -190.598, + 675.566 + ] + ] + ], + [ + [ + [ + -181.392, + 710.401 + ], + [ + -172.778, + 728.235 + ], + [ + -163.955, + 723.974 + ], + [ + -172.57, + 706.14 + ] + ] + ], + [ + [ + [ + -167.537, + 689.093 + ], + [ + -187.116, + 698.551 + ], + [ + -181.392, + 710.401 + ], + [ + -162.197, + 701.13 + ] + ] + ], + [ + [ + [ + -178.26, + 670.092 + ], + [ + -187.189, + 674.053 + ], + [ + -178.226, + 694.257 + ], + [ + -169.426, + 690.006 + ] + ] + ], + [ + [ + [ + -236.3, + 592.742 + ], + [ + -244.781, + 607.352 + ], + [ + -227.597, + 615.589 + ], + [ + -219.871, + 602.279 + ] + ] + ], + [ + [ + [ + -209.326, + 612.912 + ], + [ + -221.83, + 605.654 + ], + [ + -227.597, + 615.589 + ], + [ + -213.783, + 622.21 + ] + ] + ], + [ + [ + [ + -258.071, + 638.932 + ], + [ + -245.806, + 644.811 + ], + [ + -236.544, + 625.487 + ], + [ + -248.204, + 619.898 + ], + [ + -255.771, + 633.936 + ] + ] + ], + [ + [ + [ + -267.467, + 658.136 + ], + [ + -259.015, + 662.188 + ], + [ + -249.774, + 642.909 + ], + [ + -258.794, + 638.585 + ], + [ + -265.774, + 653.749 + ] + ] + ], + [ + [ + [ + -316.065, + 589.275 + ], + [ + -324.475, + 582.333 + ], + [ + -334.026, + 591.494 + ], + [ + -321.322, + 600.486 + ] + ] + ], + [ + [ + [ + -316.991, + 588.51 + ], + [ + -311.786, + 577.409 + ], + [ + -323.645, + 567.622 + ], + [ + -333.282, + 575.064 + ] + ] + ], + [ + [ + [ + -315.637, + 561.438 + ], + [ + -323.645, + 567.622 + ], + [ + -310.766, + 578.252 + ], + [ + -307.701, + 571.715 + ] + ] + ], + [ + [ + [ + -337.15, + 639.836 + ], + [ + -353.636, + 632.106 + ], + [ + -357.881, + 641.16 + ], + [ + -341.395, + 648.89 + ] + ] + ], + [ + [ + [ + -326.733, + 608.47 + ], + [ + -338.616, + 602.899 + ], + [ + -344.138, + 614.675 + ], + [ + -332.255, + 620.247 + ] + ] + ], + [ + [ + [ + -339.563, + 638.705 + ], + [ + -331.151, + 620.765 + ], + [ + -344.138, + 614.675 + ], + [ + -352.55, + 632.616 + ] + ] + ], + [ + [ + [ + -376.182, + 684.819 + ], + [ + -359.625, + 687.77 + ], + [ + -355.714, + 679.43 + ], + [ + -372.364, + 672.889 + ] + ] + ], + [ + [ + [ + -390.965, + 595.322 + ], + [ + -369.354, + 592.327 + ], + [ + -371.151, + 579.359 + ], + [ + -392.762, + 582.354 + ] + ] + ], + [ + [ + [ + -395.494, + 582.733 + ], + [ + -371.151, + 579.359 + ], + [ + -373.048, + 565.674 + ], + [ + -397.391, + 569.048 + ] + ] + ], + [ + [ + [ + -317.032, + 552.426 + ], + [ + -330.805, + 553.358 + ], + [ + -325.381, + 568.963 + ], + [ + -316.44, + 562.058 + ], + [ + -317.374, + 560.848 + ] + ] + ], + [ + [ + [ + -407.799, + 489.61 + ], + [ + -408.37, + 489.835 + ], + [ + -403.854, + 522.42 + ], + [ + -389.362, + 520.411 + ], + [ + -385.028, + 503.554 + ] + ] + ], + [ + [ + [ + -367.263, + 518.221 + ], + [ + -385.87, + 506.827 + ], + [ + -389.362, + 520.411 + ], + [ + -385.267, + 519.844 + ], + [ + -372.896, + 527.419 + ] + ] + ], + [ + [ + [ + -313.698, + 552.201 + ], + [ + -313.501, + 547.355 + ], + [ + -341.284, + 530.342 + ], + [ + -346.379, + 554.412 + ] + ] + ], + [ + [ + [ + -365.576, + 515.466 + ], + [ + -375.4, + 531.508 + ], + [ + -364.062, + 536.831 + ], + [ + -355.779, + 521.465 + ] + ] + ], + [ + [ + [ + 298.039, + 531.092 + ], + [ + 287.051, + 541.201 + ], + [ + 292.996, + 547.664 + ], + [ + 303.985, + 537.555 + ] + ] + ], + [ + [ + [ + 288.864, + 517.652 + ], + [ + 275.362, + 522.01 + ], + [ + 266.397, + 518.369 + ], + [ + 258.886, + 525.085 + ], + [ + 269.358, + 536.468 + ], + [ + 289.298, + 518.124 + ] + ] + ], + [ + [ + [ + 286.104, + 521.062 + ], + [ + 280.259, + 526.44 + ], + [ + 290.727, + 537.819 + ], + [ + 297.216, + 531.849 + ], + [ + 287.021, + 520.766 + ] + ] + ], + [ + [ + [ + 239.702, + 544.652 + ], + [ + 248.773, + 554.512 + ], + [ + 268.913, + 535.984 + ], + [ + 260.104, + 526.409 + ] + ] + ], + [ + [ + [ + 315.845, + 546.979 + ], + [ + 299.169, + 562.32 + ], + [ + 312.773, + 577.107 + ], + [ + 329.448, + 561.766 + ] + ] + ], + [ + [ + [ + 325.796, + 591.264 + ], + [ + 334.364, + 583.381 + ], + [ + 321.341, + 569.225 + ], + [ + 312.773, + 577.107 + ] + ] + ], + [ + [ + [ + 271.952, + 615.48 + ], + [ + 285.74, + 630.468 + ], + [ + 295.266, + 621.704 + ], + [ + 281.478, + 606.717 + ] + ] + ], + [ + [ + [ + 301.014, + 611.297 + ], + [ + 289.776, + 599.082 + ], + [ + 281.478, + 606.717 + ], + [ + 292.715, + 618.931 + ] + ] + ], + [ + [ + [ + 253.77, + 632.207 + ], + [ + 267.558, + 647.195 + ], + [ + 276.978, + 638.529 + ], + [ + 263.19, + 623.541 + ] + ] + ], + [ + [ + [ + 283.492, + 628.025 + ], + [ + 271.952, + 615.48 + ], + [ + 263.19, + 623.541 + ], + [ + 274.73, + 636.086 + ] + ] + ], + [ + [ + [ + 238.483, + 543.328 + ], + [ + 225.783, + 554.684 + ], + [ + 239.083, + 569.141 + ], + [ + 251.62, + 557.607 + ] + ] + ], + [ + [ + [ + 202.008, + 575.942 + ], + [ + 215.239, + 590.325 + ], + [ + 228.912, + 577.746 + ], + [ + 215.859, + 563.557 + ] + ] + ], + [ + [ + [ + 179.412, + 600.101 + ], + [ + 187.283, + 608.656 + ], + [ + 198.223, + 598.592 + ], + [ + 190.495, + 590.192 + ] + ] + ], + [ + [ + [ + 168.541, + 607.764 + ], + [ + 158.389, + 616.842 + ], + [ + 172.889, + 632.604 + ], + [ + 182.91, + 623.384 + ] + ] + ], + [ + [ + [ + 155.371, + 617.643 + ], + [ + 154.559, + 625.229 + ], + [ + 152.5, + 627.209 + ], + [ + 164.643, + 640.19 + ], + [ + 172.889, + 632.604 + ], + [ + 157.431, + 615.801 + ] + ] + ], + [ + [ + [ + 183.552, + 657.085 + ], + [ + 199.996, + 641.956 + ], + [ + 193.059, + 634.415 + ], + [ + 176.551, + 649.602 + ] + ] + ], + [ + [ + [ + 235.408, + 712.521 + ], + [ + 243.892, + 704.716 + ], + [ + 230.213, + 689.846 + ], + [ + 221.605, + 697.765 + ] + ] + ], + [ + [ + [ + 256.304, + 693.297 + ], + [ + 241.741, + 677.467 + ], + [ + 229.329, + 688.886 + ], + [ + 243.892, + 704.716 + ] + ] + ], + [ + [ + [ + 274.001, + 757.097 + ], + [ + 282.051, + 765.702 + ], + [ + 295.166, + 759.428 + ], + [ + 286.993, + 746.553 + ] + ] + ], + [ + [ + [ + 298.876, + 741.904 + ], + [ + 307.134, + 753.702 + ], + [ + 319.538, + 747.768 + ], + [ + 311.691, + 734.388 + ] + ] + ], + [ + [ + [ + 332.613, + 741.513 + ], + [ + 324.148, + 727.081 + ], + [ + 311.691, + 734.388 + ], + [ + 319.538, + 747.768 + ] + ] + ], + [ + [ + [ + 355.547, + 592.817 + ], + [ + 339.92, + 607.193 + ], + [ + 345.93, + 613.727 + ], + [ + 361.557, + 599.35 + ] + ] + ], + [ + [ + [ + 371.195, + 609.997 + ], + [ + 361.472, + 599.428 + ], + [ + 345.93, + 613.727 + ], + [ + 355.653, + 624.296 + ] + ] + ], + [ + [ + [ + 331.731, + 598.292 + ], + [ + 339.92, + 607.193 + ], + [ + 354.344, + 593.923 + ], + [ + 346.155, + 585.022 + ] + ] + ], + [ + [ + [ + 385.14, + 622.302 + ], + [ + 372.617, + 608.69 + ], + [ + 366.64, + 614.188 + ], + [ + 379.163, + 627.8 + ] + ] + ], + [ + [ + [ + 380.271, + 651.055 + ], + [ + 397.234, + 635.449 + ], + [ + 385.14, + 622.302 + ], + [ + 368.176, + 637.908 + ] + ] + ], + [ + [ + [ + 305.449, + 618.858 + ], + [ + 290.088, + 632.99 + ], + [ + 299.525, + 643.248 + ], + [ + 314.886, + 629.117 + ] + ] + ], + [ + [ + [ + 433.97, + 679.377 + ], + [ + 422.841, + 687.516 + ], + [ + 426.739, + 694.296 + ], + [ + 441.291, + 687.335 + ] + ] + ], + [ + [ + [ + 407.186, + 685.773 + ], + [ + 414.997, + 702.099 + ], + [ + 427.725, + 696.01 + ], + [ + 417.712, + 678.597 + ] + ] + ], + [ + [ + [ + 608.075, + 456.322 + ], + [ + 589.102, + 455.436 + ], + [ + 588.901, + 459.73 + ], + [ + 589.398, + 467.792 + ], + [ + 609.637, + 465.439 + ] + ] + ], + [ + [ + [ + 605.746, + 536.643 + ], + [ + 607.25, + 540.341 + ], + [ + 615.13, + 554.966 + ], + [ + 628.904, + 546.551 + ], + [ + 618.826, + 530.053 + ] + ] + ], + [ + [ + [ + 533.859, + 531.176 + ], + [ + 520.107, + 508.664 + ], + [ + 509.786, + 513.735 + ], + [ + 524.087, + 537.146 + ] + ] + ], + [ + [ + [ + 494.769, + 527.05 + ], + [ + 499.759, + 535.218 + ], + [ + 516.618, + 524.919 + ], + [ + 512.02, + 517.393 + ], + [ + 505.867, + 520.416 + ] + ] + ], + [ + [ + [ + 494.231, + 526.169 + ], + [ + 488.177, + 529.787 + ], + [ + 482.915, + 533.549 + ], + [ + 489.126, + 543.715 + ], + [ + 500.65, + 536.675 + ] + ] + ], + [ + [ + [ + 455.359, + 554.754 + ], + [ + 460.253, + 561.534 + ], + [ + 481.059, + 548.824 + ], + [ + 474.859, + 538.675 + ], + [ + 471.545, + 541.044 + ] + ] + ], + [ + [ + [ + 439.686, + 565.691 + ], + [ + 449.63, + 579.193 + ], + [ + 454.995, + 575.321 + ], + [ + 443.945, + 561.774 + ] + ] + ], + [ + [ + [ + 428.803, + 652.427 + ], + [ + 435.846, + 645.947 + ], + [ + 423.116, + 632.109 + ], + [ + 416.072, + 638.589 + ] + ] + ], + [ + [ + [ + 405.672, + 596.984 + ], + [ + 387.824, + 613.404 + ], + [ + 396.713, + 623.066 + ], + [ + 414.561, + 606.646 + ] + ] + ], + [ + [ + [ + 467.86, + 673.056 + ], + [ + 478.604, + 666.493 + ], + [ + 469.247, + 652.918 + ], + [ + 458.769, + 661.023 + ] + ] + ], + [ + [ + [ + 453.181, + 449.692 + ], + [ + 433.235, + 465.658 + ], + [ + 442.37, + 477.071 + ], + [ + 462.48, + 462.752 + ] + ] + ], + [ + [ + [ + 461.946, + 495.891 + ], + [ + 475.039, + 487.599 + ], + [ + 466.834, + 474.574 + ], + [ + 452.242, + 483.767 + ] + ] + ], + [ + [ + [ + 473.163, + 512.094 + ], + [ + 478.281, + 508.852 + ], + [ + 467.747, + 492.218 + ], + [ + 460.783, + 496.628 + ] + ] + ], + [ + [ + [ + 502.475, + 508.894 + ], + [ + 496.717, + 497.177 + ], + [ + 473.199, + 512.071 + ], + [ + 481.176, + 522.036 + ], + [ + 484.686, + 519.526 + ] + ] + ], + [ + [ + [ + 434.92, + 464.308 + ], + [ + 451.662, + 450.909 + ], + [ + 442.684, + 439.692 + ], + [ + 425.943, + 453.092 + ] + ] + ], + [ + [ + [ + 404.335, + 429.552 + ], + [ + 417.636, + 446.169 + ], + [ + 425.63, + 439.77 + ], + [ + 412.33, + 423.153 + ] + ] + ], + [ + [ + [ + 441.319, + 387.94 + ], + [ + 431.244, + 385.803 + ], + [ + 429.199, + 395.445 + ], + [ + 436.13, + 404.104 + ], + [ + 438.251, + 402.406 + ] + ] + ], + [ + [ + [ + 405.709, + 428.453 + ], + [ + 425.342, + 412.739 + ], + [ + 417.324, + 402.722 + ], + [ + 397.691, + 418.436 + ] + ] + ], + [ + [ + [ + 388.23, + 409.431 + ], + [ + 396.318, + 419.535 + ], + [ + 403.908, + 413.46 + ], + [ + 395.489, + 402.941 + ] + ] + ], + [ + [ + [ + 508.683, + 405.025 + ], + [ + 506.267, + 416.42 + ], + [ + 519.783, + 419.287 + ], + [ + 522.2, + 407.892 + ] + ] + ], + [ + [ + [ + 503.696, + 511.38 + ], + [ + 520.263, + 503.239 + ], + [ + 513.822, + 486.864 + ], + [ + 495.241, + 494.172 + ] + ] + ], + [ + [ + [ + 540.947, + 491.258 + ], + [ + 534.432, + 474.694 + ], + [ + 523.981, + 478.804 + ], + [ + 530.492, + 495.358 + ], + [ + 540.82, + 491.296 + ] + ] + ], + [ + [ + [ + 519.343, + 500.901 + ], + [ + 521.66, + 499.763 + ], + [ + 530.809, + 496.164 + ], + [ + 523.981, + 478.804 + ], + [ + 512.438, + 483.344 + ] + ] + ], + [ + [ + [ + 584.094, + 459.765 + ], + [ + 584.235, + 456.754 + ], + [ + 563.387, + 454.062 + ], + [ + 564.015, + 467.666 + ], + [ + 584.523, + 466.719 + ] + ] + ], + [ + [ + [ + 542.166, + 494.36 + ], + [ + 543.345, + 493.896 + ], + [ + 554.748, + 490.46 + ], + [ + 551.806, + 478.428 + ], + [ + 537.663, + 482.911 + ] + ] + ], + [ + [ + [ + 455.842, + 539.158 + ], + [ + 441.408, + 523.469 + ], + [ + 430.265, + 533.721 + ], + [ + 444.33, + 549.009 + ], + [ + 445.701, + 547.748 + ] + ] + ], + [ + [ + [ + 438.681, + 485.937 + ], + [ + 430.182, + 493.756 + ], + [ + 441.299, + 505.839 + ], + [ + 448.966, + 498.786 + ] + ] + ], + [ + [ + [ + 468.403, + 520.083 + ], + [ + 451.062, + 533.963 + ], + [ + 457.161, + 540.593 + ], + [ + 463.901, + 534.884 + ], + [ + 474.299, + 527.449 + ] + ] + ], + [ + [ + [ + 429.569, + 472.284 + ], + [ + 423.441, + 477.921 + ], + [ + 434.421, + 489.856 + ], + [ + 439.727, + 484.975 + ] + ] + ], + [ + [ + [ + 384.574, + 609.871 + ], + [ + 394.071, + 601.134 + ], + [ + 387.253, + 593.723 + ], + [ + 377.756, + 602.46 + ] + ] + ], + [ + [ + [ + 375.942, + 581.428 + ], + [ + 366.445, + 590.165 + ], + [ + 377.756, + 602.46 + ], + [ + 387.253, + 593.723 + ] + ] + ], + [ + [ + [ + 368.744, + 588.05 + ], + [ + 380.236, + 577.478 + ], + [ + 369.611, + 565.929 + ], + [ + 358.12, + 576.501 + ] + ] + ], + [ + [ + [ + 351.489, + 567.615 + ], + [ + 358.956, + 575.731 + ], + [ + 369.611, + 565.929 + ], + [ + 362.144, + 557.813 + ] + ] + ], + [ + [ + [ + 348.353, + 570.5 + ], + [ + 363.199, + 556.843 + ], + [ + 354.172, + 547.03 + ], + [ + 339.326, + 560.688 + ] + ] + ], + [ + [ + [ + 341.744, + 558.463 + ], + [ + 346.728, + 553.878 + ], + [ + 333.505, + 539.504 + ], + [ + 328.521, + 544.09 + ] + ] + ], + [ + [ + [ + 418.355, + 461.445 + ], + [ + 410.622, + 451.783 + ], + [ + 397.668, + 463.7 + ], + [ + 406.027, + 472.786 + ] + ] + ], + [ + [ + [ + 406.23, + 439.601 + ], + [ + 389.585, + 454.914 + ], + [ + 397.668, + 463.7 + ], + [ + 413.708, + 448.943 + ] + ] + ], + [ + [ + [ + 394.131, + 429.108 + ], + [ + 388.087, + 434.668 + ], + [ + 398.861, + 446.38 + ], + [ + 404.099, + 441.562 + ] + ] + ], + [ + [ + [ + 367.024, + 432.254 + ], + [ + 377.882, + 444.056 + ], + [ + 387.813, + 434.92 + ], + [ + 377.085, + 423.258 + ] + ] + ], + [ + [ + [ + 369.425, + 453.404 + ], + [ + 355.717, + 438.503 + ], + [ + 350.476, + 443.189 + ], + [ + 364.252, + 458.163 + ] + ] + ], + [ + [ + [ + 326.468, + 467.424 + ], + [ + 336.293, + 478.104 + ], + [ + 349.855, + 465.627 + ], + [ + 340.207, + 455.139 + ] + ] + ], + [ + [ + [ + 307.25, + 481.84 + ], + [ + 319.52, + 495.177 + ], + [ + 328.569, + 486.851 + ], + [ + 316.418, + 473.643 + ] + ] + ], + [ + [ + [ + 311.087, + 525.743 + ], + [ + 330.884, + 507.53 + ], + [ + 324.625, + 500.727 + ], + [ + 304.828, + 518.94 + ] + ] + ], + [ + [ + [ + 301.74, + 505.121 + ], + [ + 305.706, + 507.253 + ], + [ + 317.173, + 492.626 + ], + [ + 308.779, + 483.502 + ], + [ + 301.248, + 490.237 + ] + ] + ], + [ + [ + [ + 303.835, + 519.853 + ], + [ + 313.17, + 511.265 + ], + [ + 301.143, + 504.8 + ], + [ + 301.167, + 505.524 + ], + [ + 296.328, + 511.694 + ] + ] + ], + [ + [ + [ + 328.118, + 544.46 + ], + [ + 344.37, + 529.509 + ], + [ + 338.473, + 523.099 + ], + [ + 322.221, + 538.051 + ] + ] + ], + [ + [ + [ + 322.631, + 537.673 + ], + [ + 330.544, + 530.394 + ], + [ + 319.308, + 518.181 + ], + [ + 311.395, + 525.46 + ] + ] + ], + [ + [ + [ + 784.41, + 141.319 + ], + [ + 786.966, + 152.461 + ], + [ + 789.588, + 160.817 + ], + [ + 799.488, + 157.711 + ], + [ + 793.455, + 138.481 + ] + ] + ], + [ + [ + [ + 812.565, + 95.72 + ], + [ + 816.109, + 78.711 + ], + [ + 803.893, + 74.609 + ], + [ + 798.944, + 92.882 + ] + ] + ], + [ + [ + [ + 820.334, + 133.703 + ], + [ + 825.323, + 149.606 + ], + [ + 842.517, + 144.212 + ], + [ + 837.528, + 128.308 + ] + ] + ], + [ + [ + [ + 762.16, + 169.422 + ], + [ + 785.008, + 162.254 + ], + [ + 782.33, + 153.718 + ], + [ + 780.742, + 146.795 + ], + [ + 757.941, + 152.468 + ] + ] + ], + [ + [ + [ + 700.627, + 169.32 + ], + [ + 707.52, + 186.565 + ], + [ + 727.89, + 180.174 + ], + [ + 720.609, + 160.647 + ] + ] + ], + [ + [ + [ + 656.837, + 117.057 + ], + [ + 650.77, + 120.201 + ], + [ + 651.956, + 122.491 + ], + [ + 650.254, + 130.104 + ], + [ + 662.465, + 127.917 + ] + ] + ], + [ + [ + [ + 706.487, + 183.98 + ], + [ + 702.783, + 174.713 + ], + [ + 684.985, + 181.828 + ], + [ + 687.527, + 189.929 + ] + ] + ], + [ + [ + [ + 687.551, + 190.007 + ], + [ + 684.455, + 180.138 + ], + [ + 667.837, + 185.351 + ], + [ + 670.934, + 195.221 + ] + ] + ], + [ + [ + [ + 638.413, + 205.879 + ], + [ + 647.664, + 202.976 + ], + [ + 642.933, + 187.897 + ], + [ + 633.437, + 190.02 + ] + ] + ], + [ + [ + [ + 624.494, + 211.029 + ], + [ + 621.079, + 200.146 + ], + [ + 611.483, + 199.514 + ], + [ + 605.36, + 216.014 + ], + [ + 605.875, + 216.87 + ] + ] + ], + [ + [ + [ + 619.24, + 178.226 + ], + [ + 611.343, + 199.505 + ], + [ + 621.079, + 200.146 + ], + [ + 620.397, + 197.969 + ], + [ + 624.27, + 179.268 + ] + ] + ], + [ + [ + [ + 633.91, + 148.418 + ], + [ + 628.938, + 148.192 + ], + [ + 623.192, + 163.675 + ], + [ + 633.126, + 165.653 + ] + ] + ], + [ + [ + [ + 654.136, + 86.964 + ], + [ + 665.875, + 91.32 + ], + [ + 665.997, + 91.555 + ], + [ + 677.723, + 79.74 + ], + [ + 659.347, + 72.921 + ] + ] + ], + [ + [ + [ + 654.528, + 87.109 + ], + [ + 650.128, + 98.963 + ], + [ + 660.972, + 102.987 + ], + [ + 665.844, + 112.389 + ], + [ + 674.476, + 107.915 + ], + [ + 665.875, + 91.32 + ] + ] + ], + [ + [ + [ + 694.703, + 40.733 + ], + [ + 681.572, + 36.323 + ], + [ + 676.328, + 55.069 + ], + [ + 689.65, + 58.796 + ] + ] + ], + [ + [ + [ + 666.928, + 52.439 + ], + [ + 676.328, + 55.069 + ], + [ + 681.49, + 36.618 + ], + [ + 678.799, + 35.715 + ], + [ + 674.606, + 41.377 + ], + [ + 670.684, + 42.317 + ] + ] + ], + [ + [ + [ + 662.119, + 63.77 + ], + [ + 670.585, + 66.138 + ], + [ + 673.874, + 54.383 + ], + [ + 666.38, + 52.286 + ] + ] + ], + [ + [ + [ + 684.173, + 340.884 + ], + [ + 671.69, + 345.32 + ], + [ + 673.235, + 349.669 + ], + [ + 678.803, + 347.691 + ], + [ + 680.09, + 351.313 + ], + [ + 692.784, + 346.803 + ], + [ + 691.497, + 343.181 + ], + [ + 685.718, + 345.234 + ] + ] + ], + [ + [ + [ + 818.491, + 220.732 + ], + [ + 811.945, + 203.5 + ], + [ + 802.469, + 207.099 + ], + [ + 804.965, + 213.67 + ], + [ + 809.575, + 211.919 + ], + [ + 811.467, + 216.899 + ], + [ + 806.857, + 218.651 + ], + [ + 809.016, + 224.332 + ] + ] + ], + [ + [ + [ + 1230.259, + -191.422 + ], + [ + 1213.121, + -189.016 + ], + [ + 1214.666, + -178.012 + ], + [ + 1220.361, + -178.812 + ], + [ + 1219.761, + -183.088 + ], + [ + 1231.204, + -184.695 + ] + ] + ], + [ + [ + [ + 1330.808, + -106.015 + ], + [ + 1333.165, + -88.225 + ], + [ + 1341.627, + -89.346 + ], + [ + 1340.728, + -96.13 + ], + [ + 1336.612, + -95.584 + ], + [ + 1335.931, + -100.726 + ], + [ + 1340.047, + -101.271 + ], + [ + 1339.27, + -107.136 + ] + ] + ], + [ + [ + [ + 1272.069, + -228.083 + ], + [ + 1268.58, + -209.852 + ], + [ + 1278.978, + -207.862 + ], + [ + 1282.467, + -226.094 + ] + ] + ], + [ + [ + [ + 1192.387, + -363.602 + ], + [ + 1175.128, + -364.594 + ], + [ + 1174.782, + -358.587 + ], + [ + 1180.319, + -358.269 + ], + [ + 1180.03, + -353.24 + ], + [ + 1185.923, + -352.901 + ], + [ + 1186.212, + -357.93 + ], + [ + 1192.041, + -357.595 + ] + ] + ], + [ + [ + [ + 1268.404, + -367.246 + ], + [ + 1285.125, + -366.285 + ], + [ + 1285.748, + -377.131 + ], + [ + 1275.022, + -377.747 + ], + [ + 1274.682, + -371.83 + ], + [ + 1268.687, + -372.175 + ] + ] + ], + [ + [ + [ + 1247.856, + -447.924 + ], + [ + 1265.934, + -444.464 + ], + [ + 1266.67, + -448.313 + ], + [ + 1259.555, + -449.675 + ], + [ + 1260.525, + -454.746 + ], + [ + 1249.563, + -456.844 + ] + ] + ], + [ + [ + [ + 1375.799, + -428.73 + ], + [ + 1378.763, + -447.443 + ], + [ + 1373.698, + -448.245 + ], + [ + 1372.605, + -441.341 + ], + [ + 1366.749, + -442.268 + ], + [ + 1365.988, + -437.462 + ], + [ + 1371.843, + -436.535 + ], + [ + 1370.734, + -429.532 + ] + ] + ] + ] + }, + { + "type": "MultiPolygon", + "id": "prisms", + "coordinates": [ + [ + [ + [ + 5.001, + 21.778 + ], + [ + 8.85, + 17.137 + ], + [ + 3.424, + 12.637 + ], + [ + -0.425, + 17.278 + ] + ] + ] + ] + }, + { + "type": "MultiPolygon", + "id": "squares", + "coordinates": [ + [ + [ + [ + -16.581, + 62.617 + ], + [ + 50.273, + -17.998 + ], + [ + 1.2, + -17.644 + ], + [ + -55.147, + 5.195 + ] + ] + ] + ] + }, + { + "type": "MultiPolygon", + "id": "greens", + "coordinates": [] + }, + { + "type": "MultiPolygon", + "id": "fields", + "coordinates": [ + [ + [ + [ + 599.327, + 316.15 + ], + [ + 608.904, + 270.992 + ], + [ + 607.355, + 261.418 + ], + [ + 598.218, + 245.818 + ], + [ + 591.484, + 244.522 + ], + [ + 524.275, + 296.735 + ], + [ + 525.185, + 301.294 + ], + [ + 593.232, + 319.868 + ] + ] + ], + [ + [ + [ + 665.365, + 360.458 + ], + [ + 618.615, + 280.642 + ], + [ + 614.908, + 281.242 + ], + [ + 588.188, + 407.234 + ], + [ + 591.597, + 409.693 + ], + [ + 663.507, + 367.573 + ] + ] + ], + [ + [ + [ + 946.593, + 175.752 + ], + [ + 962.29, + 217.07 + ], + [ + 968.998, + 220.084 + ], + [ + 1042.714, + 192.079 + ], + [ + 1046.889, + 185.078 + ], + [ + 1043.818, + 162.012 + ], + [ + 1037.984, + 157.591 + ], + [ + 949.894, + 170.156 + ] + ] + ], + [ + [ + [ + 1054.233, + 240.242 + ], + [ + 1049.346, + 203.533 + ], + [ + 1043.798, + 200.225 + ], + [ + 950.982, + 235.487 + ], + [ + 947.967, + 242.194 + ], + [ + 960.673, + 275.639 + ], + [ + 967.381, + 278.653 + ], + [ + 1050.058, + 247.244 + ] + ] + ], + [ + [ + [ + 959.67, + 295.525 + ], + [ + 940.489, + 245.035 + ], + [ + 933.781, + 242.021 + ], + [ + 852.44, + 272.923 + ], + [ + 849.425, + 279.631 + ], + [ + 866.607, + 324.858 + ], + [ + 873.414, + 328.156 + ], + [ + 956.558, + 301.949 + ] + ] + ], + [ + [ + [ + 864.087, + 340.749 + ], + [ + 844.582, + 289.409 + ], + [ + 837.835, + 286.289 + ], + [ + 767.728, + 311.198 + ], + [ + 764.019, + 318 + ], + [ + 776.012, + 369.005 + ], + [ + 782.154, + 372.479 + ], + [ + 860.982, + 347.198 + ] + ] + ], + [ + [ + [ + 766.707, + 364.382 + ], + [ + 756.434, + 320.695 + ], + [ + 750.344, + 317.374 + ], + [ + 671.69, + 345.32 + ], + [ + 669.418, + 351.548 + ], + [ + 692.43, + 390.837 + ], + [ + 699.958, + 393.583 + ], + [ + 762.997, + 371.185 + ] + ] + ], + [ + [ + [ + 644.666, + 309.29 + ], + [ + 660.045, + 335.546 + ], + [ + 667.573, + 338.292 + ], + [ + 733.682, + 314.804 + ], + [ + 736.841, + 308.163 + ], + [ + 724.203, + 272.594 + ], + [ + 717.741, + 269.873 + ], + [ + 646.76, + 302.624 + ] + ] + ], + [ + [ + [ + 798.765, + 291.68 + ], + [ + 834.994, + 278.808 + ], + [ + 838.047, + 272.206 + ], + [ + 811.945, + 203.5 + ], + [ + 805.546, + 201.153 + ], + [ + 774.037, + 218.561 + ], + [ + 771.146, + 226.003 + ], + [ + 792.204, + 288.494 + ] + ] + ], + [ + [ + [ + 757.816, + 227.522 + ], + [ + 727.98, + 244.005 + ], + [ + 725.17, + 251.419 + ], + [ + 744.379, + 305.485 + ], + [ + 751.02, + 308.644 + ], + [ + 781.426, + 297.841 + ], + [ + 784.665, + 291.172 + ], + [ + 764.029, + 229.935 + ] + ] + ], + [ + [ + [ + 1216.554, + -123.512 + ], + [ + 1223.161, + -73.65 + ], + [ + 1228.998, + -69.178 + ], + [ + 1320.762, + -81.336 + ], + [ + 1325.234, + -87.174 + ], + [ + 1318.628, + -137.036 + ], + [ + 1312.79, + -141.508 + ], + [ + 1221.026, + -129.35 + ] + ] + ], + [ + [ + [ + 1316.211, + -155.277 + ], + [ + 1310.623, + -197.456 + ], + [ + 1304.79, + -201.888 + ], + [ + 1213.121, + -189.016 + ], + [ + 1208.655, + -183.137 + ], + [ + 1214.138, + -141.753 + ], + [ + 1219.976, + -137.281 + ], + [ + 1311.739, + -149.439 + ] + ] + ], + [ + [ + [ + 1376.96, + -158.816 + ], + [ + 1328.983, + -159.016 + ], + [ + 1324.466, + -153.883 + ], + [ + 1333.165, + -88.225 + ], + [ + 1339.003, + -83.753 + ], + [ + 1386.031, + -89.984 + ], + [ + 1390.503, + -95.821 + ], + [ + 1382.843, + -153.64 + ] + ] + ], + [ + [ + [ + 1342.545, + -14.921 + ], + [ + 1331.187, + -69.416 + ], + [ + 1324.971, + -73.824 + ], + [ + 1230.049, + -61.248 + ], + [ + 1225.577, + -55.41 + ], + [ + 1232.402, + -3.898 + ], + [ + 1238.259, + 0.738 + ], + [ + 1338.432, + -9.311 + ] + ] + ], + [ + [ + [ + 1027.573, + 55.445 + ], + [ + 1043.106, + 106.882 + ], + [ + 1049.764, + 111.171 + ], + [ + 1133.654, + 99.961 + ], + [ + 1138.12, + 94.118 + ], + [ + 1131.112, + 41.676 + ], + [ + 1125.269, + 37.211 + ], + [ + 1031.224, + 49.778 + ] + ] + ], + [ + [ + [ + 1128.675, + 23.439 + ], + [ + 1124.543, + -7.486 + ], + [ + 1118.897, + -11.069 + ], + [ + 1022.179, + 19.595 + ], + [ + 1018.725, + 26.144 + ], + [ + 1022.224, + 37.731 + ], + [ + 1028.881, + 42.02 + ], + [ + 1124.209, + 29.281 + ] + ] + ], + [ + [ + [ + 1140.741, + 53.338 + ], + [ + 1146.049, + 93.058 + ], + [ + 1151.892, + 97.524 + ], + [ + 1231.121, + 86.936 + ], + [ + 1235.593, + 81.093 + ], + [ + 1230.329, + 41.367 + ], + [ + 1224.492, + 36.9 + ], + [ + 1145.207, + 47.495 + ] + ] + ], + [ + [ + [ + 1227.913, + 23.126 + ], + [ + 1219.853, + -37.704 + ], + [ + 1214.213, + -41.288 + ], + [ + 1136.554, + -16.667 + ], + [ + 1132.286, + -9.941 + ], + [ + 1138.304, + 35.1 + ], + [ + 1144.147, + 39.566 + ], + [ + 1223.441, + 28.97 + ] + ] + ], + [ + [ + [ + 1111.547, + -65.164 + ], + [ + 1123.813, + -26.475 + ], + [ + 1130.341, + -23.09 + ], + [ + 1213.146, + -49.342 + ], + [ + 1217.42, + -56.068 + ], + [ + 1209.737, + -114.058 + ], + [ + 1204.395, + -116.905 + ], + [ + 1114.635, + -72.43 + ] + ] + ], + [ + [ + [ + 1056.333, + 195.398 + ], + [ + 1063.645, + 250.324 + ], + [ + 1069.37, + 254.193 + ], + [ + 1172.177, + 227.981 + ], + [ + 1175.931, + 221.657 + ], + [ + 1162.352, + 168.403 + ], + [ + 1156.029, + 164.649 + ], + [ + 1060.686, + 188.959 + ] + ] + ], + [ + [ + [ + 1157.806, + 150.573 + ], + [ + 1147.806, + 111.351 + ], + [ + 1141.367, + 107.001 + ], + [ + 1051.412, + 119.022 + ], + [ + 1046.944, + 124.865 + ], + [ + 1053.898, + 177.104 + ], + [ + 1059.623, + 180.974 + ], + [ + 1154.052, + 156.897 + ] + ] + ], + [ + [ + [ + 1176.029, + 189.664 + ], + [ + 1183.718, + 219.819 + ], + [ + 1190.08, + 223.733 + ], + [ + 1256.791, + 208.962 + ], + [ + 1260.744, + 202.76 + ], + [ + 1250.955, + 158.555 + ], + [ + 1245.028, + 155.471 + ], + [ + 1179.548, + 182.632 + ] + ] + ], + [ + [ + [ + 1246.951, + 140.469 + ], + [ + 1237.843, + 99.337 + ], + [ + 1231.564, + 94.948 + ], + [ + 1159.659, + 104.557 + ], + [ + 1155.79, + 110.284 + ], + [ + 1171.463, + 171.753 + ], + [ + 1177.551, + 174.8 + ], + [ + 1243.272, + 147.538 + ] + ] + ], + [ + [ + [ + 1388.37, + -349.379 + ], + [ + 1399.118, + -405.535 + ], + [ + 1394.988, + -411.62 + ], + [ + 1315.405, + -426.851 + ], + [ + 1309.32, + -422.721 + ], + [ + 1298.572, + -366.565 + ], + [ + 1302.702, + -360.48 + ], + [ + 1382.286, + -345.25 + ] + ] + ], + [ + [ + [ + 1295.114, + -348.493 + ], + [ + 1287.966, + -311.148 + ], + [ + 1292.096, + -305.064 + ], + [ + 1371.68, + -289.833 + ], + [ + 1377.765, + -293.963 + ], + [ + 1384.912, + -331.307 + ], + [ + 1380.782, + -337.392 + ], + [ + 1301.198, + -352.623 + ] + ] + ], + [ + [ + [ + 1357.394, + -284.422 + ], + [ + 1290.593, + -297.206 + ], + [ + 1284.508, + -293.076 + ], + [ + 1268.58, + -209.852 + ], + [ + 1272.752, + -205.468 + ], + [ + 1344.494, + -215.542 + ], + [ + 1350.621, + -221.372 + ], + [ + 1361.523, + -278.337 + ] + ] + ], + [ + [ + [ + 1168.959, + -359.785 + ], + [ + 1164.779, + -337.948 + ], + [ + 1168.968, + -332.245 + ], + [ + 1276.213, + -319.881 + ], + [ + 1282.356, + -324.393 + ], + [ + 1287.822, + -352.953 + ], + [ + 1283.608, + -358.359 + ], + [ + 1175.128, + -364.594 + ] + ] + ], + [ + [ + [ + 1291.294, + -371.094 + ], + [ + 1301.462, + -424.225 + ], + [ + 1297.333, + -430.31 + ], + [ + 1191.622, + -450.541 + ], + [ + 1185.538, + -446.411 + ], + [ + 1172.431, + -377.926 + ], + [ + 1176.645, + -372.52 + ], + [ + 1285.125, + -366.285 + ] + ] + ], + [ + [ + [ + 1208.844, + -250.322 + ], + [ + 1260.976, + -240.345 + ], + [ + 1267.061, + -244.475 + ], + [ + 1278.893, + -306.299 + ], + [ + 1274.705, + -312.002 + ], + [ + 1221.801, + -318.101 + ], + [ + 1215.658, + -313.589 + ], + [ + 1204.714, + -256.407 + ] + ] + ], + [ + [ + [ + 1203.5, + -320.211 + ], + [ + 1167.46, + -324.366 + ], + [ + 1161.317, + -319.854 + ], + [ + 1151.136, + -266.661 + ], + [ + 1155.266, + -260.576 + ], + [ + 1190.772, + -253.781 + ], + [ + 1196.857, + -257.911 + ], + [ + 1207.689, + -314.508 + ] + ] + ], + [ + [ + [ + 1096.57, + -350.309 + ], + [ + 1151.687, + -339.761 + ], + [ + 1157.772, + -343.891 + ], + [ + 1177.68, + -447.915 + ], + [ + 1173.55, + -454 + ], + [ + 1138.376, + -460.732 + ], + [ + 1131.427, + -456.846 + ], + [ + 1093.304, + -356.15 + ] + ] + ], + [ + [ + [ + 1100.876, + -702.687 + ], + [ + 1112.386, + -657.316 + ], + [ + 1118.575, + -653.986 + ], + [ + 1168.761, + -671.467 + ], + [ + 1174.911, + -678.228 + ], + [ + 1186.369, + -724.898 + ], + [ + 1182.567, + -728.675 + ], + [ + 1104.64, + -709 + ] + ] + ], + [ + [ + [ + 1133.923, + -581.534 + ], + [ + 1147.875, + -586.394 + ], + [ + 1154.025, + -593.155 + ], + [ + 1170.157, + -658.864 + ], + [ + 1166.487, + -662.204 + ], + [ + 1113.304, + -643.679 + ], + [ + 1110.03, + -637.033 + ], + [ + 1127.374, + -584.759 + ] + ] + ], + [ + [ + [ + 1210.778, + -514.537 + ], + [ + 1151.493, + -527.487 + ], + [ + 1145.173, + -523.547 + ], + [ + 1133.288, + -475.138 + ], + [ + 1137.156, + -469.11 + ], + [ + 1200.395, + -457.007 + ], + [ + 1206.425, + -461.147 + ], + [ + 1214.935, + -508.31 + ] + ] + ], + [ + [ + [ + 1218.467, + -453.549 + ], + [ + 1265.934, + -444.464 + ], + [ + 1270.932, + -448.686 + ], + [ + 1269.93, + -496.441 + ], + [ + 1264.74, + -502.749 + ], + [ + 1228.759, + -510.609 + ], + [ + 1222.755, + -506.602 + ], + [ + 1214.283, + -459.644 + ] + ] + ], + [ + [ + [ + 1226.861, + -600.764 + ], + [ + 1172.053, + -611.254 + ], + [ + 1165.706, + -607.181 + ], + [ + 1149.561, + -541.419 + ], + [ + 1153.401, + -535.259 + ], + [ + 1203.326, + -524.353 + ], + [ + 1209.936, + -528.214 + ], + [ + 1230.438, + -594.817 + ] + ] + ], + [ + [ + [ + 1221.33, + -520.421 + ], + [ + 1264.568, + -510.976 + ], + [ + 1269.539, + -515.065 + ], + [ + 1268.014, + -587.71 + ], + [ + 1262.798, + -593.887 + ], + [ + 1244.98, + -597.297 + ], + [ + 1238.343, + -593.304 + ], + [ + 1217.779, + -526.5 + ] + ] + ], + [ + [ + [ + 1381.694, + -499.181 + ], + [ + 1350.942, + -503.857 + ], + [ + 1344.824, + -499.532 + ], + [ + 1332.847, + -436.953 + ], + [ + 1336.977, + -430.868 + ], + [ + 1369.878, + -424.571 + ], + [ + 1375.799, + -428.73 + ], + [ + 1386.021, + -493.264 + ] + ] + ], + [ + [ + [ + 1341.349, + -523.935 + ], + [ + 1350.511, + -571.805 + ], + [ + 1346.381, + -577.89 + ], + [ + 1281.046, + -590.394 + ], + [ + 1276.048, + -586.173 + ], + [ + 1277.107, + -535.727 + ], + [ + 1282.329, + -529.581 + ], + [ + 1335.259, + -519.775 + ] + ] + ], + [ + [ + [ + 1277.497, + -517.162 + ], + [ + 1278.966, + -447.148 + ], + [ + 1284.182, + -440.972 + ], + [ + 1318.905, + -434.326 + ], + [ + 1324.99, + -438.456 + ], + [ + 1337.891, + -505.863 + ], + [ + 1333.755, + -511.918 + ], + [ + 1282.5, + -521.413 + ] + ] + ], + [ + [ + [ + 1201.143, + -751.519 + ], + [ + 1187.601, + -696.363 + ], + [ + 1191.411, + -690.073 + ], + [ + 1285.276, + -667.028 + ], + [ + 1290.986, + -670.946 + ], + [ + 1298.246, + -727.713 + ], + [ + 1293.856, + -734.111 + ], + [ + 1207.432, + -755.329 + ] + ] + ], + [ + [ + [ + 1300.587, + -746.016 + ], + [ + 1301.094, + -749.977 + ], + [ + 1297.048, + -757.349 + ], + [ + 1217.062, + -794.982 + ], + [ + 1211.117, + -792.145 + ], + [ + 1205.53, + -769.388 + ], + [ + 1209.34, + -763.098 + ], + [ + 1294.877, + -742.098 + ] + ] + ], + [ + [ + [ + 1183.214, + -678.493 + ], + [ + 1170.096, + -625.061 + ], + [ + 1173.963, + -619.033 + ], + [ + 1276.602, + -599.39 + ], + [ + 1282.369, + -603.57 + ], + [ + 1288.645, + -652.643 + ], + [ + 1284.255, + -659.041 + ], + [ + 1189.504, + -682.304 + ] + ] + ], + [ + [ + [ + 1373.456, + -659.289 + ], + [ + 1369.242, + -718.37 + ], + [ + 1364.167, + -725.771 + ], + [ + 1314.066, + -749.342 + ], + [ + 1308.701, + -746.398 + ], + [ + 1298.795, + -668.94 + ], + [ + 1303.293, + -663.123 + ], + [ + 1368.668, + -654.762 + ] + ] + ], + [ + [ + [ + 1296.461, + -650.689 + ], + [ + 1290.242, + -602.064 + ], + [ + 1294.689, + -595.928 + ], + [ + 1374.02, + -580.745 + ], + [ + 1378.758, + -584.955 + ], + [ + 1374.776, + -640.776 + ], + [ + 1369.248, + -646.622 + ], + [ + 1302.278, + -655.187 + ] + ] + ] + ] + }, + { + "type": "MultiPoint", + "id": "trees", + "coordinates": [] + }, + { + "type": "GeometryCollection", + "id": "districts", + "geometries": [ + { + "type": "Polygon", + "name": "Old Ward", + "coordinates": [ + [ + [ + -111.88, + 48.224 + ], + [ + -42.127, + 104.255 + ], + [ + -16.581, + 62.617 + ], + [ + 28.534, + 116.457 + ], + [ + 93.878, + -18.891 + ], + [ + 50.273, + -17.998 + ], + [ + 1.2, + -17.644 + ], + [ + -55.147, + 5.195 + ] + ] + ] + }, + { + "type": "Polygon", + "name": "Dark Fair", + "coordinates": [ + [ + [ + -341.156, + 271.788 + ], + [ + -202.743, + 400.002 + ], + [ + -104.837, + 515.157 + ], + [ + -62.779, + 594.559 + ], + [ + -39.228, + 705.454 + ], + [ + 141.269, + 618.716 + ], + [ + 276.245, + 498.027 + ], + [ + 238.573, + 420.712 + ], + [ + 195.029, + 360.774 + ], + [ + 143.639, + 306.912 + ], + [ + 160.651, + 225.583 + ], + [ + 158.695, + 145.406 + ], + [ + 133.393, + 64.39 + ], + [ + 93.878, + -18.891 + ], + [ + 28.534, + 116.457 + ], + [ + -16.581, + 62.617 + ], + [ + -42.127, + 104.255 + ], + [ + -111.88, + 48.224 + ], + [ + -168.919, + 107.219 + ], + [ + -243.555, + 186.018 + ] + ] + ] + }, + { + "type": "Polygon", + "name": "Woolgate", + "coordinates": [ + [ + [ + -531.758, + 378.633 + ], + [ + -412.632, + 476.566 + ], + [ + -376.936, + 734.112 + ], + [ + -225.928, + 756.573 + ], + [ + -143.402, + 716.711 + ], + [ + -191.193, + 608.982 + ], + [ + -104.837, + 515.157 + ], + [ + -202.743, + 400.002 + ], + [ + -341.156, + 271.788 + ], + [ + -440.869, + 336.053 + ] + ] + ] + }, + { + "type": "Polygon", + "name": "Castle", + "coordinates": [ + [ + [ + -104.837, + 515.157 + ], + [ + -191.193, + 608.982 + ], + [ + -143.402, + 716.711 + ], + [ + -39.228, + 705.454 + ], + [ + -62.779, + 594.559 + ] + ] + ] + }, + { + "type": "Polygon", + "name": "Blue Pass", + "coordinates": [ + [ + [ + 93.878, + -18.891 + ], + [ + 133.393, + 64.39 + ], + [ + 158.695, + 145.406 + ], + [ + 160.651, + 225.583 + ], + [ + 143.639, + 306.912 + ], + [ + 195.029, + 360.774 + ], + [ + 238.573, + 420.712 + ], + [ + 276.245, + 498.027 + ], + [ + 411.221, + 377.338 + ], + [ + 505.386, + 292.161 + ], + [ + 521.375, + 103.332 + ], + [ + 544.473, + -88.385 + ], + [ + 436.525, + -76.675 + ], + [ + 354.854, + -41.962 + ], + [ + 304.283, + 7.282 + ], + [ + 262.433, + 31.316 + ], + [ + 216.258, + 12.737 + ], + [ + 172.912, + -22.207 + ], + [ + 134.174, + -30.744 + ] + ] + ] + }, + { + "type": "Polygon", + "name": "Free Road", + "coordinates": [ + [ + [ + 505.386, + 292.161 + ], + [ + 591.028, + 225.628 + ], + [ + 937.476, + 116.935 + ], + [ + 665.285, + 25.532 + ], + [ + 654.54, + -118.738 + ], + [ + 544.473, + -88.385 + ], + [ + 521.375, + 103.332 + ] + ] + ] + }, + { + "type": "Polygon", + "name": "Green Stairs Ward", + "coordinates": [ + [ + [ + 141.269, + 618.716 + ], + [ + 281.5, + 768.626 + ], + [ + 450.714, + 687.673 + ], + [ + 673.369, + 551.657 + ], + [ + 717.996, + 442.398 + ], + [ + 411.221, + 377.338 + ], + [ + 276.245, + 498.027 + ] + ] + ] + } + ] + }, + { + "type": "MultiPolygon", + "id": "water", + "coordinates": [ + [ + [ + [ + -1858.181, + -103.271 + ], + [ + -1842.682, + 55.191 + ], + [ + -1731.817, + 185.86 + ], + [ + -1591.616, + 300.437 + ], + [ + -1440.129, + 396.36 + ], + [ + -1269.275, + 440.087 + ], + [ + -1084.846, + 438.434 + ], + [ + -901.472, + 444.916 + ], + [ + -745.588, + 451.985 + ], + [ + -627.139, + 422.697 + ], + [ + -531.758, + 378.633 + ], + [ + -440.869, + 336.053 + ], + [ + -341.156, + 271.788 + ], + [ + -243.555, + 186.018 + ], + [ + -168.919, + 107.219 + ], + [ + -111.88, + 48.224 + ], + [ + -55.147, + 5.195 + ], + [ + 1.2, + -17.644 + ], + [ + 50.273, + -17.998 + ], + [ + 93.878, + -18.891 + ], + [ + 134.174, + -30.744 + ], + [ + 172.912, + -22.207 + ], + [ + 216.258, + 12.737 + ], + [ + 262.433, + 31.316 + ], + [ + 304.283, + 7.282 + ], + [ + 354.854, + -41.962 + ], + [ + 436.525, + -76.675 + ], + [ + 544.473, + -88.385 + ], + [ + 654.54, + -118.738 + ], + [ + 758.179, + -186.085 + ], + [ + 831.449, + -264.479 + ], + [ + 816.78, + -336.231 + ], + [ + 740.889, + -402.12 + ], + [ + 717.588, + -483.955 + ], + [ + 779.128, + -621.266 + ], + [ + 880.467, + -805.937 + ], + [ + 1007.609, + -980.602 + ], + [ + 1136.069, + -1133.18 + ], + [ + 1174.159, + -1274.664 + ], + [ + 1071.871, + -1408.23 + ], + [ + 905.734, + -1575.199 + ], + [ + 747.221, + -1729.5 + ], + [ + 567.158, + -1751.307 + ], + [ + 345.424, + -1702.171 + ], + [ + 132.868, + -1713.245 + ], + [ + -28.108, + -1754.628 + ], + [ + -155.59, + -1772.66 + ], + [ + -309.632, + -1791.592 + ], + [ + -513.979, + -1808.483 + ], + [ + -721.968, + -1778.422 + ], + [ + -910.285, + -1688.447 + ], + [ + -1080.354, + -1573.185 + ], + [ + -1202.31, + -1457.052 + ], + [ + -1287.753, + -1306.568 + ], + [ + -1374.494, + -1122.392 + ], + [ + -1461.819, + -982.72 + ], + [ + -1562.138, + -890.233 + ], + [ + -1669.057, + -771.222 + ], + [ + -1727.041, + -616.694 + ], + [ + -1743.258, + -453.024 + ], + [ + -1791.45, + -280.004 + ] + ] + ] + ] + } + ] +} \ No newline at end of file diff --git a/tests/data_tests/1.1.2/mfcg/GeoObj.pb b/tests/data_tests/1.1.2/mfcg/GeoObj.pb new file mode 100644 index 0000000000000000000000000000000000000000..6be90d6b8aaceb1446ab0f65096c7de1df606b68 GIT binary patch literal 175207 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

*hr?eq7oQVXW`q7d_Zv0PET?u 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‹+hlH;)gl z(&}W0QG4e&9TCw9V##=+h`_3S@@P4qP+S0WnMlq1ump%Tm;h$8lPh^Me=?i8F`Yoo>-i^e>7ZP>=@Q4oK;XO6IqsdGaVhA&1< zeM)A7g&MS96`#mwkq1bK@oB-}s<7nu_ASttjx1?p%2H_T00$LFH7X1c^ZSIJG&X2k zb9Iq?4H_fb(8xcxhw10U+d4Xu?`v7@33jH{<3|Urbs}5gj{fq{gnRS193UOSC#KRR z4? zU{^xq-pIm&dK4OE^R2A5zhBtNg30`vzgrn+uY3FmVa(wXh0SEC*k#43pW(?mmA!fX%0}*c@4o--Aacm%_qLDi%MCm{8xRRTWeAMO%v3$LMY>D{K zqjyM%%a63iSEJW){+0C}9yESq#{-f*AWGFKV@s~C0ZxT*#P@+X^XZ%thu8lmy6Nxz z1CmBs+ZV@|Tow5a5a}_^2_>RXKeKTmvjx>@b6KnPk6 zjkp;Sh|M|weF$^!;(^Ge{5LarENN4ejcGY4_|+8{caDK4iK#m}7L(Qy7d51kKiHj5EChF;8@%jZyoR0;yVWP9NqI zuDDhS+Sb-LPMQWWu!M+Js2CW%A)Ft0}LldpY|6?H9%@L*|hjnQn zGHfCm<95dasoJOZ{tK-+^u*{Q8p9B}>RK-c(ppC)pf7GR`s12?9MYeCUT6C!7j&|Q@X!F``P~>kGc2ZCUwUY-0Jx*s+LsI zHKXrCrf|5AjaHdu!`qJZOnwnqrv#0_oKZy=9J>W#D*6F}+jC8|asO}+ZCoRr88SuV z>Janq?*dUryWwnqnLiNE;#Wq)1C5F$GcSTT%Jh|(>RAZEKk7V&$aGnr&q7r6Gyj+o zItOBKeFtJD92bZgZC;34|44yU<=LX1YjnCjgVtNE<00&uH4ypG9aoj^4@C#bI=ZfW z8RDPmflO7N4eWkg`SX;ZZOzr>HxiASJ$GngzFQY!*h!C-s`7Nm{EI3k@n0e`EYu5` z@2v-u1F=r-3bEF=#mUk!&#!7zzuNiP!uH_-n^byKkbT3`E0}#bAw4R{h@zQ)O@+E$ zgU0ajXv5Qk3#4kFRWJXJm(}pwpcNIjqowO!fwY#VKg`T>@6SA1lV{$VaB!*>TE<>c z*WCRahSuhGL?BAzx)8T*>jsivQNqpEJX5U}BG~tkBu_wI5MGl6^P=_A=!8I6-Wj6! zEffgHpNgA{iIhWCf4Zc&$0sb|U4ynYSCwE3^6U~fM@);{S8$X1e=3lAEtD$Hi()0N zchGB^H#tMv3*`Xc)G^TappScFA(nx9A6-HZ9wA>O&%A)=O0nh zn^2E~80sz##96H0K+=U|mZ_R=!vn^k-hsHL8xw3#!sjEyUhYGfEoFXTO2^oHSAMd>_<$v<6cW$R5HgXFx) zVPeR0H+>C6&rL7cRpqH|e`UF%vT)EU5(m*0n~MU`R3@V_xj!C=P*@M5QVuMTsyu7L zWn+65=T6u2g4U?<<(P!9JpJL4Y@hLDb2RR@77fdV&aV(D{7gYpzcrKpv-=ctR|(F} zuq&C0;1+>6o@@3?+URzj15wdeh3LDDzq!eQe}R}79|;;k)rkh2mmc%gqfmVRoi;8; z`UkzeVf?eR~0k;QI|}s?A*=@W8%a> z+^L<4M$?-)YN#BVbU@<9zVs(es`6N|vrp&WUN;c_oEM^jJ^3FssmfD2 ze&qqVyKZzz|M`ZK6*G4PqN*Rja)&%B5J@))4MV;ybgatr0>|@cJ*QhJX!VyxAZ||X z4f~pL&1WFB2BJ|;w=1|+5-1)5&Qx18Xvx0jX^Q+#nKN=6k z>-SUw>>jk{*Yvf8tZQpeH{+UVq;dMe_x5+(->KQ>?4Oel3RrqUA=BDJ))|>-jrZF` zRB-RRXhdNnUYz;!Dd5uYFiN!fD^-$Hw_tNiL>|2W+zk zVkP+r4MQ%f$wND8uf)|Q*yNyP-|*tWW&7V}njt)Gw|b&@_}E^_?+hCDJ%`54K>A}Y z)p$|HI}S~>^6!_R6=2T{39fxZ9wh%Nyc&_F#_SV==UcRQ)jY01>Rmw0?1Qs%x@pi` zTDFAXd{Q8$&AA{}y!55FEYp~H_MS;k#j8Wab!$D9;hS+Yf%Pc3RsEt;{);7o^2Fdu z`(Jrm2+SD>?U#gD99{|?m5q+LX|CxjHC1^|ca#`aG&efFw9ia2zIde7{sd@-K(KmT zoM~&P$DD0kyJMe3<4B&Z&DqAw>1DRMbVJa(PFR~fHEpFpY~44IXKOwokY+ko?K3ki zA+y~;Ul-46SaBJ|T>n`h`9fK>vr_y%5T5=54P;P(G?8};T7_t}pcQiIr-j=(l6P7l z`sNQ1AKEn#r!x-X;^ph&465=Z>yvttPpllYx??Yhc)2&uuNl`I)6F!g$}`S(J1AKp zvyYFwHSVRK>S_N)#~%Z+U0ed;^i?80ZF%S6rla0ps}sU#&4UwHcK~w+tzl;p+I&j? zgFKnp9S!$PsO6uxF49i~wRJQk-5y+9+vkE|8C-2&zYQ8s0Ip!Up|O9>KKDLzACly0 z%#9ml`MxpB)t5%yMe_-HM6VG(aenD1UfMbu-Y==y$EZhrLQ_wFlqa9P;o~Kmc)ImQ zaBZ!lZkE6b*$%Yg#kiS>)BQ$W8#=#78=S`ky|HEj#63WIIX8R2Of2K39Ys2gVi$H7t8vyA~R%DqLt4AUB!BYd_o4LqTg_aEjx0{O)Z1?nELL15* z0%7$>1yZdFvh*-{Y?x@=oJqiiXkwU1f5Ii}s3`3V@zTze&_qvq2samf_3hF{?=$jP zRUZ-+Ow(K+tS71 zdkwv=K&tk646~I_nC}-Z{+V^9$vlmdU8oR{5$BhF>Zkp!w-*9Y06)adm!>`~{#li0 zvq?Xn+}6<|_Dd0vnXB?~8!J4DJ~R+Utpefn>qDL+>5ZFcU$3C4%2V4WqIHz11Y~)x zf!>E0=KowIT}JqGU5NFr@hee|^BM9a+AIZ4Jv()gVRG03JR6*?v9m&yjkyD1*jZ%C ziH4p!&)o9X{cGbMO*9RFXhP{#`>OTwcU33lvS9i`K({#Oi@#y9;+~mU8 z;zM#QDG)zdUbgs9Ri13??Gw_t@mmT` z>M@9$p>Cmx2<|~ght>GSXNo09w10DOwcYEg++sJ z>*#iV_dq1xWf03i_wbsW*a$b;tW+R%-x${ZMQ5$*gYd2YOxK9*o95erSbEYmV*BqK zUK@x4(*wdy{|IfA@IT`wIMP5@*M`>*FN|yJDCE;ix;gh{T>9aowvHUQQy`r9evuGu z9o_ca97wKwXw=~43&k=wj||>`FeW{(sb;BCkbZKe-Q&B4jqU{ACC{sz?2t)r^hGc3uEWYDYow+4dUM2Ij?e;_T(6zab~Sbt9- z^t_534Xpl*Pip>^jr!WLagOTg!4Mhub|C(9SspXyH=c?b48}o}tIZ3KRlO}%+f+^K z+8i1`b?)h`EECwm84@tMBVmc1s8(@&MO z|Fx9`0+F3vaZ|a{SG}w9_;V+pkPqok>twDpxe?+{VDmsUzt`NHnX2E6d~oMrDbm)Ovw<&E|FS=?TzJfjG|e6Uy!Ha-3S^P}M&2hWLcL z*h7ot$?}XF>8EkpI_gWKgKKMfYWy3x8EH}>s>&1FSKz9{Hh#a#%Do|kfE7a%@$wmj zYyT05#bZPA6t43Mq$kjx`_0(_ z#X(i&xxAgvCpNbol%iXu7z&F)#dWN(F5r?0HPrb48)i}J8rH=*Dko#yJLP1 z?bg*mcxKS6X$zxwhIa;HAb1gC@pvk%7Y3U^c)MF58qiDRxEH;$K197pL5vg%rAbfKi8V8ns)w3Ggp7|WjuR?E`WD^Bde;z&u|dRe5T~iatTtG}L9TO7V3NS3+rI&xoDp8$L1Q zG~Qkkp9eu`zfVC^_qIvym=jZmo6~O?Tyj>fCP6fmIfj%7ZEk`H%7ykU5#8gb2F=|; z~O zsyvZ#1zP*^-Mg2xs_at`y56xziI|xNot$)3eP#?q`B)iZk!vfswea=}#e=%`-+EeQ zXvx`Haw2{0b^XJqJU14?#+6}FLuab z5b<(<(3q;yL#6iTCF{I|Qw@;@IHITW_->-`@s}&iXw>^%=JJ z)bh-gUmue+5>0;?UiwqVTff0|w?NeG^on`=-vAvS@|gQHZq!ZM*H72Hc8pIcO1l>? zo#Yy&DeVoBbkm1ShrKXFmVQ}Sl4*GRlVbdC>j;^qc(ouSy4@ELjcefoscWM`?|?J! z^$WimmeWg7?ce`w$ZV~r+rjiTyY_FsJ`{S2-1IQHed64^kW)Q-6*he-psl0#9!`ra zRm}1eFNN&*K=g`3(b($_+_SXato9^C5Z_rKb?XhIW1OWhdSIK9p7)-Em?B=@wnP+) zj3~wL1)|igB1UD)7g2vrsu$p9TIpWY-}>7(LjC}sBINPV#v+mbx-92Euzjfw&ex*x zB;uhRN<=ey7QzDy>|7$=h?s|-uCJ!-SR&1=uAY*S|1Pwqj$Jk?Y25>C0&#)5La!1* zvlPSxc;dhkv6h?$F+>dAw3%NNv{zZ;X;QZVC4Fno;(8#?rk2e^8?9C*Fmw4nQ%A3?zRf52^xe%%u7-+lAldpYO2le12YC*7jqr;L@bqA) z{XO5M3ybT2Y02<27`?pMtQe~qjLgLFWS)PK(7bF%h@lkSbiUfKG746 zwE8v>7ryDM%I&{%cvBz(_(F*28ykqaG793KXB9}@Hl^__vjxQ_MP1|G-5|oX@i$;Z z{5%l3@LtqU7Ayxb0o)ZeSJ~JEqWK&ih})!{AcpuwLIZ=#S`a5XD3CmoK!oNj#Vc9$ zJWo}tZJo1{*Oa!;hD~liw{#Ua?wg4T@l}M&05HY!J zAZ{(cf*84H-oB*KxZZ`R{2y#rBB>(Y_cw^PyXp=lk_ML5zl5kZTLxk%{tP0*|5RvQ ztzoHV_I-!-ZmcJaEV)wbMTh}s-Qvr0IiqO*6U5m2)9?~WFT}jvMxN~GU2v=WGOdND zUhe!<@cRxb=^gaW5Yg~tAfjm}h@v$-5EhJq7-9Ad#O%2rMAx4ukW@N$gVF>pINaRIqbCd-ci1M>VL;qDvdgmfAS6cXjsb8l}%O z`>!`B5M%gNfvBPr2PSUL>4{E-;Q6+isjzsO>pBeE>ZnbNfBmpYlM|LP=~d45C$JCi zUmBz4&SY-2EPheE2%K|KI_G!AY-`&FqK*CzHv{K!WmI)*KSyS zRv^+O{n>-|Um4rKxYW%wCg1!wzU0D%ff!%@Km+0RW1&Gk%XsbV(-LQw3O@`jIqL#* zpPmriajEF<8f-s^Gnfzv-wZe-(YREYHa4H6&FMQqEQm|RzQ_riLvl~wv(!K?tqsw5 zZXZ%2uC;EZwGz5fp>^H1bie=kA?TSoQ=B_NLm}KWW_ZcjXq~kY95V&NwtL9b`}Q4G z(#WSvA#TO`R^`mVQ`Va9aiT6r*M(^OBLWfod(+K|@?pWPZd<>s4S{Hb zmxng)Fjs}xta}EctzCI?IyY0^9H9;7r$BV5!vf)tPNyUqEosvON`JUD7zlCJ69O^5 zyiWrUr2bZDUAN5=It_ZEHt@ibvq5D~+ISv1Us$d5tO_x6z8`v8(0)E4=_wEPk18XI z-hr5*-wA}NJx@$D2C2DnG)uA?u3jCna23lAs&rP z7f9>v&5PwLpOmb&F)khT2aDBdK;)KDb%oo4kQ}(hzLlfZko`x9%l4U?+NM19 z{eoV%&3Cx2u8xX|;Y6?JPaET?;!A2-rkmE@xOsIYz0{u(EDnK~*9QcG#Xj_O>=%c3 zb)n-R(x7u7GBIbbmij=Ubv-8CwoZFi@~1p_XV=N?+NAmE|CM&;QC(Ge01rV!WI`uR z%}8w3u@x=LTnOAotq?VqaugL&L{SzM#T6A?5+vl9rp_r(V_J4hX$)Ji%*o77+KAOu zr_#}yn$pI~a+$f`&wcl6^?UEH`7h6h?|a{S?{~is+ISU&_IE;xBczlr5Ikhi5J!mG zPgcv*u&?3693fZjfH3yoKim<@z%>v8PKQiK*pE_(owO)nSkn>>$U>b*)%&bXeEj`N zNVlFy*t{2l zsofgm2veDK2x)lTiQb+JQTIzU!1Xp<yuLzvNnR; z>MrhSG}4D5nDlks9ihLqGTf>BQ#hKJmbeUZib4s%5M$YeVY z#NW2+xsk9tAVV}P&{fNpzIO}_NJy{t_gkBU-KTCvp12UF=O(rC1RJGnlu4}j&P^Ka z4{c=Q3^w+0gpBeU?<6B_zReLj@@)_f>a%MdL1rJsesQ4FcI@L*2!{J+Qi7*}9K-9e zXpMcG>EX9FCV+oJo?3fgvU?{}mI?^@t+=}*vY-)9Lm08Q?&b)_Zzr!bmRklmLVevB zZKx3<2RkBae|MZ5fPIuc?1)rW)dwMD=(|TaBClPVg9ena?MyTajgvA~9yTAFCg$ai zPw@7JC$EQ4Fb&k|gSb!&VG6KUiL_?5$!J4XpQ}|4^VN|MW-_%}Sy7jCf)FC2vz!JJ znPQtms4J?+IzkYxLIb+v_1S*sMmyLVc|LnPG}_5SzGZJ{ml`x0iXTir453%A*9gkJ z_axql%DeThoMW_oHy+Y$qQ{NFObHc)%h)B>mmqwW1{{fDnqxln`|vLj$__YNK`N+Ayjf$TPM3o34%U-X20M$uDs4B+1_f zAuhB~!cE#_-ihzT<~teLo|rNSo;Xqo2mB<25zUT5C&LZLqY#E+SEz2Jkzr^+5^QQ# z9lACyWA8woj3j>$^%pkz2jpoVA60GW(tZ!YB8Dizl@4Jmzq$Rv;EzIVhSuJJe}#h-HtPD2! zy6!Z-bCMO{I~VjssZQLKLBz7Xo`V@epum*@ZwQ1j{(9Ab z3_BWvK@3phcbgTuHfA43k+;2mp3??1*v=W?Azs;KjQ} z4){T|VLL~uwc-l4R;HfZuY?NjSu`MT$i1P}jqPa#VPKs&&2McyxeGrN|-F!8*7Hox9fW(P8Kg=)y%*Dve>-``?NWBJJr#U&~xKn`>*^IIpn4V?#cM8ttSZtLzPHqX=|%FZg`d`5d-=20JI@j z)#%!&_V0$^M%$Ed23cr8V2oA5>@*ERM){)D>BcdvgHVn2Ga7`hjhgK%-bof~InT*U zU2^6;^3>CIKB0~-O{A~9$MlO3GRE z>>(wxr7xd_5UKaf^;?_$Zh|O9WJ^mo=MCg zgemt#B}{zmw396Mr4nh)8n;7+vwm8M{IkPPtc~biXEX>sH@?Z~j6A!xSM5t2`%c@7 z5w)*Wi@;&-UM;#nyzFQgo>p? z38hT|1PkA+gc*yS;o*r(l~6NXiVU%&&}a~PZuE>bRAzWpysm&&w;hCCo2|rNa6rhM zcPWvuIp)1;$#2w84`}rv1@ae1A;i{yYc0bgvUwWQ^d(A|M)`gfBD0HDc3x}yw>f@m zlLcjc&pT;%M(P<5&uyj371<~Ao$oMPYl=36vKZY@f_MZ^BdioC;oNMcNgFXl2^sn{ zXF$#MvT7jzOtv*B&BAge_~^&Hhs4>-_uQlcJoi0M<~Ta3JUx!BpRm^N^bCk4&3Q6& z)Cwi^Z)+ih_Un}pOYAI~_hc)Pily=dGBj-K)C!0tM<7f^E-1keqae8JAm6o70q((H z+3AupcREr}X0L!yTE3>)mOQ);!eFaX2}AEzyc1h_Uvm{jPiF{S{Etcqn*$)sK3>)g zO%d4*f*qe!!tQ>I21L*`M(a?2lWIRb1$ip7WL+DMZTmlLB~Jjns0(@Y6NqklrkPw(q{q#Imt4;nyjGbD6vs8E7DTiZp? z0JpF;2CYlE<^a01RAi_Z(v;9rf5+NTd6#+>m6i1!3Z{>gkh`xzPeuhOAQ(jK~s#@p=%?h6cHErQ2*Pbcf&)8kdi+V3C{@pOIJR+T+d8pnbDMoZxnF}CW zIMLBG?<<5KYOW(XPRaK(I^sjQnb&(MFILB~xb2KoA#DD!c;}pW$N&H7U0qn@1G!`4 zQZw_%W^9Ns3tbTrwJajOJi=QJ+mccw%i$96+!VJ^vVN)=>3DyI>ylze2!wZJ2w^wc z&U1t!V9WzT7!g)4a0EkLmn4M9*KDyPymnJ&f+2**;iZmH(Iib3g4e~(b;ORyCke4P z@-rRblZ#R2V!*qbUOvqc%E!~Zhf((}1&;8!ddsmQ!=xl$Zvtq88pa60$Zi_#WN4Wyv$u6NW#X=A3EF^V@^NXSm83v1dZGk;=S zzsw2w8EYCD3t8GIs;p7`!bYBjFm+gOlCbyNV4J7AmEv7*nE|i&H+A;Sb_6$EF&FjKP)|Y`wu2Pr2}jDPFwa z+qk62>`r8AUS4i?W?@!Fjl_xau&700@e5p>2v#6i>EMM1JBg2D)rB=l$}A|%&B|CL zetkMT>Qs3AH{ssS1Y2RS25aR#QVE&XZtw9 zh$zB@6Yra%xLEfd_F$X|sh%Gs_jUxojx?8AOA zxCwlvSH1Dx#N48+xa7=&f{X)Vpf80*y%-k%f-}(I-J#H(VFI+5db(=Vqf{UCh!6&t z_h`Ce8fd>_#=y$&c3KmS>~HDuHOO-#oYuj6?Q=e6J^k{tvf@(mGRI~d_E}GGw%}>2 z$rfBpG%k0#QG9eRk@Zky&R*mQw^dQ*pI#>GIo}bgnmiMNyua=Glrae#bAm0=$9n6+ zTJ$&TnH)E?(8SjQ^6;jxaVdMF%}4OBL`Ut4j^7y_RT~}ue6;s?M(~mA>dlKWjDzX* z9w9rv^|%ncZuKCi62ronwL&QS?#XrpJNaa_5E9s4bq>i43+L4cAuGt=Q?msl;E${s~+KHOPgHw)A zi1wZq9M*l3o+lHWD1(zLeb=vly}^4L@uG|0uS5jba=~HR$JxF21P6%Vpb{L2f`eCZ zzzYtN!Ok8WAgJxOnL40p3+9!HCevFBp-wxyLu-&wHQK05pF8jUs%5M%T(R? zX7w{767%(H-5o4sUzI$Kc5#pHs4OD9eYFr~vpMEJtp=2>#jAwieoOS^IMX8+qh+n0 zHdC_kL|6*DgUj60BwlxKX;f|6g3WEKLliOQPUj$q_f>nN{q1QM?xm{a68AK|6FUzf MJkFbHTG_V$1FOZNmjD0& literal 0 HcmV?d00001 diff --git a/tests/data_tests/1.1.2/mfcg/PaletteMfcgObj.json b/tests/data_tests/1.1.2/mfcg/PaletteMfcgObj.json new file mode 100644 index 0000000..969eea7 --- /dev/null +++ b/tests/data_tests/1.1.2/mfcg/PaletteMfcgObj.json @@ -0,0 +1,15 @@ +{ + "colorPaper": "#ccc5b8", + "colorLight": "#ccc5b8", + "colorDark": "#1a1917", + "colorRoof": "#a5a095", + "colorWater": "#7f7a71", + "colorGreen": "#a59f93", + "colorRoad": "#ccc5b8", + "colorWall": "#1a1917", + "colorTree": "#7f7a71", + "colorLabel": "#1a1917", + "tintMethod": "Spectrum", + "tintStrength": "30", + "weathering": "20" +} \ No newline at end of file diff --git a/tests/data_tests/1.1.2/mfcg/PaletteMfcgObj.pb b/tests/data_tests/1.1.2/mfcg/PaletteMfcgObj.pb new file mode 100644 index 0000000..e582943 --- /dev/null +++ b/tests/data_tests/1.1.2/mfcg/PaletteMfcgObj.pb @@ -0,0 +1,3 @@ + +_ +  " *zq2 : BJzqR \ No newline at end of file From dfd8f9c218c0ce6b646e3d0d6f59ba0bc84c55cf Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 12:53:37 +0100 Subject: [PATCH 17/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.2]=20=20=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BB=D0=B0=D0=B4=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/js/mfcg.js | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/package.json b/package.json index 5102ba3..6bdaaeb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fantasy-maphub", "name_full": "Fantasy MapHub Generators", - "version": "1.2.4-add-data-any-imports.1", + "version": "1.2.4-add-data-any-imports.2", "description": "An offline-first hub that bundles several Watabou map generators into one consistent web app: same UI patterns, local assets, and modern import/export. It adds OpenAPI docs, proto-first serialization (including pure protobuf files), and a PWA build so everything works without an internet connection.", "license": "MPL-2.0", "author": "mail@sunsung.fun", diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 14a2f86..7e2c3d5 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -13792,10 +13792,6 @@ var $lime_init = function (A, t) { var b = va.__cast(a.target, Gf); be.importFromFile(b.name, b.data) } catch (c) { - try { - console.error("MFCG import failed:", c); - } catch (d) { - } q.show(c && c.message ? c.message : String(c)); } }, @@ -14214,10 +14210,6 @@ var $lime_init = function (A, t) { var b = va.__cast(a.target, Gf); be.importFromFile(b.name, b.data) } catch (c) { - try { - console.error("MFCG import failed:", c); - } catch (d) { - } q.show(c && c.message ? c.message : String(c)); } }, From 65d5605b1a7a65e49e7a721f93470bef86cf16b1 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 13:07:03 +0100 Subject: [PATCH 18/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.2]=20=20=D0=BD=D0=B0=D0=BA=D0=BE=D0=BD=D0=B5=D1=86=20?= =?UTF-8?q?=D1=82=D0=BE=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B5=D0=B2=D0=BE=D0=BB=D1=8E=D1=86=D0=B8=D0=BE=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/apps/Cave.test.js | 49 ++++++++++++++++++++++++++++++++ tests/apps/Dwellings.test.js | 39 +++++++++++++++++++++++++ tests/apps/ToyTown2.test.js | 39 +++++++++++++++++++++++++ tests/apps/Village.test.js | 28 ++++++++++++++++++ tests/apps/mfcg.test.js | 39 +++++++++++++++++++++++++ tests/helpers/data-test-utils.js | 17 +++++++++++ 6 files changed, 211 insertions(+) create mode 100644 tests/apps/Cave.test.js create mode 100644 tests/apps/Dwellings.test.js create mode 100644 tests/apps/ToyTown2.test.js create mode 100644 tests/apps/Village.test.js create mode 100644 tests/apps/mfcg.test.js create mode 100644 tests/helpers/data-test-utils.js diff --git a/tests/apps/Cave.test.js b/tests/apps/Cave.test.js new file mode 100644 index 0000000..9051671 --- /dev/null +++ b/tests/apps/Cave.test.js @@ -0,0 +1,49 @@ +import { describe, it, expect } from "vitest"; +import { + paletteObjFromLegacyJsonText as cavePaletteFromText, + paletteLegacyJsonFromObj as cavePaletteToText, + decodePaletteFile as decodeCavePalette, +} from "../../src/js/shared/data/Cave.js"; +import { + paletteObjFromLegacyJsonText as gladePaletteFromText, + paletteLegacyJsonFromObj as gladePaletteToText, + decodePaletteFile as decodeGladePalette, +} from "../../src/js/shared/data/Glade.js"; +import { readTestBytes, readTestJson } from "../helpers/data-test-utils.js"; + +const caveLegacy = readTestJson("vanilla/Cave/PaletteCaveObj.json"); +const gladeLegacy = readTestJson("vanilla/Cave/PaletteGladeObj.json"); + +describe("Cave app palettes", () => { + it("exports all legacy cave palette fields", () => { + const msg = cavePaletteFromText(JSON.stringify(caveLegacy)); + const exported = JSON.parse(cavePaletteToText(msg)); + for (const key of Object.keys(caveLegacy)) expect(exported).toHaveProperty(key); + }); + + it("imports cave palette JSON and PB", () => { + expect(() => cavePaletteFromText(JSON.stringify(caveLegacy))).not.toThrow(); + const pb = readTestBytes("1.1.2/Cave/cave_tan_antiquewhite.palette.cv.pb"); + expect(() => decodeCavePalette("cave.pb", pb)).not.toThrow(); + }); + + it("rejects glade palette when cave palette is expected", () => { + expect(() => cavePaletteFromText(JSON.stringify(gladeLegacy))).toThrow(/uploaded|expected/i); + }); + + it("exports all legacy glade palette fields", () => { + const msg = gladePaletteFromText(JSON.stringify(gladeLegacy)); + const exported = JSON.parse(gladePaletteToText(msg)); + for (const key of Object.keys(gladeLegacy)) expect(exported).toHaveProperty(key); + }); + + it("imports glade palette JSON and PB", () => { + expect(() => gladePaletteFromText(JSON.stringify(gladeLegacy))).not.toThrow(); + const pb = readTestBytes("1.1.2/ToyTown2/PaletteGladeObj.pb"); + expect(() => decodeGladePalette("glade.pb", pb)).not.toThrow(); + }); + + it("rejects cave palette when glade palette is expected", () => { + expect(() => gladePaletteFromText(JSON.stringify(caveLegacy))).toThrow(/uploaded|expected/i); + }); +}); diff --git a/tests/apps/Dwellings.test.js b/tests/apps/Dwellings.test.js new file mode 100644 index 0000000..b611d76 --- /dev/null +++ b/tests/apps/Dwellings.test.js @@ -0,0 +1,39 @@ +import { describe, it, expect } from "vitest"; +import { + paletteObjFromLegacyJsonText, + paletteLegacyJsonFromObj, + decodePaletteFile, + decodeDwellingsFile, +} from "../../src/js/shared/data/Dwellings.js"; +import { readTestBytes, readTestJson } from "../helpers/data-test-utils.js"; + +const paletteLegacy = readTestJson("1.1.2/Dwellings/PaletteDwellingsObj.json"); +const dwellingsLegacy = readTestJson("1.1.2/Dwellings/DwellingsObj.json"); + +describe("Dwellings app data", () => { + it("exports all legacy palette fields", () => { + const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); + const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); + for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); + }); + + it("imports palette JSON and PB", () => { + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); + const pb = readTestBytes("1.1.2/Dwellings/PaletteDwellingsObj.pb"); + expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); + }); + + it("imports dwellings JSON and PB", () => { + expect(() => decodeDwellingsFile("dwellings.json", JSON.stringify(dwellingsLegacy))).not.toThrow(); + const pb = readTestBytes("1.1.2/Dwellings/DwellingsObj.pb"); + expect(() => decodeDwellingsFile("dwellings.pb", pb)).not.toThrow(); + }); + + it("rejects dwellings data when palette is expected", () => { + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(dwellingsLegacy))).toThrow(/uploaded|expected|dwellings|palette/i); + }); + + it("rejects palette data when dwellings are expected", () => { + expect(() => decodeDwellingsFile("palette.json", JSON.stringify(paletteLegacy))).toThrow(/uploaded|expected/i); + }); +}); diff --git a/tests/apps/ToyTown2.test.js b/tests/apps/ToyTown2.test.js new file mode 100644 index 0000000..1411ce4 --- /dev/null +++ b/tests/apps/ToyTown2.test.js @@ -0,0 +1,39 @@ +import { describe, it, expect } from "vitest"; +import { + paletteObjFromLegacyJsonText, + paletteLegacyJsonFromObj, + decodePaletteFile, +} from "../../src/js/shared/data/Viewer.js"; +import { decodeCityFile } from "../../src/js/shared/data/data.js"; +import { readTestBytes, readTestJson } from "../helpers/data-test-utils.js"; + +const paletteLegacy = readTestJson("vanilla/ToyTown2/PaletteViewerObj.json"); +const geoLegacy = readTestJson("vanilla/Village/GeoObj.json"); +const wrongPalette = readTestJson("vanilla/Village/PaletteVillageObj.json"); + +describe("ToyTown2 app data", () => { + it("exports all legacy viewer palette fields", () => { + const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); + const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); + for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); + }); + + it("imports viewer palette JSON", () => { + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); + }); + + it("imports geo JSON and PB", () => { + expect(() => decodeCityFile("geo.json", JSON.stringify(geoLegacy))).not.toThrow(); + const pb = readTestBytes("1.1.2/Village/GeoObj.pb"); + expect(() => decodeCityFile("geo.pb", pb)).not.toThrow(); + }); + + it("accepts cave palette PB without type wrapper", () => { + const pb = readTestBytes("1.1.2/ToyTown2/PaletteCaveObj.pb"); + expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); + }); + + it("rejects village palette when viewer palette is expected", () => { + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(wrongPalette))).toThrow(/uploaded|expected/i); + }); +}); diff --git a/tests/apps/Village.test.js b/tests/apps/Village.test.js new file mode 100644 index 0000000..6fcb253 --- /dev/null +++ b/tests/apps/Village.test.js @@ -0,0 +1,28 @@ +import { describe, it, expect } from "vitest"; +import { + paletteObjFromLegacyJsonText, + paletteLegacyJsonFromObj, + decodePaletteFile, +} from "../../src/js/shared/data/Village.js"; +import { readTestBytes, readTestJson } from "../helpers/data-test-utils.js"; + +const paletteLegacy = readTestJson("vanilla/Village/PaletteVillageObj.json"); +const wrongPalette = readTestJson("vanilla/mfcg/PaletteMfcgObj.json"); + +describe("Village app palette", () => { + it("exports all legacy village palette fields", () => { + const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); + const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); + for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); + }); + + it("imports village palette JSON and PB", () => { + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); + const pb = readTestBytes("1.1.2/Village/PaletteVillageObj.pb"); + expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); + }); + + it("rejects mfcg palette when village palette is expected", () => { + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(wrongPalette))).toThrow(/uploaded|expected/i); + }); +}); diff --git a/tests/apps/mfcg.test.js b/tests/apps/mfcg.test.js new file mode 100644 index 0000000..f1a4ccb --- /dev/null +++ b/tests/apps/mfcg.test.js @@ -0,0 +1,39 @@ +import { describe, it, expect } from "vitest"; +import { + paletteObjFromLegacyJsonText, + paletteLegacyJsonFromObj, + decodePaletteFile, +} from "../../src/js/shared/data/mfcg.js"; +import { decodeCityFile } from "../../src/js/shared/data/data.js"; +import { readTestBytes, readTestJson } from "../helpers/data-test-utils.js"; + +const paletteLegacy = readTestJson("vanilla/mfcg/PaletteMfcgObj.json"); +const geoLegacy = readTestJson("1.1.2/mfcg/GeoObj.json"); + +describe("MFCG app data", () => { + it("exports all legacy palette fields", () => { + const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); + const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); + for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); + }); + + it("imports palette JSON and PB", () => { + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); + const pb = readTestBytes("1.1.2/mfcg/PaletteMfcgObj.pb"); + expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); + }); + + it("imports geo JSON and PB", () => { + expect(() => decodeCityFile("geo.json", JSON.stringify(geoLegacy))).not.toThrow(); + const pb = readTestBytes("1.1.2/mfcg/GeoObj.pb"); + expect(() => decodeCityFile("geo.pb", pb)).not.toThrow(); + }); + + it("rejects geo data when palette is expected", () => { + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(geoLegacy))).toThrow(/uploaded|expected/i); + }); + + it("rejects palette data when geo is expected", () => { + expect(() => decodeCityFile("palette.json", JSON.stringify(paletteLegacy))).toThrow(/uploaded|expected/i); + }); +}); diff --git a/tests/helpers/data-test-utils.js b/tests/helpers/data-test-utils.js new file mode 100644 index 0000000..68cb7fd --- /dev/null +++ b/tests/helpers/data-test-utils.js @@ -0,0 +1,17 @@ +import { readFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const dataRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..", "data_tests"); + +export function readTestJson(relPath) { + return JSON.parse(readFileSync(resolve(dataRoot, relPath), "utf8")); +} + +export function readTestText(relPath) { + return readFileSync(resolve(dataRoot, relPath), "utf8"); +} + +export function readTestBytes(relPath) { + return readFileSync(resolve(dataRoot, relPath)); +} From 63ca2e7b3bcc04a3937f4fa1060c6feddab8358d Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 15:29:32 +0100 Subject: [PATCH 19/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.2]=20=20=D0=B4=D0=B5=D0=BB=D0=B0=D1=8E=20=D0=B1=D0=BE?= =?UTF-8?q?=D0=BB=D0=B5=D0=B5=20=D0=B3=D0=B8=D0=B1=D0=BA=D0=BE=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD=D0=BE=20=D0=BD=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=BE=20=D0=BA=D0=BE=D0=BD=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/apps/Cave.test.js | 95 ++++++++++++------ tests/apps/Dwellings.test.js | 76 +++++++++----- tests/apps/ToyTown2.test.js | 85 +++++++++++----- tests/apps/Village.test.js | 62 ++++++++---- tests/apps/data-tests-names.test.js | 57 +++++++++++ tests/apps/mfcg.test.js | 75 +++++++++----- ...te.palette.cv.json => PaletteCaveObj.json} | 0 ...ewhite.palette.cv.pb => PaletteCaveObj.pb} | Bin .../{ToyTown2 => Cave}/PaletteGladeObj.json | 0 .../{ToyTown2 => Cave}/PaletteGladeObj.pb | Bin .../1.1.2/ToyTown2/PaletteCaveObj.json | 23 ----- .../1.1.2/ToyTown2/PaletteCaveObj.pb | Bin 173 -> 0 bytes .../1.1.2/ToyTown2/PaletteViewerObj.json | 23 +++++ .../1.1.2/ToyTown2/PaletteViewerObj.pb | Bin 0 -> 155 bytes tests/helpers/data-test-utils.js | 51 +++++++++- 15 files changed, 400 insertions(+), 147 deletions(-) create mode 100644 tests/apps/data-tests-names.test.js rename tests/data_tests/1.1.2/Cave/{cave_tan_antiquewhite.palette.cv.json => PaletteCaveObj.json} (100%) rename tests/data_tests/1.1.2/Cave/{cave_tan_antiquewhite.palette.cv.pb => PaletteCaveObj.pb} (100%) rename tests/data_tests/1.1.2/{ToyTown2 => Cave}/PaletteGladeObj.json (100%) rename tests/data_tests/1.1.2/{ToyTown2 => Cave}/PaletteGladeObj.pb (100%) delete mode 100644 tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.json delete mode 100644 tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.pb create mode 100644 tests/data_tests/1.1.2/ToyTown2/PaletteViewerObj.json create mode 100644 tests/data_tests/1.1.2/ToyTown2/PaletteViewerObj.pb diff --git a/tests/apps/Cave.test.js b/tests/apps/Cave.test.js index 9051671..62982a1 100644 --- a/tests/apps/Cave.test.js +++ b/tests/apps/Cave.test.js @@ -9,41 +9,76 @@ import { paletteLegacyJsonFromObj as gladePaletteToText, decodePaletteFile as decodeGladePalette, } from "../../src/js/shared/data/Glade.js"; -import { readTestBytes, readTestJson } from "../helpers/data-test-utils.js"; +import { + findFileByName, + findFirstFile, + groupDataFilesByVersion, + readTestBytes, + readTestJson, +} from "../helpers/data-test-utils.js"; -const caveLegacy = readTestJson("vanilla/Cave/PaletteCaveObj.json"); -const gladeLegacy = readTestJson("vanilla/Cave/PaletteGladeObj.json"); +const filesByVersion = groupDataFilesByVersion(); -describe("Cave app palettes", () => { - it("exports all legacy cave palette fields", () => { - const msg = cavePaletteFromText(JSON.stringify(caveLegacy)); - const exported = JSON.parse(cavePaletteToText(msg)); - for (const key of Object.keys(caveLegacy)) expect(exported).toHaveProperty(key); - }); +for (const version of Object.keys(filesByVersion)) { + const files = filesByVersion[version]; + const caveJsonFile = findFirstFile( + files, + (file) => + file.relPath.includes("/Cave/") && + (file.name === "PaletteCaveObj.json" || file.name.endsWith(".palette.cv.json")) + ); + const gladeJsonFile = findFileByName(files, "PaletteGladeObj.json"); + const cavePbFile = findFirstFile( + files, + (file) => file.relPath.includes("/Cave/") && file.name.endsWith(".pb") + ); + const gladePbFile = findFileByName(files, "PaletteGladeObj.pb"); - it("imports cave palette JSON and PB", () => { - expect(() => cavePaletteFromText(JSON.stringify(caveLegacy))).not.toThrow(); - const pb = readTestBytes("1.1.2/Cave/cave_tan_antiquewhite.palette.cv.pb"); - expect(() => decodeCavePalette("cave.pb", pb)).not.toThrow(); - }); + describe(`Cave app palettes (${version})`, () => { + it("exports all legacy cave palette fields", () => { + if (!caveJsonFile) return; + const caveLegacy = readTestJson(caveJsonFile.relPath); + const msg = cavePaletteFromText(JSON.stringify(caveLegacy)); + const exported = JSON.parse(cavePaletteToText(msg)); + for (const key of Object.keys(caveLegacy)) expect(exported).toHaveProperty(key); + }); - it("rejects glade palette when cave palette is expected", () => { - expect(() => cavePaletteFromText(JSON.stringify(gladeLegacy))).toThrow(/uploaded|expected/i); - }); + it("imports cave palette JSON and PB", () => { + if (!caveJsonFile) return; + const caveLegacy = readTestJson(caveJsonFile.relPath); + expect(() => cavePaletteFromText(JSON.stringify(caveLegacy))).not.toThrow(); + if (!cavePbFile) return; + const pb = readTestBytes(cavePbFile.relPath); + expect(() => decodeCavePalette("cave.pb", pb)).not.toThrow(); + }); - it("exports all legacy glade palette fields", () => { - const msg = gladePaletteFromText(JSON.stringify(gladeLegacy)); - const exported = JSON.parse(gladePaletteToText(msg)); - for (const key of Object.keys(gladeLegacy)) expect(exported).toHaveProperty(key); - }); + it("rejects glade palette when cave palette is expected", () => { + if (!caveJsonFile || !gladeJsonFile) return; + const gladeLegacy = readTestJson(gladeJsonFile.relPath); + expect(() => cavePaletteFromText(JSON.stringify(gladeLegacy))).toThrow(/uploaded|expected/i); + }); - it("imports glade palette JSON and PB", () => { - expect(() => gladePaletteFromText(JSON.stringify(gladeLegacy))).not.toThrow(); - const pb = readTestBytes("1.1.2/ToyTown2/PaletteGladeObj.pb"); - expect(() => decodeGladePalette("glade.pb", pb)).not.toThrow(); - }); + it("exports all legacy glade palette fields", () => { + if (!gladeJsonFile) return; + const gladeLegacy = readTestJson(gladeJsonFile.relPath); + const msg = gladePaletteFromText(JSON.stringify(gladeLegacy)); + const exported = JSON.parse(gladePaletteToText(msg)); + for (const key of Object.keys(gladeLegacy)) expect(exported).toHaveProperty(key); + }); + + it("imports glade palette JSON and PB", () => { + if (!gladeJsonFile) return; + const gladeLegacy = readTestJson(gladeJsonFile.relPath); + expect(() => gladePaletteFromText(JSON.stringify(gladeLegacy))).not.toThrow(); + if (!gladePbFile) return; + const pb = readTestBytes(gladePbFile.relPath); + expect(() => decodeGladePalette("glade.pb", pb)).not.toThrow(); + }); - it("rejects cave palette when glade palette is expected", () => { - expect(() => gladePaletteFromText(JSON.stringify(caveLegacy))).toThrow(/uploaded|expected/i); + it("rejects cave palette when glade palette is expected", () => { + if (!caveJsonFile || !gladeJsonFile) return; + const caveLegacy = readTestJson(caveJsonFile.relPath); + expect(() => gladePaletteFromText(JSON.stringify(caveLegacy))).toThrow(/uploaded|expected/i); + }); }); -}); +} diff --git a/tests/apps/Dwellings.test.js b/tests/apps/Dwellings.test.js index b611d76..cdcc2b5 100644 --- a/tests/apps/Dwellings.test.js +++ b/tests/apps/Dwellings.test.js @@ -5,35 +5,61 @@ import { decodePaletteFile, decodeDwellingsFile, } from "../../src/js/shared/data/Dwellings.js"; -import { readTestBytes, readTestJson } from "../helpers/data-test-utils.js"; +import { + findFileByName, + groupDataFilesByVersion, + readTestBytes, + readTestJson, +} from "../helpers/data-test-utils.js"; -const paletteLegacy = readTestJson("1.1.2/Dwellings/PaletteDwellingsObj.json"); -const dwellingsLegacy = readTestJson("1.1.2/Dwellings/DwellingsObj.json"); +const filesByVersion = groupDataFilesByVersion(); -describe("Dwellings app data", () => { - it("exports all legacy palette fields", () => { - const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); - const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); - for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); - }); +for (const version of Object.keys(filesByVersion)) { + const files = filesByVersion[version]; + const paletteJsonFile = findFileByName(files, "PaletteDwellingsObj.json"); + const palettePbFile = findFileByName(files, "PaletteDwellingsObj.pb"); + const dwellingsJsonFile = findFileByName(files, "DwellingsObj.json"); + const dwellingsPbFile = findFileByName(files, "DwellingsObj.pb"); - it("imports palette JSON and PB", () => { - expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); - const pb = readTestBytes("1.1.2/Dwellings/PaletteDwellingsObj.pb"); - expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); - }); + describe(`Dwellings app data (${version})`, () => { + it("exports all legacy palette fields", () => { + if (!paletteJsonFile) return; + const paletteLegacy = readTestJson(paletteJsonFile.relPath); + const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); + const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); + for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); + }); - it("imports dwellings JSON and PB", () => { - expect(() => decodeDwellingsFile("dwellings.json", JSON.stringify(dwellingsLegacy))).not.toThrow(); - const pb = readTestBytes("1.1.2/Dwellings/DwellingsObj.pb"); - expect(() => decodeDwellingsFile("dwellings.pb", pb)).not.toThrow(); - }); + it("imports palette JSON and PB", () => { + if (!paletteJsonFile) return; + const paletteLegacy = readTestJson(paletteJsonFile.relPath); + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); + if (!palettePbFile) return; + const pb = readTestBytes(palettePbFile.relPath); + expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); + }); - it("rejects dwellings data when palette is expected", () => { - expect(() => paletteObjFromLegacyJsonText(JSON.stringify(dwellingsLegacy))).toThrow(/uploaded|expected|dwellings|palette/i); - }); + it("imports dwellings JSON and PB", () => { + if (!dwellingsJsonFile) return; + const dwellingsLegacy = readTestJson(dwellingsJsonFile.relPath); + expect(() => decodeDwellingsFile("dwellings.json", JSON.stringify(dwellingsLegacy))).not.toThrow(); + if (!dwellingsPbFile) return; + const pb = readTestBytes(dwellingsPbFile.relPath); + expect(() => decodeDwellingsFile("dwellings.pb", pb)).not.toThrow(); + }); + + it("rejects dwellings data when palette is expected", () => { + if (!paletteJsonFile || !dwellingsJsonFile) return; + const dwellingsLegacy = readTestJson(dwellingsJsonFile.relPath); + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(dwellingsLegacy))).toThrow( + /uploaded|expected|dwellings|palette/i + ); + }); - it("rejects palette data when dwellings are expected", () => { - expect(() => decodeDwellingsFile("palette.json", JSON.stringify(paletteLegacy))).toThrow(/uploaded|expected/i); + it("rejects palette data when dwellings are expected", () => { + if (!paletteJsonFile || !dwellingsJsonFile) return; + const paletteLegacy = readTestJson(paletteJsonFile.relPath); + expect(() => decodeDwellingsFile("palette.json", JSON.stringify(paletteLegacy))).toThrow(/uploaded|expected/i); + }); }); -}); +} diff --git a/tests/apps/ToyTown2.test.js b/tests/apps/ToyTown2.test.js index 1411ce4..a66858e 100644 --- a/tests/apps/ToyTown2.test.js +++ b/tests/apps/ToyTown2.test.js @@ -5,35 +5,70 @@ import { decodePaletteFile, } from "../../src/js/shared/data/Viewer.js"; import { decodeCityFile } from "../../src/js/shared/data/data.js"; -import { readTestBytes, readTestJson } from "../helpers/data-test-utils.js"; +import { + findFileByName, + findFirstFile, + groupDataFilesByVersion, + readTestBytes, + readTestJson, +} from "../helpers/data-test-utils.js"; -const paletteLegacy = readTestJson("vanilla/ToyTown2/PaletteViewerObj.json"); -const geoLegacy = readTestJson("vanilla/Village/GeoObj.json"); -const wrongPalette = readTestJson("vanilla/Village/PaletteVillageObj.json"); +const filesByVersion = groupDataFilesByVersion(); -describe("ToyTown2 app data", () => { - it("exports all legacy viewer palette fields", () => { - const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); - const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); - for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); - }); +for (const version of Object.keys(filesByVersion)) { + const files = filesByVersion[version]; + const paletteJsonFile = findFirstFile( + files, + (file) => file.name === "PaletteViewerObj.json" && file.relPath.includes("/ToyTown2/") + ); + const wrongPaletteFile = findFirstFile( + files, + (file) => file.name === "PaletteVillageObj.json" && file.relPath.includes("/Village/") + ); + const geoJsonFile = findFirstFile( + files, + (file) => file.name === "GeoObj.json" && file.relPath.includes("/Village/") + ); + const geoPbFile = findFirstFile( + files, + (file) => file.name === "GeoObj.pb" && file.relPath.includes("/Village/") + ); + const cavePbFile = findFileByName(files, "PaletteCaveObj.pb"); - it("imports viewer palette JSON", () => { - expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); - }); + describe(`ToyTown2 app data (${version})`, () => { + it("exports all legacy viewer palette fields", () => { + if (!paletteJsonFile) return; + const paletteLegacy = readTestJson(paletteJsonFile.relPath); + const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); + const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); + for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); + }); - it("imports geo JSON and PB", () => { - expect(() => decodeCityFile("geo.json", JSON.stringify(geoLegacy))).not.toThrow(); - const pb = readTestBytes("1.1.2/Village/GeoObj.pb"); - expect(() => decodeCityFile("geo.pb", pb)).not.toThrow(); - }); + it("imports viewer palette JSON", () => { + if (!paletteJsonFile) return; + const paletteLegacy = readTestJson(paletteJsonFile.relPath); + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); + }); - it("accepts cave palette PB without type wrapper", () => { - const pb = readTestBytes("1.1.2/ToyTown2/PaletteCaveObj.pb"); - expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); - }); + it("imports geo JSON and PB", () => { + if (!geoJsonFile) return; + const geoLegacy = readTestJson(geoJsonFile.relPath); + expect(() => decodeCityFile("geo.json", JSON.stringify(geoLegacy))).not.toThrow(); + if (!geoPbFile) return; + const pb = readTestBytes(geoPbFile.relPath); + expect(() => decodeCityFile("geo.pb", pb)).not.toThrow(); + }); + + it("accepts cave palette PB without type wrapper", () => { + if (!cavePbFile) return; + const pb = readTestBytes(cavePbFile.relPath); + expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); + }); - it("rejects village palette when viewer palette is expected", () => { - expect(() => paletteObjFromLegacyJsonText(JSON.stringify(wrongPalette))).toThrow(/uploaded|expected/i); + it("rejects village palette when viewer palette is expected", () => { + if (!wrongPaletteFile) return; + const wrongPalette = readTestJson(wrongPaletteFile.relPath); + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(wrongPalette))).toThrow(/uploaded|expected/i); + }); }); -}); +} diff --git a/tests/apps/Village.test.js b/tests/apps/Village.test.js index 6fcb253..ff3a914 100644 --- a/tests/apps/Village.test.js +++ b/tests/apps/Village.test.js @@ -4,25 +4,53 @@ import { paletteLegacyJsonFromObj, decodePaletteFile, } from "../../src/js/shared/data/Village.js"; -import { readTestBytes, readTestJson } from "../helpers/data-test-utils.js"; +import { + findFileByName, + findFirstFile, + groupDataFilesByVersion, + readTestBytes, + readTestJson, +} from "../helpers/data-test-utils.js"; -const paletteLegacy = readTestJson("vanilla/Village/PaletteVillageObj.json"); -const wrongPalette = readTestJson("vanilla/mfcg/PaletteMfcgObj.json"); +const filesByVersion = groupDataFilesByVersion(); -describe("Village app palette", () => { - it("exports all legacy village palette fields", () => { - const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); - const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); - for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); - }); +for (const version of Object.keys(filesByVersion)) { + const files = filesByVersion[version]; + const paletteJsonFile = findFirstFile( + files, + (file) => file.name === "PaletteVillageObj.json" && file.relPath.includes("/Village/") + ); + const palettePbFile = findFirstFile( + files, + (file) => file.name === "PaletteVillageObj.pb" && file.relPath.includes("/Village/") + ); + const wrongPaletteFile = findFirstFile( + files, + (file) => file.name === "PaletteMfcgObj.json" && file.relPath.includes("/mfcg/") + ); - it("imports village palette JSON and PB", () => { - expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); - const pb = readTestBytes("1.1.2/Village/PaletteVillageObj.pb"); - expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); - }); + describe(`Village app palette (${version})`, () => { + it("exports all legacy village palette fields", () => { + if (!paletteJsonFile) return; + const paletteLegacy = readTestJson(paletteJsonFile.relPath); + const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); + const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); + for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); + }); + + it("imports village palette JSON and PB", () => { + if (!paletteJsonFile) return; + const paletteLegacy = readTestJson(paletteJsonFile.relPath); + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); + if (!palettePbFile) return; + const pb = readTestBytes(palettePbFile.relPath); + expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); + }); - it("rejects mfcg palette when village palette is expected", () => { - expect(() => paletteObjFromLegacyJsonText(JSON.stringify(wrongPalette))).toThrow(/uploaded|expected/i); + it("rejects mfcg palette when village palette is expected", () => { + if (!wrongPaletteFile) return; + const wrongPalette = readTestJson(wrongPaletteFile.relPath); + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(wrongPalette))).toThrow(/uploaded|expected/i); + }); }); -}); +} diff --git a/tests/apps/data-tests-names.test.js b/tests/apps/data-tests-names.test.js new file mode 100644 index 0000000..cb0b6c6 --- /dev/null +++ b/tests/apps/data-tests-names.test.js @@ -0,0 +1,57 @@ +import { describe, it, expect } from "vitest"; +import { listDataFiles } from "../helpers/data-test-utils.js"; + +const ALLOWED_BY_FOLDER = { + Cave: [ + /^PaletteCaveObj\.json$/, + /^PaletteGladeObj\.json$/, + /^PaletteCaveObj\.pb$/, + /^PaletteGladeObj\.pb$/, + ], + Dwellings: [ + /^PaletteDwellingsObj\.json$/, + /^PaletteDwellingsObj\.pb$/, + /^DwellingsObj\.json$/, + /^DwellingsObj\.pb$/, + ], + mfcg: [ + /^PaletteMfcgObj\.json$/, + /^PaletteMfcgObj\.pb$/, + /^GeoObj\.json$/, + /^GeoObj\.pb$/, + ], + ToyTown2: [ + /^PaletteViewerObj\.json$/, + /^PaletteViewerObj\.pb$/, + ], + Village: [ + /^PaletteVillageObj\.json$/, + /^PaletteVillageObj\.pb$/, + /^GeoObj\.json$/, + /^GeoObj\.pb$/, + ], +}; + +function folderFromRelPath(relPath) { + const parts = relPath.split("/"); + return parts.length >= 2 ? parts[1] : null; +} + +function isAllowedFile(folder, name) { + const patterns = ALLOWED_BY_FOLDER[folder]; + if (!patterns) return true; + return patterns.some((re) => re.test(name)); +} + +describe("data_tests file names", () => { + it("uses only allowed file names for known folders", () => { + const files = listDataFiles(); + const invalid = []; + for (const file of files) { + const folder = folderFromRelPath(file.relPath); + if (!folder) continue; + if (!isAllowedFile(folder, file.name)) invalid.push(file.relPath); + } + expect(invalid).toEqual([]); + }); +}); diff --git a/tests/apps/mfcg.test.js b/tests/apps/mfcg.test.js index f1a4ccb..d35e044 100644 --- a/tests/apps/mfcg.test.js +++ b/tests/apps/mfcg.test.js @@ -5,35 +5,60 @@ import { decodePaletteFile, } from "../../src/js/shared/data/mfcg.js"; import { decodeCityFile } from "../../src/js/shared/data/data.js"; -import { readTestBytes, readTestJson } from "../helpers/data-test-utils.js"; +import { + findFileByName, + findFirstFile, + groupDataFilesByVersion, + readTestBytes, + readTestJson, +} from "../helpers/data-test-utils.js"; -const paletteLegacy = readTestJson("vanilla/mfcg/PaletteMfcgObj.json"); -const geoLegacy = readTestJson("1.1.2/mfcg/GeoObj.json"); +const filesByVersion = groupDataFilesByVersion(); -describe("MFCG app data", () => { - it("exports all legacy palette fields", () => { - const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); - const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); - for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); - }); +for (const version of Object.keys(filesByVersion)) { + const files = filesByVersion[version]; + const paletteJsonFile = findFileByName(files, "PaletteMfcgObj.json"); + const palettePbFile = findFileByName(files, "PaletteMfcgObj.pb"); + const geoJsonFile = findFirstFile(files, (file) => file.name === "GeoObj.json" && file.relPath.includes("/mfcg/")); + const geoPbFile = findFirstFile(files, (file) => file.name === "GeoObj.pb" && file.relPath.includes("/mfcg/")); - it("imports palette JSON and PB", () => { - expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); - const pb = readTestBytes("1.1.2/mfcg/PaletteMfcgObj.pb"); - expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); - }); + describe(`MFCG app data (${version})`, () => { + it("exports all legacy palette fields", () => { + if (!paletteJsonFile) return; + const paletteLegacy = readTestJson(paletteJsonFile.relPath); + const msg = paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy)); + const exported = JSON.parse(paletteLegacyJsonFromObj(msg)); + for (const key of Object.keys(paletteLegacy)) expect(exported).toHaveProperty(key); + }); - it("imports geo JSON and PB", () => { - expect(() => decodeCityFile("geo.json", JSON.stringify(geoLegacy))).not.toThrow(); - const pb = readTestBytes("1.1.2/mfcg/GeoObj.pb"); - expect(() => decodeCityFile("geo.pb", pb)).not.toThrow(); - }); + it("imports palette JSON and PB", () => { + if (!paletteJsonFile) return; + const paletteLegacy = readTestJson(paletteJsonFile.relPath); + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); + if (!palettePbFile) return; + const pb = readTestBytes(palettePbFile.relPath); + expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); + }); - it("rejects geo data when palette is expected", () => { - expect(() => paletteObjFromLegacyJsonText(JSON.stringify(geoLegacy))).toThrow(/uploaded|expected/i); - }); + it("imports geo JSON and PB", () => { + if (!geoJsonFile) return; + const geoLegacy = readTestJson(geoJsonFile.relPath); + expect(() => decodeCityFile("geo.json", JSON.stringify(geoLegacy))).not.toThrow(); + if (!geoPbFile) return; + const pb = readTestBytes(geoPbFile.relPath); + expect(() => decodeCityFile("geo.pb", pb)).not.toThrow(); + }); + + it("rejects geo data when palette is expected", () => { + if (!paletteJsonFile || !geoJsonFile) return; + const geoLegacy = readTestJson(geoJsonFile.relPath); + expect(() => paletteObjFromLegacyJsonText(JSON.stringify(geoLegacy))).toThrow(/uploaded|expected/i); + }); - it("rejects palette data when geo is expected", () => { - expect(() => decodeCityFile("palette.json", JSON.stringify(paletteLegacy))).toThrow(/uploaded|expected/i); + it("rejects palette data when geo is expected", () => { + if (!paletteJsonFile || !geoJsonFile) return; + const paletteLegacy = readTestJson(paletteJsonFile.relPath); + expect(() => decodeCityFile("palette.json", JSON.stringify(paletteLegacy))).toThrow(/uploaded|expected/i); + }); }); -}); +} diff --git a/tests/data_tests/1.1.2/Cave/cave_tan_antiquewhite.palette.cv.json b/tests/data_tests/1.1.2/Cave/PaletteCaveObj.json similarity index 100% rename from tests/data_tests/1.1.2/Cave/cave_tan_antiquewhite.palette.cv.json rename to tests/data_tests/1.1.2/Cave/PaletteCaveObj.json diff --git a/tests/data_tests/1.1.2/Cave/cave_tan_antiquewhite.palette.cv.pb b/tests/data_tests/1.1.2/Cave/PaletteCaveObj.pb similarity index 100% rename from tests/data_tests/1.1.2/Cave/cave_tan_antiquewhite.palette.cv.pb rename to tests/data_tests/1.1.2/Cave/PaletteCaveObj.pb diff --git a/tests/data_tests/1.1.2/ToyTown2/PaletteGladeObj.json b/tests/data_tests/1.1.2/Cave/PaletteGladeObj.json similarity index 100% rename from tests/data_tests/1.1.2/ToyTown2/PaletteGladeObj.json rename to tests/data_tests/1.1.2/Cave/PaletteGladeObj.json diff --git a/tests/data_tests/1.1.2/ToyTown2/PaletteGladeObj.pb b/tests/data_tests/1.1.2/Cave/PaletteGladeObj.pb similarity index 100% rename from tests/data_tests/1.1.2/ToyTown2/PaletteGladeObj.pb rename to tests/data_tests/1.1.2/Cave/PaletteGladeObj.pb diff --git a/tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.json b/tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.json deleted file mode 100644 index 3d2bee9..0000000 --- a/tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "ground": "#a59a63", - "fields": "#8c7b5b", - "greens": "#80804d", - "foliage": "#80804d", - "roads": "#bbaa88", - "water": "#294766", - "walls1": "#fffbf2", - "walls2": "#c1ccc1", - "roofs1": "#80664d", - "roofs2": "#665647", - "sky1": "#88ccff", - "sky2": "#ddeeff", - "sun": "#fffff0", - "windows": "#ffffff", - "sun_pos": "60.0", - "ambience": "0.6", - "lighted": "0.0", - "pitch": "1.0", - "roofedTowers": "true", - "towers": "Round", - "tree_shape": "Ellipsoid" -} \ No newline at end of file diff --git a/tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.pb b/tests/data_tests/1.1.2/ToyTown2/PaletteCaveObj.pb deleted file mode 100644 index cc735cc712b9ff286e9f8f6c0bfa3ccea28f4f1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmd-|b&2 zz+EEEij(6%qrh)QiBF79oE!%k1B+ z;^er?DDaL^;y { + const relPath = relative(dataRoot, fullPath); + const parts = relPath.split(sep); + const version = parts[0] || "unknown"; + return { + version, + relPath, + name: parts[parts.length - 1], + }; + }); +} + +export function groupDataFilesByVersion() { + const files = listDataFiles(); + const grouped = {}; + for (const file of files) { + if (!grouped[file.version]) grouped[file.version] = []; + grouped[file.version].push(file); + } + return grouped; +} + +export function findFileByName(files, name) { + return files.find((file) => file.name === name) || null; +} + +export function findFirstFile(files, predicate) { + return files.find(predicate) || null; +} From e94f49c7be8f62023c31a8d8dd56c73bb2f8c594 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 15:34:09 +0100 Subject: [PATCH 20/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.2]=20=20=D0=B3=D0=BB=D1=83=D0=BF=D0=B0=D1=8F=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/apps/ToyTown2.test.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/tests/apps/ToyTown2.test.js b/tests/apps/ToyTown2.test.js index a66858e..595ef57 100644 --- a/tests/apps/ToyTown2.test.js +++ b/tests/apps/ToyTown2.test.js @@ -21,6 +21,10 @@ for (const version of Object.keys(filesByVersion)) { files, (file) => file.name === "PaletteViewerObj.json" && file.relPath.includes("/ToyTown2/") ); + const palettePbFile = findFirstFile( + files, + (file) => file.name === "PaletteViewerObj.pb" && file.relPath.includes("/ToyTown2/") + ); const wrongPaletteFile = findFirstFile( files, (file) => file.name === "PaletteVillageObj.json" && file.relPath.includes("/Village/") @@ -33,7 +37,10 @@ for (const version of Object.keys(filesByVersion)) { files, (file) => file.name === "GeoObj.pb" && file.relPath.includes("/Village/") ); - const cavePbFile = findFileByName(files, "PaletteCaveObj.pb"); + const cavePbFile = findFirstFile( + files, + (file) => file.name === "PaletteCaveObj.pb" && file.relPath.includes("/Cave/") + ); describe(`ToyTown2 app data (${version})`, () => { it("exports all legacy viewer palette fields", () => { @@ -50,6 +57,12 @@ for (const version of Object.keys(filesByVersion)) { expect(() => paletteObjFromLegacyJsonText(JSON.stringify(paletteLegacy))).not.toThrow(); }); + it("imports viewer palette PB", () => { + if (!palettePbFile) return; + const pb = readTestBytes(palettePbFile.relPath); + expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); + }); + it("imports geo JSON and PB", () => { if (!geoJsonFile) return; const geoLegacy = readTestJson(geoJsonFile.relPath); @@ -59,10 +72,10 @@ for (const version of Object.keys(filesByVersion)) { expect(() => decodeCityFile("geo.pb", pb)).not.toThrow(); }); - it("accepts cave palette PB without type wrapper", () => { + it("rejects cave palette PB when viewer palette is expected", () => { if (!cavePbFile) return; const pb = readTestBytes(cavePbFile.relPath); - expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); + expect(() => decodePaletteFile("palette.pb", pb)).toThrow(/uploaded|expected|recognized|decoded/i); }); it("rejects village palette when viewer palette is expected", () => { From f4896b4288e215932e82574d69cea0a46f156b9f Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 15:53:47 +0100 Subject: [PATCH 21/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=20=D0=BA=20=D1=81=D0=B5?= =?UTF-8?q?=D0=BB=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/js/Village.js | 124 ++++++++++++++++++++++++++++++++++++++++++++++ src/js/mfcg.js | 39 ++++++++++++++- 3 files changed, 163 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6bdaaeb..33654ee 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fantasy-maphub", "name_full": "Fantasy MapHub Generators", - "version": "1.2.4-add-data-any-imports.2", + "version": "1.2.4-add-data-any-imports.3", "description": "An offline-first hub that bundles several Watabou map generators into one consistent web app: same UI patterns, local assets, and modern import/export. It adds OpenAPI docs, proto-first serialization (including pure protobuf files), and a PWA build so everything works without an internet connection.", "license": "MPL-2.0", "author": "mail@sunsung.fun", diff --git a/src/js/Village.js b/src/js/Village.js index 9daa13b..dd3cc94 100644 --- a/src/js/Village.js +++ b/src/js/Village.js @@ -5,6 +5,7 @@ import * as OthersShared from "./shared/others.js"; import * as FuncProto from "./shared/proto.js"; import * as DataVillage from "./shared/data/Village.js"; +import * as DataGeo from "./shared/data/data.js"; import * as DataProto from "./struct/data.js"; import * as FuncBin from "./shared/data/bin-verify.js"; @@ -16055,6 +16056,7 @@ var $lime_init = function (E, u) { f.addItem("Reroll village", r(this, this.rerollVillage)); f.addItem("Rename village...", r(this, this.rename)); f.addItem("View in 3D", r(this, this.onViewIn3D)); + f.addItem("Import...", r(this, this.onImport)); f.addSubmenu("Export as", d); f.addItem("Permalink...", r(this, this.showURL)); @@ -16223,6 +16225,128 @@ var $lime_init = function (E, u) { a.restoreVillage() })) }, + onImport: function () { + var a = this, + b = new Bg; + b.addEventListener("select", function (c) { + b.addEventListener("complete", r(a, a.onImportLoaded)); + b.load() + }); + var c = [new gj("Map", "*.json;*.pb;")]; + b.browse(c) + }, + onImportLoaded: function (a) { + try { + var b = Ka.__cast(a.target, Bg); + var c = this.decodeImportFile(b.name, b.data); + if ("mfcg" === c.generator) { + this.forwardImportToMfcg(c); + return + } + if ("vg" === c.generator || "village" === c.generator) { + this.applyImportedVillage(c.blueprint); + return + } + throw new Error("This file does not include Village or MFCG editor data.") + } catch (d) { + Qa.lastError = d; + w.showToast(d && d.message ? d.message : String(d)) + } + }, + decodeImportFile: function (a, b) { + var c = null, d = DataGeo.bytesToUtf8Text(b); + var f = null; + try { + c = JSON.parse(d); + f = !0 + } catch (e) { + f = !1 + } + if (f) { + var h = null; + null != c && "object" == typeof c && (h = c.embedProps != null ? c.embedProps : c.embedEditorPayload != null && c.embedEditorPayload.props != null ? c.embedEditorPayload.props : null); + return { + generator: h != null ? h.generator : null, + blueprint: h != null ? h.blueprint : null, + rawType: "json", + rawText: d + } + } + var k = DataGeo.toUint8Array(b); + if (null == k) throw new Error("Invalid data buffer."); + var p = k; + var l = null; + try { + l = FuncBin.importBin(k) + } catch (m) { + } + if (null != l) { + if (l.number != DataProto.data.DataType.geo) throw DataGeo.createTypeMismatchError(DataProto.data.DataType.geo, l.number); + p = new Uint8Array(l.buffer) + } + var n = null; + try { + n = DataProto.data.GeoObj.decode(p) + } catch (q) { + } + if (null == n) { + var g2 = this.stripLengthDelimited(p); + if (null != g2) try { + n = DataProto.data.GeoObj.decode(g2) + } catch (r2) { + } + } + if (null == n) throw new Error("An error occurred while parsing: file could not be recognized or decoded."); + var t = null; + n.embedProps != null && Object.hasOwnProperty.call(n, "embedProps") && (t = DataGeo.protoStructToJs(n.embedProps)); + null == t && n.embedEditorPayload != null && n.embedEditorPayload.props != null && (t = DataGeo.protoStructToJs(n.embedEditorPayload.props)); + return { + generator: t != null ? t.generator : null, + blueprint: t != null ? t.blueprint : null, + rawType: "proto", + rawBytes: k + } + }, + stripLengthDelimited: function (a) { + for (var b = 0, c = 0, d = 0; b < a.length && 35 > d;) { + var f = a[b++]; + c |= (f & 127) << d; + if (0 == (f & 128)) break; + d += 7 + } + if (!(0 >= b || b >= a.length || 0 >= c || b + c > a.length)) return a.subarray(b, b + c); + return null + }, + forwardImportToMfcg: function (a) { + if ("proto" === a.rawType) { + var b = a.rawBytes; + var c = "", d = 0; + for (; d < b.length;) { + var f = d + 32768; + f > b.length && (f = b.length); + c += String.fromCharCode.apply(null, b.subarray(d, f)); + d = f + } + window.localStorage.setItem("{{LOCALSTORAGE_TOWN_BUF}}", "p" + c) + } else { + window.localStorage.setItem("{{LOCALSTORAGE_TOWN_BUF}}", "j" + a.rawText) + } + this.goToMfcg(!1) + }, + applyImportedVillage: function (a) { + if (null == a || "object" != typeof a) throw new Error("This file does not include Village editor data."); + var b = null; + Array.isArray(a.tags) ? b = a.tags : "string" == typeof a.tags && (b = a.tags.split(",")); + var c = new jc(a.seed || 0, b, a.width != null ? a.width : 0, a.height != null ? a.height : 0); + a.treeSeed != null && (c.treeSeed = a.treeSeed); + c.name = a.name != null ? a.name : null; + c.pop = a.pop != null ? a.pop : 0; + c.numbered = Array.isArray(a.numbered) ? a.numbered : []; + c.varSeed = a.varSeed != null ? a.varSeed : 0; + c.style = a.style != null ? a.style : null; + null != c.style && x.setPalette(Rb.fromAsset(c.style)); + this.createVillage(c) + }, onViewIn3D: function (inNewWindow = true) { try { var a = this.village; diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 7e2c3d5..1a46d4d 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -1754,13 +1754,50 @@ var $lime_init = function (A, t) { ba.init(null, kd.prepare); K.restore(); this.stage.showDefaultContextMenu = !1; + var b = sb.takeLocalStorageTownBuf(); var a = Fd.fromURL(); null == a ? a = Fd.create(25, C.seed) : null != a.style && K.setPalette(Xc.fromAsset(a.style)); new Ub(a); - bb.call(this, Ec) + bb.call(this, Ec); + null != b && sb.applyLocalStorageTownBuf(b) }; g["fMain"] = sb; sb.__name__ = "fMain"; + sb.takeLocalStorageTownBuf = function () { + var a = null; + try { + var b = qf.getLocalStorage(); + if (null != b) { + a = b.getItem("{{LOCALSTORAGE_TOWN_BUF}}"); + null != a && b.removeItem("{{LOCALSTORAGE_TOWN_BUF}}") + } + } catch (c) { + Ta.lastError = c + } + return a + }; + sb.applyLocalStorageTownBuf = function (a) { + if (null == a || "" === a) return !1; + var b = a.charAt(0), + c = a.substring(1); + try { + if ("p" === b) { + var d = new Uint8Array(c.length); + for (var f = 0; f < c.length;) d[f] = c.charCodeAt(f) & 255, ++f; + a = be.decodeImportFile("mfcg.pb", d.buffer); + be.applyImportPayload(a.payload, a.state, a.url, a.blueprint, a.generator); + return !0 + } + if ("j" === b) { + a = be.decodeImportFile("mfcg.json", c); + be.applyImportPayload(a.payload, a.state, a.url, a.blueprint, a.generator); + return !0 + } + } catch (g) { + Ta.lastError = g + } + return !1 + }; sb.__super__ = bb; sb.prototype = v(bb.prototype, { getScale: function (a, From eb45920c76eec70659095d01a8c7335ce1e034c7 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 16:03:50 +0100 Subject: [PATCH 22/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=BF=D0=BE=D1=80=D1=82=20=D0=B2=20=D1=81=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=BE=D1=80=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/Village.js | 4 ++++ src/js/mfcg.js | 17 ++++------------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/js/Village.js b/src/js/Village.js index dd3cc94..2eaf32d 100644 --- a/src/js/Village.js +++ b/src/js/Village.js @@ -16263,8 +16263,11 @@ var $lime_init = function (E, u) { f = !1 } if (f) { + var g = DataGeo.detectLegacyRootType(c); + if (g != null && g !== DataProto.data.DataType.geo) throw DataGeo.createTypeMismatchError(DataProto.data.DataType.geo, g); var h = null; null != c && "object" == typeof c && (h = c.embedProps != null ? c.embedProps : c.embedEditorPayload != null && c.embedEditorPayload.props != null ? c.embedEditorPayload.props : null); + if (null == h) throw new Error("This format is too outdated and cannot be opened because it does not contain the necessary data."); return { generator: h != null ? h.generator : null, blueprint: h != null ? h.blueprint : null, @@ -16297,6 +16300,7 @@ var $lime_init = function (E, u) { } } if (null == n) throw new Error("An error occurred while parsing: file could not be recognized or decoded."); + if (n.embedProps == null && n.embedEditorPayload == null) throw new Error("This format is too outdated and cannot be opened because it does not contain the necessary data."); var t = null; n.embedProps != null && Object.hasOwnProperty.call(n, "embedProps") && (t = DataGeo.protoStructToJs(n.embedProps)); null == t && n.embedEditorPayload != null && n.embedEditorPayload.props != null && (t = DataGeo.protoStructToJs(n.embedEditorPayload.props)); diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 1a46d4d..59d7ad7 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -8021,10 +8021,7 @@ var $lime_init = function (A, t) { try { k = FuncBin.importBin(f) } catch (n) { - try { - console.error("MFCG import bin decode failed:", n); - } catch (p) { - } + k = f } if (null != k) { if (k.number != DataProto.data.DataType.geo) throw DataGeo.createTypeMismatchError(DataProto.data.DataType.geo, k.number); @@ -8034,26 +8031,20 @@ var $lime_init = function (A, t) { try { p = DataProto.data.GeoObj.decode(f) } catch (n2) { - try { - console.error("MFCG import proto decode failed:", n2); - } catch (p2) { - } + console.error("MFCG import proto decode failed:", n2); } if (null == p) { var g2 = be.stripLengthDelimited(f); if (null != g2) try { p = DataProto.data.GeoObj.decode(g2) } catch (m2) { - try { - console.error("MFCG import length-delimited proto decode failed:", m2); - } catch (p3) { - } + console.error("MFCG import length-delimited proto decode failed:", m2); } } if (null == p) throw new Error("An error occurred while parsing: file could not be recognized or decoded."); var r2 = p.type != null && (p.features != null || p.geometries != null || p.geometry != null || p.coordinates != null); if (!r2) throw new Error("An error occurred while parsing: file could not be recognized or decoded."); - if (p.embedProps == null && p.embedEditorPayload == null) throw new Error("Этот формат слишком устаревший и не может быть открыт, так как в нем нет нужных данных."); + if (p.embedProps == null && p.embedEditorPayload == null) throw new Error("This format is too outdated and cannot be opened because it does not contain the necessary data."); return be.extractPayloadFromProto(p) }; be.extractPayloadFromJson = function (a) { From 8cb76e0ba9da232b7e26aa4fe17a297feca684eb Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 16:10:19 +0100 Subject: [PATCH 23/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B5=D1=89=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BA=20=D1=81=D0=B5=D0=BB=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/apps/Village.test.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/apps/Village.test.js b/tests/apps/Village.test.js index ff3a914..57ab85e 100644 --- a/tests/apps/Village.test.js +++ b/tests/apps/Village.test.js @@ -4,6 +4,7 @@ import { paletteLegacyJsonFromObj, decodePaletteFile, } from "../../src/js/shared/data/Village.js"; +import { decodeCityFile } from "../../src/js/shared/data/data.js"; import { findFileByName, findFirstFile, @@ -24,6 +25,14 @@ for (const version of Object.keys(filesByVersion)) { files, (file) => file.name === "PaletteVillageObj.pb" && file.relPath.includes("/Village/") ); + const geoJsonFile = findFirstFile( + files, + (file) => file.name === "GeoObj.json" && file.relPath.includes("/Village/") + ); + const geoPbFile = findFirstFile( + files, + (file) => file.name === "GeoObj.pb" && file.relPath.includes("/Village/") + ); const wrongPaletteFile = findFirstFile( files, (file) => file.name === "PaletteMfcgObj.json" && file.relPath.includes("/mfcg/") @@ -47,10 +56,25 @@ for (const version of Object.keys(filesByVersion)) { expect(() => decodePaletteFile("palette.pb", pb)).not.toThrow(); }); + it("imports geo JSON and PB", () => { + if (!geoJsonFile) return; + const geoLegacy = readTestJson(geoJsonFile.relPath); + expect(() => decodeCityFile("geo.json", JSON.stringify(geoLegacy))).not.toThrow(); + if (!geoPbFile) return; + const pb = readTestBytes(geoPbFile.relPath); + expect(() => decodeCityFile("geo.pb", pb)).not.toThrow(); + }); + it("rejects mfcg palette when village palette is expected", () => { if (!wrongPaletteFile) return; const wrongPalette = readTestJson(wrongPaletteFile.relPath); expect(() => paletteObjFromLegacyJsonText(JSON.stringify(wrongPalette))).toThrow(/uploaded|expected/i); }); + + it("rejects palette data when geo data is expected", () => { + if (!paletteJsonFile || !geoJsonFile) return; + const paletteLegacy = readTestJson(paletteJsonFile.relPath); + expect(() => decodeCityFile("geo.json", JSON.stringify(paletteLegacy))).toThrow(/uploaded|expected/i); + }); }); } From b6ec3ad42daadebdf20c123a35263a77fd2abd88 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 16:33:55 +0100 Subject: [PATCH 24/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=87?= =?UTF-8?q?=D1=82=D0=BE=D0=B1=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D1=82=D0=B5=D1=80=D1=8F=D0=BB=20=D1=87=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D0=B8=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B3?= =?UTF-8?q?=D0=B5=D0=BD=D1=80=D0=B8=D1=82=20=D1=81=D0=BE=20=D1=81=D0=BB?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D1=8B=D0=BC=D0=B8=20=D0=BE=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B0=D0=BC=D0=B8=20=D1=82=D0=BE=20=D0=B8?= =?UTF-8?q?=D1=85=20=D0=BE=D1=82=D0=BA=D0=B8=D0=B4=D1=8B=D0=B2=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/Dwellings.js | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/js/Dwellings.js b/src/js/Dwellings.js index 512d6cf..8060493 100644 --- a/src/js/Dwellings.js +++ b/src/js/Dwellings.js @@ -5999,7 +5999,27 @@ var $lime_init = function (K, v) { Fa = a.charAt(h >> 2); 0 != (E.parseInt("0x" + Fa) >> (h & 3) & 1) && d.push(new Hf(l, f)) } - return Gf.cloud2gridNArea(d) + if (0 == d.length) return null; + var r = Gf.cloud2gridNArea(d); + if (null == r) return null; + if (!r.grid.isConnected(r.area)) { + var t = r.area.slice(), + u = null; + for (; 0 < t.length;) { + var y = md.fill(r.grid, t, t[0]); + (null == u || y.length > u.length) && (u = y); + for (var p = 0; p < y.length;) { + var n = y[p++]; + M.remove(t, n) + } + } + if (null != u && 0 < u.length) { + d = []; + for (p = 0; p < u.length;) n = u[p++], d.push(new Hf(n.j + r.trimx, n.i + r.trimy)); + r = Gf.cloud2gridNArea(d) + } + } + return r }; Cc.encodeBitmap = function (a) { var b = a[0].length, @@ -6804,7 +6824,15 @@ var $lime_init = function (K, v) { var grid=new Gf(c.maxJ-mj+1,c.maxI-mi+1); var house=Object.create(fd.prototype); - house.bp=Xd.random(0); + var bp=Object.create(Xd.prototype); + bp.seed=0; + bp.tags=[]; + bp.nFloors=a.floors!=null?a.floors.length:0; + bp.plan=null; + bp.width=0; + bp.height=0; + bp.name=null; + house.bp=bp; house.name=(""+embedName).trim(); house.floors=[]; house.basement=null; @@ -6918,6 +6946,8 @@ var $lime_init = function (K, v) { var fe=pr.fromEdge!=null?sb._edgeFromJson(pr.fromEdge,mi,mj,grid):null; var te=pr.toEdge!=null?sb._edgeFromJson(pr.toEdge,mi,mj,grid):null; fe!=null&&te!=null&&room.props.add(new di(fe,te)) + }else if(kind=="BED"){ + room.props.add(new Gk()) } } room.props.update() @@ -6948,7 +6978,8 @@ var $lime_init = function (K, v) { for(r=0;r Date: Sat, 14 Feb 2026 16:50:35 +0100 Subject: [PATCH 25/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=D0=B0=D1=8F=20=D0=BF=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B5=D1=81=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/mfcg.js | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 59d7ad7..da6ab4b 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -1785,12 +1785,12 @@ var $lime_init = function (A, t) { var d = new Uint8Array(c.length); for (var f = 0; f < c.length;) d[f] = c.charCodeAt(f) & 255, ++f; a = be.decodeImportFile("mfcg.pb", d.buffer); - be.applyImportPayload(a.payload, a.state, a.url, a.blueprint, a.generator); + be.applyImportPayload(a.payload, a.state, a.url, a.blueprint, a.generator, !0); return !0 } if ("j" === b) { a = be.decodeImportFile("mfcg.json", c); - be.applyImportPayload(a.payload, a.state, a.url, a.blueprint, a.generator); + be.applyImportPayload(a.payload, a.state, a.url, a.blueprint, a.generator, !0); return !0 } } catch (g) { @@ -7871,6 +7871,7 @@ var $lime_init = function (A, t) { }; g["classExport"] = be; be.__name__ = "classExport"; + be.importMode = !1; be.asPNG = function () { var a = Ub.instance, b = a.getViewport(), @@ -7929,7 +7930,7 @@ var $lime_init = function (A, t) { }; be.importFromFile = function (a, b) { var c = be.decodeImportFile(a, b); - return be.applyImportPayload(c.payload, c.state, c.url, c.blueprint, c.generator) + return be.applyImportPayload(c.payload, c.state, c.url, c.blueprint, c.generator, !0) }; be.goToVillageFromBlueprint = function (a) { if (a == null || "object" != typeof a) return !1; @@ -7960,7 +7961,7 @@ var $lime_init = function (A, t) { window.open(b, "_self"); return !0 }; - be.applyImportPayload = function (a, b, c, d, f) { + be.applyImportPayload = function (a, b, c, d, f, g) { var e = null; null == b && null != a && typeof a === "object" && (b = a.state); null == c && null != a && typeof a === "object" && (c = a.url); @@ -7978,13 +7979,24 @@ var $lime_init = function (A, t) { throw new Error("An error occurred while restoring the map: " + (h && h.message ? h.message : String(h))); } if (null == h) throw new Error("An error occurred while restoring the map."); + if (g) { + be.importMode = !0; + const url = new URL(window.location); + url.search = '?import_mode=1'; + window.history.replaceState({}, document.title, url); + } if (null != b && "object" == typeof b) { ba.init(); ba.data = b; ba.so.data = ba.data; ba.so.flush() } - if (null != c && "object" == typeof c) za.data = c, za.update(); + if (g) { + za.data = { + import_mode: "1" + }; + za.update() + } else if (null != c && "object" == typeof c) za.data = c, za.update(); K.restore(); Ub.instance = h; bb.switchScene(Ec); @@ -13656,12 +13668,14 @@ var $lime_init = function (A, t) { }, build: function (a) { this.saveFeatures(); + be.importMode = !1; new Ub(Fd.create(a, C.seed)); bb.switchScene(Ec); this.stage.set_focus(this) }, rebuild: function () { this.saveFeatures(); + be.importMode = !1; new Ub(Fd.similar(Ub.instance.bp)); bb.switchScene(Ec) }, @@ -13707,7 +13721,9 @@ var $lime_init = function (A, t) { var b = new ed; b.setMargins(0, 8); var c = new fb("Permalink"); + this.permalinkBtn = c; c.set_width(96); + c.set_enabled(!be.importMode); c.click.add(l(this, this.onCopyURL)); b.add(c); c = new fe("Export", ["PNG", "SVG", "JSON", "PROTO"]); @@ -13826,6 +13842,7 @@ var $lime_init = function (A, t) { onNewModel: function (a) { this.model = a; this.txtName.set_text(a.name); + null != this.permalinkBtn && this.permalinkBtn.set_enabled(!be.importMode); this.townInfo.update(a) }, onTitleChanged: function (a) { @@ -14091,6 +14108,7 @@ var $lime_init = function (A, t) { var Ec = function () { this.mouse = new I; ia.call(this); + this.permalinkDisabled = be.importMode; this.btnMenu = new fb("Menu", l(this, this.onMenu)); sb.preview || u.layer.addChild(this.btnMenu); this.fader = Ke.create(1, l(this, this.onFadeOut)) @@ -14306,7 +14324,7 @@ var $lime_init = function (A, t) { a.addItem("View in 3D", l(this, this.onViewIn3D)); a.addItem("Import...", l(this, this.onImport)); a.addSubmenu("Export as", c); - a.addItem("Permalink..", l(this, this.onPermalink)) + a.addItem("Permalink..", !this.permalinkDisabled ? l(this, this.onPermalink) : null) a.addSeparator(); c = function (c, f) { @@ -14334,6 +14352,7 @@ var $lime_init = function (A, t) { u.showDialog(new hh(this.model.addLandmark(this.mouse.clone()))) }, buildNew: function () { + be.importMode = !1; new Ub(Fd.create(Ub.nextSize, C.seed)); bb.switchScene(Ec) }, @@ -19555,6 +19574,7 @@ var $lime_init = function (A, t) { generate: function () { var a = this.input.get_text(); za.fromString(a); + be.importMode = !1; new Ub(Fd.fromURL()); bb.switchScene(Ec); a = u.findForm(Kd); @@ -20303,6 +20323,7 @@ var $lime_init = function (A, t) { za.set(a, b ? "1" : "0") }; za.getParams = function () { + if (be.importMode) return "?import_mode=1"; for (var a = "", b = za.data, c = ya.fields(b), d = 0; d < c.length;) { var f = c[d++]; a += ("" == a ? "?" : "&") + ("" + f + "=" + H.string(b[f])) @@ -20313,8 +20334,7 @@ var $lime_init = function (A, t) { return za.baseURL + za.getParams() }; za.update = function () { - window.history.replaceState(za.data, - "", za.getParams()) + window.history.replaceState(za.data, "", za.getParams()) }; za.fromString = function (a) { za.data = {}; From 6bd1067ef96dbca9e27c3bd4b3e8fdd6f6059443 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 16:53:24 +0100 Subject: [PATCH 26/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D0=BF=D1=80=D0=B8=D0=B2=D1=8C=D1=8E=D1=85?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/mfcg.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/js/mfcg.js b/src/js/mfcg.js index da6ab4b..87da044 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -7980,6 +7980,7 @@ var $lime_init = function (A, t) { } if (null == h) throw new Error("An error occurred while restoring the map."); if (g) { + var keepPreview = za.getFlag("preview") || sb.preview; be.importMode = !0; const url = new URL(window.location); url.search = '?import_mode=1'; @@ -7995,6 +7996,7 @@ var $lime_init = function (A, t) { za.data = { import_mode: "1" }; + keepPreview && (za.data.preview = "1"); za.update() } else if (null != c && "object" == typeof c) za.data = c, za.update(); K.restore(); @@ -20323,7 +20325,11 @@ var $lime_init = function (A, t) { za.set(a, b ? "1" : "0") }; za.getParams = function () { - if (be.importMode) return "?import_mode=1"; + if (be.importMode) { + var a = "?import_mode=1"; + (sb.preview || "1" === (za.data != null ? za.data.preview : null)) && (a += "&preview=1"); + return a + } for (var a = "", b = za.data, c = ya.fields(b), d = 0; d < c.length;) { var f = c[d++]; a += ("" == a ? "?" : "&") + ("" + f + "=" + H.string(b[f])) From 6fa3f4609c136215c18fe3470a3192499912c8f3 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 18:00:06 +0100 Subject: [PATCH 27/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D0=BA=D1=80=D0=B8=D0=B2=D0=BE=D0=B9=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=BB=D0=BE=D0=B0=D0=B4=D0=B5=D1=80=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20MFCG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/mfcg.js | 223 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 173 insertions(+), 50 deletions(-) diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 87da044..9724f7d 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -7872,65 +7872,188 @@ var $lime_init = function (A, t) { g["classExport"] = be; be.__name__ = "classExport"; be.importMode = !1; - be.asPNG = function () { - var a = Ub.instance, - b = a.getViewport(), - c = 40 * (null != a.focus ? .25 : 1), - d = b.width + c, - f = b.height + c; - b = gk.getMaxArea(ia.map); - c = Math.sqrt(Math.min(16777216 / (d * f), 67108864 / b)); - var h = c * d | 0, - k = c * f | 0; - b = new Fb(h, k, !1, K.colorPaper); - hb.trace(c, { - className: "classExport", - methodName: "asPNG", - customParams: [h, k] - }); - c = ia.inst; - k = c.rWidth; - var n = c.rHeight; - d *= c.get_mapScale(); - f *= c.get_mapScale(); - c.setSize(d, f); - f = h / d; - d = new ua; - d.scale(f, f); - f = ia.map; - h = 0; - for (var p = c.overlays; h < p.length;) { - var g = p[h]; - ++h; - g.exportPNG(!0) + be._busyOverlay = { + active: !1, + el: null, + textEl: null, + listeners: null, + ensure: function () { + if (null != this.el) return; + var a = window.document; + var b = a.createElement("div"); + b.id = "mfcg-busy-overlay"; + b.style.cssText = "position:fixed;inset:0;display:none;align-items:center;justify-content:center;text-align:center;background:rgba(0,0,0,0.55);color:#fff;z-index:2147483647;pointer-events:auto;"; + var c = a.createElement("div"); + c.style.cssText = "display:flex;flex-direction:column;align-items:center;gap:12px;padding:18px 22px;border-radius:10px;background:rgba(0,0,0,0.6);box-shadow:0 8px 24px rgba(0,0,0,0.4);max-width:80vw;"; + var d = a.createElement("div"); + d.style.cssText = "width:28px;height:28px;border:3px solid rgba(255,255,255,0.35);border-top-color:#fff;border-radius:50%;animation:mfcg-busy-spin 0.8s linear infinite;"; + var f = a.createElement("div"); + f.style.cssText = "font:16px/1.4 'Share Tech Mono', monospace;letter-spacing:0.02em;"; + f.textContent = "Working..."; + c.appendChild(d); + c.appendChild(f); + b.appendChild(c); + this.el = b; + this.textEl = f; + (a.body || a.documentElement).appendChild(b); + if (null == a.getElementById("mfcg-busy-style")) { + var h = a.createElement("style"); + h.id = "mfcg-busy-style"; + h.textContent = "@keyframes mfcg-busy-spin{to{transform:rotate(360deg);}}"; + (a.head || a.documentElement).appendChild(h) + } + }, + attach: function () { + if (null != this.listeners) return; + var a = this; + var b = function (c) { + if (!a.active) return; + c.preventDefault(); + c.stopPropagation(); + return !1 + }; + var c = { + capture: !0, + passive: !1 + }; + var d = window.document; + var f = ["keydown", "keyup", "keypress", "mousedown", "mouseup", "click", "dblclick", "contextmenu", "wheel", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup"]; + var h = 0; + for (; h < f.length;) d.addEventListener(f[h++], b, c); + this.listeners = { + handler: b, + options: c, + events: f + }; + try { + null != d.activeElement && d.activeElement.blur() + } catch (k) { + } + }, + detach: function () { + if (null == this.listeners) return; + var a = window.document; + var b = this.listeners.events; + var c = this.listeners.handler; + var d = this.listeners.options; + var f = 0; + for (; f < b.length;) a.removeEventListener(b[f++], c, d); + this.listeners = null + }, + show: function (a) { + this.ensure(); + this.textEl.textContent = null != a && "" !== a ? a : "Working..."; + this.el.style.display = "flex"; + this.active = !0; + this.attach() + }, + hide: function () { + if (null == this.el) return; + this.active = !1; + this.el.style.display = "none"; + this.detach() } - var q = f.get_transform().get_matrix().clone(); - q.concat(d); - b.draw(f, q, null, null, null, !0); - h = 0; - for (p = c.overlays; h < p.length;) g = p[h], ++h, g.get_visible() && (q = g.get_transform().get_matrix().clone(), q.concat(d), b.draw(g, q, null, null, null, !0)); - c.setSize(k, n); - c.resetOverlays(); - ge.savePNG(b, a.name) + }; + be.runBusy = function (a, b, c) { + be._busyOverlay.show(a); + var d = function () { + try { + b() + } catch (f) { + if ("function" == typeof c) { + c(f); + return + } + throw f + } finally { + be._busyOverlay.hide() + } + }; + if (null != window.requestAnimationFrame) { + window.requestAnimationFrame(function () { + window.setTimeout(d, 0) + }) + } else window.setTimeout(d, 0) + }; + be.asPNG = function () { + return be.runBusy("Exporting PNG...", function () { + var a = Ub.instance, + b = a.getViewport(), + c = 40 * (null != a.focus ? .25 : 1), + d = b.width + c, + f = b.height + c; + b = gk.getMaxArea(ia.map); + c = Math.sqrt(Math.min(16777216 / (d * f), 67108864 / b)); + var h = c * d | 0, + k = c * f | 0; + b = new Fb(h, k, !1, K.colorPaper); + hb.trace(c, { + className: "classExport", + methodName: "asPNG", + customParams: [h, k] + }); + c = ia.inst; + k = c.rWidth; + var n = c.rHeight; + d *= c.get_mapScale(); + f *= c.get_mapScale(); + c.setSize(d, f); + f = h / d; + d = new ua; + d.scale(f, f); + f = ia.map; + h = 0; + for (var p = c.overlays; h < p.length;) { + var g = p[h]; + ++h; + g.exportPNG(!0) + } + var q = f.get_transform().get_matrix().clone(); + q.concat(d); + b.draw(f, q, null, null, null, !0); + h = 0; + for (p = c.overlays; h < p.length;) g = p[h], ++h, g.get_visible() && (q = g.get_transform().get_matrix().clone(), q.concat(d), b.draw(g, q, null, null, null, !0)); + c.setSize(k, n); + c.resetOverlays(); + ge.savePNG(b, a.name) + }, function (a) { + q.show(a && a.message ? a.message : String(a)) + }) }; be.asSVG = function () { - var a = Ub.instance, - b = Rd.export(a, ia.inst); - a = a.name; - ge.saveText('' + Df.print(b.root), "" + a + ".mf.svg", "image/svg+xml") + return be.runBusy("Exporting SVG...", function () { + var a = Ub.instance, + b = Rd.export(a, ia.inst); + a = a.name; + ge.saveText('' + Df.print(b.root), "" + a + ".mf.svg", "image/svg+xml") + }, function (a) { + q.show(a && a.message ? a.message : String(a)) + }) }; be.asJSON = function () { - var a = Ub.instance, b = lg.export(a); - a = a.name, ge.saveText(lg.stringify(b), "" + a + ".mf.json", "application/json"); + return be.runBusy("Exporting JSON...", function () { + var a = Ub.instance, b = lg.export(a); + a = a.name, ge.saveText(lg.stringify(b), "" + a + ".mf.json", "application/json"); + }, function (a) { + q.show(a && a.message ? a.message : String(a)) + }) }; be.asPROTO = function () { - var a = Ub.instance, b = lg.export(a), c = DataProto.data.GeoObj.encode(b).finish(); - var bb = FuncBin.exportBin(c, DataProto.data.DataType.geo); - a = a.name, ge.saveBinary(Td.fromArrayBuffer(bb), "" + a + ".mf.pb", "application/x-protobuf") + return be.runBusy("Exporting PROTO...", function () { + var a = Ub.instance, b = lg.export(a), c = DataProto.data.GeoObj.encode(b).finish(); + var bb = FuncBin.exportBin(c, DataProto.data.DataType.geo); + a = a.name, ge.saveBinary(Td.fromArrayBuffer(bb), "" + a + ".mf.pb", "application/x-protobuf") + }, function (a) { + q.show(a && a.message ? a.message : String(a)) + }) }; be.importFromFile = function (a, b) { - var c = be.decodeImportFile(a, b); - return be.applyImportPayload(c.payload, c.state, c.url, c.blueprint, c.generator, !0) + return be.runBusy("Importing file...", function () { + var c = be.decodeImportFile(a, b); + return be.applyImportPayload(c.payload, c.state, c.url, c.blueprint, c.generator, !0) + }, function (c) { + q.show(c && c.message ? c.message : String(c)) + }) }; be.goToVillageFromBlueprint = function (a) { if (a == null || "object" != typeof a) return !1; From 4c55727bec1800c89ddb9edd14f7486f66632563 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 18:18:58 +0100 Subject: [PATCH 28/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D1=84=D0=B8=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/mfcg.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 9724f7d..cf284fb 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -7889,7 +7889,7 @@ var $lime_init = function (A, t) { d.style.cssText = "width:28px;height:28px;border:3px solid rgba(255,255,255,0.35);border-top-color:#fff;border-radius:50%;animation:mfcg-busy-spin 0.8s linear infinite;"; var f = a.createElement("div"); f.style.cssText = "font:16px/1.4 'Share Tech Mono', monospace;letter-spacing:0.02em;"; - f.textContent = "Working..."; + f.textContent = "Please wait..."; c.appendChild(d); c.appendChild(f); b.appendChild(c); @@ -7942,7 +7942,7 @@ var $lime_init = function (A, t) { }, show: function (a) { this.ensure(); - this.textEl.textContent = null != a && "" !== a ? a : "Working..."; + this.textEl.textContent = null != a && "" !== a ? a : "Please wait..."; this.el.style.display = "flex"; this.active = !0; this.attach() @@ -7971,12 +7971,14 @@ var $lime_init = function (A, t) { }; if (null != window.requestAnimationFrame) { window.requestAnimationFrame(function () { - window.setTimeout(d, 0) + window.requestAnimationFrame(function () { + window.setTimeout(d, 0) + }) }) } else window.setTimeout(d, 0) }; be.asPNG = function () { - return be.runBusy("Exporting PNG...", function () { + return be.runBusy("Exporting PNG file...", function () { var a = Ub.instance, b = a.getViewport(), c = 40 * (null != a.focus ? .25 : 1), @@ -8021,7 +8023,7 @@ var $lime_init = function (A, t) { }) }; be.asSVG = function () { - return be.runBusy("Exporting SVG...", function () { + return be.runBusy("Exporting SVG file...", function () { var a = Ub.instance, b = Rd.export(a, ia.inst); a = a.name; @@ -8031,7 +8033,7 @@ var $lime_init = function (A, t) { }) }; be.asJSON = function () { - return be.runBusy("Exporting JSON...", function () { + return be.runBusy("Exporting JSON file...", function () { var a = Ub.instance, b = lg.export(a); a = a.name, ge.saveText(lg.stringify(b), "" + a + ".mf.json", "application/json"); }, function (a) { @@ -8039,7 +8041,7 @@ var $lime_init = function (A, t) { }) }; be.asPROTO = function () { - return be.runBusy("Exporting PROTO...", function () { + return be.runBusy("Exporting PROTO file...", function () { var a = Ub.instance, b = lg.export(a), c = DataProto.data.GeoObj.encode(b).finish(); var bb = FuncBin.exportBin(c, DataProto.data.DataType.geo); a = a.name, ge.saveBinary(Td.fromArrayBuffer(bb), "" + a + ".mf.pb", "application/x-protobuf") @@ -8048,7 +8050,7 @@ var $lime_init = function (A, t) { }) }; be.importFromFile = function (a, b) { - return be.runBusy("Importing file...", function () { + return be.runBusy("Importing map file...", function () { var c = be.decodeImportFile(a, b); return be.applyImportPayload(c.payload, c.state, c.url, c.blueprint, c.generator, !0) }, function (c) { From d6ef2df539f11bfa97860c9bbb90834ffc9f7e0b Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 18:28:09 +0100 Subject: [PATCH 29/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D0=BF=D1=80=D0=B5=D0=BB=D0=BE=D0=B0=D0=B4?= =?UTF-8?q?=D0=B5=D1=80=20=D0=B4=D0=BB=D1=8F=20=D1=82=D1=80=D0=B8=D0=B4?= =?UTF-8?q?=D0=B5=D1=88=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/ToyTown2.js | 160 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 142 insertions(+), 18 deletions(-) diff --git a/src/js/ToyTown2.js b/src/js/ToyTown2.js index 6750ebd..8ea8da3 100644 --- a/src/js/ToyTown2.js +++ b/src/js/ToyTown2.js @@ -18669,6 +18669,116 @@ if (params !== null) (function (S, u) { }; g["toytown2.scenes.TownScene"] = Va; Va.__name__ = "toytown2.scenes.TownScene"; + Va._busyOverlay = { + active: !1, + el: null, + textEl: null, + listeners: null, + ensure: function () { + if (null != this.el) return; + var a = window.document; + var b = a.createElement("div"); + b.id = "toytown2-busy-overlay"; + b.style.cssText = "position:fixed;inset:0;display:none;align-items:center;justify-content:center;text-align:center;background:rgba(0,0,0,0.55);color:#fff;z-index:2147483647;pointer-events:auto;"; + var c = a.createElement("div"); + c.style.cssText = "display:flex;flex-direction:column;align-items:center;gap:12px;padding:18px 22px;border-radius:10px;background:rgba(0,0,0,0.6);box-shadow:0 8px 24px rgba(0,0,0,0.4);max-width:80vw;"; + var d = a.createElement("div"); + d.style.cssText = "width:28px;height:28px;border:3px solid rgba(255,255,255,0.35);border-top-color:#fff;border-radius:50%;animation:toytown2-busy-spin 0.8s linear infinite;"; + var f = a.createElement("div"); + f.style.cssText = "font:16px/1.4 'Share Tech Mono', monospace;letter-spacing:0.02em;"; + f.textContent = "Please wait..."; + c.appendChild(d); + c.appendChild(f); + b.appendChild(c); + this.el = b; + this.textEl = f; + (a.body || a.documentElement).appendChild(b); + if (null == a.getElementById("toytown2-busy-style")) { + var h = a.createElement("style"); + h.id = "toytown2-busy-style"; + h.textContent = "@keyframes toytown2-busy-spin{to{transform:rotate(360deg);}}"; + (a.head || a.documentElement).appendChild(h) + } + }, + attach: function () { + if (null != this.listeners) return; + var a = this; + var b = function (c) { + if (!a.active) return; + c.preventDefault(); + c.stopPropagation(); + return !1 + }; + var c = { + capture: !0, + passive: !1 + }; + var d = window.document; + var f = ["keydown", "keyup", "keypress", "mousedown", "mouseup", "click", "dblclick", "contextmenu", "wheel", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup"]; + var h = 0; + for (; h < f.length;) d.addEventListener(f[h++], b, c); + this.listeners = { + handler: b, + options: c, + events: f + }; + try { + null != d.activeElement && d.activeElement.blur() + } catch (k) { + } + }, + detach: function () { + if (null == this.listeners) return; + var a = window.document; + var b = this.listeners.events; + var c = this.listeners.handler; + var d = this.listeners.options; + var f = 0; + for (; f < b.length;) a.removeEventListener(b[f++], c, d); + this.listeners = null + }, + show: function (a) { + this.ensure(); + this.textEl.textContent = null != a && "" !== a ? a : "Please wait..."; + this.el.style.display = "flex"; + this.active = !0; + this.attach() + }, + hide: function () { + if (null == this.el) return; + this.active = !1; + this.el.style.display = "none"; + this.detach() + } + }; + Va.runBusy = function (a, b, c, d) { + var f = !Va._busyOverlay.active; + if (f) { + Va._busyOverlay.show(a); + d && null != Va._busyOverlay.el && Va._busyOverlay.el.offsetHeight + } + var h = function () { + try { + return b() + } catch (k) { + if ("function" == typeof c) { + c(k); + return + } + throw k + } finally { + f && Va._busyOverlay.hide() + } + }; + if (d) return h(); + if (null != window.requestAnimationFrame) { + window.requestAnimationFrame(function () { + window.requestAnimationFrame(function () { + window.setTimeout(h, 0) + }) + }) + } else window.setTimeout(h, 0) + }; Va.__super__ = oe; Va.prototype = l(oe.prototype, { activate: function () { @@ -18973,27 +19083,37 @@ if (params !== null) (function (S, u) { b = new Of; b.addEventListener("select", function (c) { b.addEventListener("complete", function (c) { - a.load(b.get_name(), b.data) + Va.runBusy("Importing map file...", function () { + a.load(b.get_name(), b.data, !0) + }, function (d) { + Ma.showMessage(d && d.message ? d.message : String(d)) + }) }); b.load() }); var c = [new ti("Cities", "*.json;*.pb;")]; b.browse(c) }, - load: function (a, b) { - if (null != a) try { - var c = DataGeo.decodeCityFile(a, b); - new bc(a, c) - } catch (d) { - Ia.lastError = d; - a = fa.caught(d).unwrap(); - Ma.showMessage(n.string(a)); - return !1 - } - Va.view.reset(bc.instance); - null != a && (this.defaultView(!0), this.modeFly.runner = null); - this.updateFog(); - return !0 + load: function (a, b, c) { + var d = this; + var e = function () { + if (null != a) try { + var c = DataGeo.decodeCityFile(a, b); + new bc(a, c) + } catch (f) { + Ia.lastError = f; + a = fa.caught(f).unwrap(); + Ma.showMessage(n.string(a)); + return !1 + } + Va.view.reset(bc.instance); + null != a && (d.defaultView(!0), d.modeFly.runner = null); + d.updateFog(); + return !0 + }; + return c ? e() : Va.runBusy("Updating scene...", e, function (f) { + Ma.showMessage(f && f.message ? f.message : String(f)) + }, !0) }, updateFog: function () { this.navMode == this.modeStare ? Va.view.disableFog() : this.navMode == this.modeOrtho ? Va.view.enableOrthFog() : Va.view.enableFog() @@ -19018,9 +19138,13 @@ if (params !== null) (function (S, u) { this.stage.set_displayState(2 == this.stage.get_displayState() ? 1 : 2) }, "export": function () { - var a = bc.instance.name + ".obj", - b = tl.export(Va.view.buildings); - Og.saveText(b, a, "text/plain") + Va.runBusy("Exporting OBJ file...", function () { + var a = bc.instance.name + ".obj", + b = tl.export(Va.view.buildings); + Og.saveText(b, a, "text/plain") + }, function (b) { + Ma.showMessage(b && b.message ? b.message : String(b)) + }) }, goToPrimarySource: function (inNewWindow = true) { const adr = FuncProto.paramsUrlString(params.routes.primary_source); From f66d709bc90c127fb280c4834995a1a27246e812 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 19:01:17 +0100 Subject: [PATCH 30/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=20=D1=82=D1=80=D0=B0=D0=BD=D1=81=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8F=D0=BC=D0=B8=20=D0=B5=D0=BD?= =?UTF-8?q?=D1=83=D0=BC=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/ToyTown2.js | 24 +++++++++++++++++++++--- src/js/shared/data/data.js | 31 ++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/js/ToyTown2.js b/src/js/ToyTown2.js index 8ea8da3..6de42ff 100644 --- a/src/js/ToyTown2.js +++ b/src/js/ToyTown2.js @@ -5494,11 +5494,18 @@ if (params !== null) (function (S, u) { a = this._vertexData.get_length() / 13 | 0; a != this._numVertices && this.disposeVertexBuffers(this._vertexBuffer); this._numVertices = a; - if (0 == this._numVertices) throw new Fa("Bad data: geometry can't have zero triangles"); + if (0 == this._numVertices) { + this._activeBuffer = null; + this._activeContext = null; + this._activeDataInvalid = !1; + this.invalidateBounds(); + return + } this.invalidateBuffers(this._vertexDataInvalid); this.invalidateBounds() }, activateVertexBuffer: function (a, b) { + if (0 == this._numVertices) return; var c = b._stage3DIndex, d = b._context3D; c != this._contextIndex && this.updateActiveBuffer(c); @@ -5507,6 +5514,7 @@ if (params !== null) (function (S, u) { d.setVertexBufferAt(a, this._activeBuffer, 0, 3) }, activateUVBuffer: function (a, b) { + if (0 == this._numVertices) return; var c = b._stage3DIndex, d = b._context3D; this._uvsDirty && this._autoGenerateUVs && (this._vertexData = this.updateDummyUVs(this._vertexData), this.invalidateBuffers(this._vertexDataInvalid)); @@ -5516,6 +5524,7 @@ if (params !== null) (function (S, u) { d.setVertexBufferAt(a, this._activeBuffer, 9, 2) }, activateSecondaryUVBuffer: function (a, b) { + if (0 == this._numVertices) return; var c = b._stage3DIndex, d = b._context3D; c != this._contextIndex && this.updateActiveBuffer(c); @@ -5525,10 +5534,12 @@ if (params !== null) (function (S, u) { 11, 2) }, uploadData: function (a) { + if (0 == this._numVertices) return; this._activeBuffer.uploadFromVector(this._vertexData, 0, this._numVertices); this._vertexDataInvalid.set(a, this._activeDataInvalid = !1) }, activateVertexNormalBuffer: function (a, b) { + if (0 == this._numVertices) return; var c = b._stage3DIndex, d = b._context3D; c != this._contextIndex && this.updateActiveBuffer(c); @@ -5537,6 +5548,7 @@ if (params !== null) (function (S, u) { d.setVertexBufferAt(a, this._activeBuffer, 3, 3) }, activateVertexTangentBuffer: function (a, b) { + if (0 == this._numVertices) return; var c = b._stage3DIndex, d = b._context3D; @@ -17303,8 +17315,6 @@ if (params !== null) (function (S, u) { h = Math.sqrt(kd.area(e)) / 2; var r = kd.center(e).get_length() / f; h *= 1 + Math.pow(1 - r, 2); - 100 < h && console.log( - e); Ka.gableRoofs && 0 < aa.pitch ? Rg.add(this.buildings.fa, e, h, aa.pitch) : Pf.add(this.buildings.fa, e, h); this.buildings.manage() } @@ -17666,6 +17676,10 @@ if (params !== null) (function (S, u) { ia.addWindowlessWall(a, b, c, d, e, f); return; } + if (n > 200 || l > 200 || n * l > 2000) { + ia.addWindowlessWall(a, b, c, d, e, f); + return; + } if (1 > n || 1 > l) ia.addWindowlessWall(a, b, c, d, e, f); else { var p = (r - 1.2 * l) / (k + (l - 1) * m + q); @@ -18509,6 +18523,8 @@ if (params !== null) (function (S, u) { switch (b) { case DataProto.data.GeoType[DataProto.data.GeoType.Feature]: return this.getMultiPolygon(a.geometry); + case DataProto.data.GeoType[DataProto.data.GeoType.Polygon]: + return [this.getPolygon(a)]; case DataProto.data.GeoType[DataProto.data.GeoType.MultiPolygon]: a = a.coordinates; b = []; @@ -18552,6 +18568,7 @@ if (params !== null) (function (S, u) { }, getMultiLineString: function (a) { if (DataProto.data.GeoType[DataProto.data.GeoType.Feature] == a.type) return this.getMultiLineString(a.geometry); + if (DataProto.data.GeoType[DataProto.data.GeoType.LineString] == a.type) return [this.getLineString(a)]; a = a.coordinates; for (var b = [], c = 0; c < a.length;) { var d = a[c]; @@ -19076,6 +19093,7 @@ if (params !== null) (function (S, u) { loadSample: function () { Va.shuffleStyles && this.loadPresetStyle(); Va.lastSample = yb.random(yb.difference(Va.samples, [Va.lastSample])); + console.log("ToyTown2 sample:", Va.lastSample); this.load(Va.lastSample, mc.getText(Va.lastSample)) }, loadExternal: function () { diff --git a/src/js/shared/data/data.js b/src/js/shared/data/data.js index e07baa6..9b2351f 100644 --- a/src/js/shared/data/data.js +++ b/src/js/shared/data/data.js @@ -312,6 +312,35 @@ function decodeCityFromJsonTextAsProto(text) { } export function decodeCityFile(name, data) { + let generatorOverride = null; + let text = bytesToUtf8Text(data); + if (typeof text === "string") { + try { + let obj = JSON.parse(text); + if (obj != null && Array.isArray(obj.features)) { + for (let i = 0; i < obj.features.length; i++) { + let f = obj.features[i]; + let id = readProp(f, "id"); + if (id === "values") { + let gen = readProp(f, "generator"); + if (gen === "hood" || gen === "hoods") generatorOverride = gen; + break; + } + } + } + } catch (e) {} + } let msg = decodeDataFromFile(DT.geo, decodeCityFromJsonTextAsProto, data); - return geoJsonFromProtoMessage(msg); + let out = geoJsonFromProtoMessage(msg); + if (generatorOverride && out != null && Array.isArray(out.features)) { + for (let j = 0; j < out.features.length; j++) { + let f2 = out.features[j]; + let id2 = readProp(f2, "id"); + if (id2 === "values") { + f2.generator = generatorOverride; + break; + } + } + } + return out; } From be0a72da46a70ff2db3cd0d65f47e6fb6af0cee5 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 19:16:22 +0100 Subject: [PATCH 31/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D0=BE=D0=B2=D0=B5=D1=80=D0=BB=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B5=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/Village.js | 208 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 165 insertions(+), 43 deletions(-) diff --git a/src/js/Village.js b/src/js/Village.js index 2eaf32d..154a706 100644 --- a/src/js/Village.js +++ b/src/js/Village.js @@ -7684,6 +7684,111 @@ var $lime_init = function (E, u) { }; g["system.Exporter"] = Sd; Sd.__name__ = "system.Exporter"; + Sd._busyOverlay = { + active: !1, + el: null, + textEl: null, + listeners: null, + ensure: function () { + if (null != this.el) return; + var a = window.document; + var b = a.createElement("div"); + b.id = "vg-busy-overlay"; + b.style.cssText = "position:fixed;inset:0;display:none;align-items:center;justify-content:center;text-align:center;background:rgba(0,0,0,0.55);color:#fff;z-index:2147483647;pointer-events:auto;"; + var c = a.createElement("div"); + c.style.cssText = "display:flex;flex-direction:column;align-items:center;gap:12px;padding:18px 22px;border-radius:10px;background:rgba(0,0,0,0.6);box-shadow:0 8px 24px rgba(0,0,0,0.4);max-width:80vw;"; + var d = a.createElement("div"); + d.style.cssText = "width:28px;height:28px;border:3px solid rgba(255,255,255,0.35);border-top-color:#fff;border-radius:50%;animation:vg-busy-spin 0.8s linear infinite;"; + var f = a.createElement("div"); + f.style.cssText = "font:16px/1.4 'Share Tech Mono', monospace;letter-spacing:0.02em;"; + f.textContent = "Please wait..."; + c.appendChild(d); + c.appendChild(f); + b.appendChild(c); + this.el = b; + this.textEl = f; + (a.body || a.documentElement).appendChild(b); + if (null == a.getElementById("vg-busy-style")) { + var h = a.createElement("style"); + h.id = "vg-busy-style"; + h.textContent = "@keyframes vg-busy-spin{to{transform:rotate(360deg);}}"; + (a.head || a.documentElement).appendChild(h) + } + }, + attach: function () { + if (null != this.listeners) return; + var a = this; + var b = function (c) { + if (!a.active) return; + c.preventDefault(); + c.stopPropagation(); + return !1 + }; + var c = { + capture: !0, + passive: !1 + }; + var d = window.document; + var f = ["keydown", "keyup", "keypress", "mousedown", "mouseup", "click", "dblclick", "contextmenu", "wheel", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup"]; + var h = 0; + for (; h < f.length;) d.addEventListener(f[h++], b, c); + this.listeners = { + handler: b, + options: c, + events: f + }; + try { + null != d.activeElement && d.activeElement.blur() + } catch (k) { + } + }, + detach: function () { + if (null == this.listeners) return; + var a = window.document; + var b = this.listeners.events; + var c = this.listeners.handler; + var d = this.listeners.options; + var f = 0; + for (; f < b.length;) a.removeEventListener(b[f++], c, d); + this.listeners = null + }, + show: function (a) { + this.ensure(); + this.textEl.textContent = null != a && "" !== a ? a : "Please wait..."; + this.el.style.display = "flex"; + this.active = !0; + this.attach() + }, + hide: function () { + if (null == this.el) return; + this.active = !1; + this.el.style.display = "none"; + this.detach() + } + }; + Sd.runBusy = function (a, b, c) { + Sd._busyOverlay.show(a); + var d = function () { + try { + b() + } catch (f) { + if ("function" == typeof c) { + c(f); + return + } + throw f + } finally { + Sd._busyOverlay.hide() + } + }; + if (null != window.requestAnimationFrame) { + window.requestAnimationFrame(function () { + window.requestAnimationFrame(function () { + window.setTimeout(d, 0) + }) + }) + } else window.setTimeout(d, 0) + }; Sd.saveBinary = function (a, b, c) { b = Sd.fixName(b); a = wd.toArrayBuffer(a); @@ -9405,12 +9510,20 @@ var $lime_init = function (E, u) { }; g["village.JSONExporter"] = Hh, Hh.__name__ = "village.JSONExporter", Hh.export = function (a) { - var b = Hh.getProto(a), c = Hh.stringifyProto(b); - return Sd.saveText(c, a.name + ".vg.json", "application/json"), b + return Sd.runBusy("Exporting JSON file...", function () { + var b = Hh.getProto(a), c = Hh.stringifyProto(b); + Sd.saveText(c, a.name + ".vg.json", "application/json") + }, function (b) { + w.showToast(b && b.message ? b.message : String(b)) + }) }, Hh.exportBinary = function (a) { - var b = Hh.getProto(a), c = DataProto.data.GeoObj.encode(b).finish(); - var d = FuncBin.exportBin(c, DataProto.data.DataType.geo); - return Sd.saveBinary(wd.fromArrayBuffer(d), a.name + ".vg.pb", "application/x-protobuf"), b + return Sd.runBusy("Exporting PROTO file...", function () { + var b = Hh.getProto(a), c = DataProto.data.GeoObj.encode(b).finish(); + var d = FuncBin.exportBin(c, DataProto.data.DataType.geo); + Sd.saveBinary(wd.fromArrayBuffer(d), a.name + ".vg.pb", "application/x-protobuf") + }, function (b) { + w.showToast(b && b.message ? b.message : String(b)) + }) }, Hh._blueprintForExport = function (a) { if (a == null) return null; @@ -12254,35 +12367,43 @@ var $lime_init = function (E, u) { this.plate.set_y(b.y) }, exportPNG: function () { - var a = Math.sqrt(16777215 / (this.village.viewW2 * this.village.viewH2 * 4)), - b = 2 * this.village.viewW2 * a | 0, - c = 2 * this.village.viewH2 * a | 0, - d = new Jb(b, c, !1, x.colorGround[0]), - f = new sa; - f.scale(a, a); - f.translate(b / 2, c / 2); - this.numbers.prepareForExport(); - d.draw(this.map, f, null, null, null, !0); - this.numbers.update(this.village); - na.showTitle && (f = new sa, f.translate(this.plate.get_x() - this.rect.get_left(), this.plate.get_y() - this.rect.get_top()), f.scale(a / this.map.get_scaleX(), a / this.map.get_scaleY()), this.plate.prepareForExport(), - d.draw(this.plate, f), this.removeChild(this.plate), this.plate = new Kg(this.village), this.plate.set_visible(na.showTitle), this.addChild(this.plate), this.layoutPlate()); - Sd.savePNG(d, this.village.name) + return Sd.runBusy("Exporting PNG file...", function () { + var a = Math.sqrt(16777215 / (this.village.viewW2 * this.village.viewH2 * 4)), + b = 2 * this.village.viewW2 * a | 0, + c = 2 * this.village.viewH2 * a | 0, + d = new Jb(b, c, !1, x.colorGround[0]), + f = new sa; + f.scale(a, a); + f.translate(b / 2, c / 2); + this.numbers.prepareForExport(); + d.draw(this.map, f, null, null, null, !0); + this.numbers.update(this.village); + na.showTitle && (f = new sa, f.translate(this.plate.get_x() - this.rect.get_left(), this.plate.get_y() - this.rect.get_top()), f.scale(a / this.map.get_scaleX(), a / this.map.get_scaleY()), this.plate.prepareForExport(), + d.draw(this.plate, f), this.removeChild(this.plate), this.plate = new Kg(this.village), this.plate.set_visible(na.showTitle), this.addChild(this.plate), this.layoutPlate()); + Sd.savePNG(d, this.village.name) + }.bind(this), function (a) { + w.showToast(a && a.message ? a.message : String(a)) + }) }, exportSVG: function () { - var a = Ha.create(2 * this.village.viewW2, 2 * this.village.viewH2, x.colorGround[0]); - Ha.substituteFont = na.fixFontNames; - Ha.handleObject = qc.toSVG; - var b = Ha.drawSprite(this); - la.clearTransform(b); - la.translate(b, -this.rect.get_left(), -this.rect.get_top()); - la.scale(b, 1 / this.map.get_scaleX(), 1 / this.map.get_scaleY()); - var c = Ha.getImports(); - a.root.addChild(c); - c = Ha.getGradients(); - a.root.addChild(c); - na.showShading && (c = qc.getFilterSVG(), a.root.addChild(c)); - a.root.addChild(b); - Sd.saveText('' + mf.print(a.root), this.village.name + ".vg.svg", "image/svg+xml") + return Sd.runBusy("Exporting SVG file...", function () { + var a = Ha.create(2 * this.village.viewW2, 2 * this.village.viewH2, x.colorGround[0]); + Ha.substituteFont = na.fixFontNames; + Ha.handleObject = qc.toSVG; + var b = Ha.drawSprite(this); + la.clearTransform(b); + la.translate(b, -this.rect.get_left(), -this.rect.get_top()); + la.scale(b, 1 / this.map.get_scaleX(), 1 / this.map.get_scaleY()); + var c = Ha.getImports(); + a.root.addChild(c); + c = Ha.getGradients(); + a.root.addChild(c); + na.showShading && (c = qc.getFilterSVG(), a.root.addChild(c)); + a.root.addChild(b); + Sd.saveText('' + mf.print(a.root), this.village.name + ".vg.svg", "image/svg+xml") + }.bind(this), function (a) { + w.showToast(a && a.message ? a.message : String(a)) + }) }, setShadows: function (a) { this.layerShadows.set_visible(na.showShadows = a); @@ -16236,22 +16357,23 @@ var $lime_init = function (E, u) { b.browse(c) }, onImportLoaded: function (a) { - try { - var b = Ka.__cast(a.target, Bg); - var c = this.decodeImportFile(b.name, b.data); - if ("mfcg" === c.generator) { - this.forwardImportToMfcg(c); + var b = this; + Sd.runBusy("Importing map file...", function () { + var c = Ka.__cast(a.target, Bg); + var d = b.decodeImportFile(c.name, c.data); + if ("mfcg" === d.generator) { + b.forwardImportToMfcg(d); return } - if ("vg" === c.generator || "village" === c.generator) { - this.applyImportedVillage(c.blueprint); + if ("vg" === d.generator || "village" === d.generator) { + b.applyImportedVillage(d.blueprint); return } throw new Error("This file does not include Village or MFCG editor data.") - } catch (d) { - Qa.lastError = d; - w.showToast(d && d.message ? d.message : String(d)) - } + }, function (c) { + Qa.lastError = c; + w.showToast(c && c.message ? c.message : String(c)) + }) }, decodeImportFile: function (a, b) { var c = null, d = DataGeo.bytesToUtf8Text(b); From fb7fdb5cca35438550073eb96e375974e48e9906 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 19:24:25 +0100 Subject: [PATCH 32/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D0=BE=D0=B2=D0=B5=D1=80=D0=BB=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B4=D0=BE=D0=BC=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/Dwellings.js | 175 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 162 insertions(+), 13 deletions(-) diff --git a/src/js/Dwellings.js b/src/js/Dwellings.js index 8060493..f50d2e1 100644 --- a/src/js/Dwellings.js +++ b/src/js/Dwellings.js @@ -6579,6 +6579,111 @@ var $lime_init = function (K, v) { h["dwellings.model.JsonExporter"]=sb; sb.__name__="dwellings.model.JsonExporter"; sb.grid=null; + sb._busyOverlay = { + active: !1, + el: null, + textEl: null, + listeners: null, + ensure: function () { + if (null != this.el) return; + var a = window.document; + var b = a.createElement("div"); + b.id = "dwellings-busy-overlay"; + b.style.cssText = "position:fixed;inset:0;display:none;align-items:center;justify-content:center;text-align:center;background:rgba(0,0,0,0.55);color:#fff;z-index:2147483647;pointer-events:auto;"; + var c = a.createElement("div"); + c.style.cssText = "display:flex;flex-direction:column;align-items:center;gap:12px;padding:18px 22px;border-radius:10px;background:rgba(0,0,0,0.6);box-shadow:0 8px 24px rgba(0,0,0,0.4);max-width:80vw;"; + var d = a.createElement("div"); + d.style.cssText = "width:28px;height:28px;border:3px solid rgba(255,255,255,0.35);border-top-color:#fff;border-radius:50%;animation:dwellings-busy-spin 0.8s linear infinite;"; + var f = a.createElement("div"); + f.style.cssText = "font:16px/1.4 'Share Tech Mono', monospace;letter-spacing:0.02em;"; + f.textContent = "Please wait..."; + c.appendChild(d); + c.appendChild(f); + b.appendChild(c); + this.el = b; + this.textEl = f; + (a.body || a.documentElement).appendChild(b); + if (null == a.getElementById("dwellings-busy-style")) { + var h = a.createElement("style"); + h.id = "dwellings-busy-style"; + h.textContent = "@keyframes dwellings-busy-spin{to{transform:rotate(360deg);}}"; + (a.head || a.documentElement).appendChild(h) + } + }, + attach: function () { + if (null != this.listeners) return; + var a = this; + var b = function (c) { + if (!a.active) return; + c.preventDefault(); + c.stopPropagation(); + return !1 + }; + var c = { + capture: !0, + passive: !1 + }; + var d = window.document; + var f = ["keydown", "keyup", "keypress", "mousedown", "mouseup", "click", "dblclick", "contextmenu", "wheel", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup"]; + var h = 0; + for (; h < f.length;) d.addEventListener(f[h++], b, c); + this.listeners = { + handler: b, + options: c, + events: f + }; + try { + null != d.activeElement && d.activeElement.blur() + } catch (k) { + } + }, + detach: function () { + if (null == this.listeners) return; + var a = window.document; + var b = this.listeners.events; + var c = this.listeners.handler; + var d = this.listeners.options; + var f = 0; + for (; f < b.length;) a.removeEventListener(b[f++], c, d); + this.listeners = null + }, + show: function (a) { + this.ensure(); + this.textEl.textContent = null != a && "" !== a ? a : "Please wait..."; + this.el.style.display = "flex"; + this.active = !0; + this.attach() + }, + hide: function () { + if (null == this.el) return; + this.active = !1; + this.el.style.display = "none"; + this.detach() + } + }; + sb.runBusy = function (a, b, c) { + sb._busyOverlay.show(a); + var d = function () { + try { + b() + } catch (f) { + if ("function" == typeof c) { + c(f); + return + } + throw f + } finally { + sb._busyOverlay.hide() + } + }; + if (null != window.requestAnimationFrame) { + window.requestAnimationFrame(function () { + window.requestAnimationFrame(function () { + window.setTimeout(d, 0) + }) + }) + } else window.setTimeout(d, 0) + }; sb.exportProto=function(a){ sb.grid=a.floors[0].grid; return sb.house2proto(a) @@ -9460,17 +9565,18 @@ var $lime_init = function (K, v) { b.browse([new xk("Dwellings", "*.json;*.pb;")]) }, onPlanLoaded: function (a) { - try { - var b = sb.importFromFile(a.name, a.data); - this.applyImportedHouse(b) - } catch (c) { + var b = this; + sb.runBusy("Importing dwelling file...", function () { + var c = sb.importFromFile(a.name, a.data); + b.applyImportedHouse(c) + }, function (c) { Ha.lastError = c; var msg = c && c.message || "" + c; if (msg === "empty") msg = "The file is empty or contains no floor data."; else if (msg === "bad bounds") msg = "The file contains invalid geometry data."; console.error(msg); ma.showToast(msg) - } + }) }, applyImportedHouse: function (a) { fd.inst = a; @@ -9886,10 +9992,24 @@ var $lime_init = function (K, v) { this.updateView() }, exportAsPNG: function () { - zb.facadeAsPNG(this.house, this.elevation, this.view) + var a = this; + sb.runBusy("Exporting PNG file...", function () { + zb.facadeAsPNG(a.house, a.elevation, a.view) + }, function (b) { + var msg = b && b.message || "" + b; + console.error(msg); + ma.showToast(msg) + }) }, exportAsSVG: function () { - zb.facadeAsSVG(this.house, this.elevation, this.view) + var a = this; + sb.runBusy("Exporting SVG file...", function () { + zb.facadeAsSVG(a.house, a.elevation, a.view) + }, function (b) { + var msg = b && b.message || "" + b; + console.error(msg); + ma.showToast(msg) + }) }, applyColors: function (a) { ub.prototype.applyColors.call(this, a); @@ -10041,8 +10161,24 @@ var $lime_init = function (K, v) { var b = this; ub.prototype.fillExportMenu.call(this, a); - a.addItem("JSON", function () {sb.export(b.house)}); - a.addItem("PROTO",function(){sb.exportAsProto(b.house)}); + a.addItem("JSON", function () { + sb.runBusy("Exporting JSON file...", function () { + sb.export(b.house) + }, function (c) { + var msg = c && c.message || "" + c; + console.error(msg); + ma.showToast(msg) + }) + }); + a.addItem("PROTO", function () { + sb.runBusy("Exporting PROTO file...", function () { + sb.exportAsProto(b.house) + }, function (c) { + var msg = c && c.message || "" + c; + console.error(msg); + ma.showToast(msg) + }) + }); a.addItem("Advanced...", m(this, this.multiExport)) }, reset: function (a) { @@ -10269,12 +10405,25 @@ var $lime_init = function (K, v) { } }, exportAsPNG: function () { - zb.planAsPNG(this.house, this.map, sd.curFloor); - this.map.updateLabels(this.house) + var a = this; + sb.runBusy("Exporting PNG file...", function () { + zb.planAsPNG(a.house, a.map, sd.curFloor); + a.map.updateLabels(a.house) + }, function (b) { + var msg = b && b.message || "" + b; + console.error(msg); + ma.showToast(msg) + }) }, exportAsSVG: function () { - zb.planAsSVG(this.house, this.map, - sd.curFloor) + var a = this; + sb.runBusy("Exporting SVG file...", function () { + zb.planAsSVG(a.house, a.map, sd.curFloor) + }, function (b) { + var msg = b && b.message || "" + b; + console.error(msg); + ma.showToast(msg) + }) }, multiExport: function () { null == ma.findForm(sc) && ma.showDialog(new sc(this.house, m(this, this.updateView))) From 679e6068094416cf21273cb1933b20df8ae2fde0 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 19:26:54 +0100 Subject: [PATCH 33/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.3]=20=20=D0=BE=D0=B2=D0=B5=D1=80=D0=BB=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=B5=D1=89=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/Cave.js | 193 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 156 insertions(+), 37 deletions(-) diff --git a/src/js/Cave.js b/src/js/Cave.js index 9eb581b..06430bb 100644 --- a/src/js/Cave.js +++ b/src/js/Cave.js @@ -5560,6 +5560,111 @@ var $lime_init = function (A, r) { v = fb.embedded.h[a]; return null != v ? (Ma.addImport(v.url), v.name) : Ma.substituteGenerics(a) }; + fb._busyOverlay = { + active: !1, + el: null, + textEl: null, + listeners: null, + ensure: function () { + if (null != this.el) return; + var a = window.document; + var b = a.createElement("div"); + b.id = "cave-busy-overlay"; + b.style.cssText = "position:fixed;inset:0;display:none;align-items:center;justify-content:center;text-align:center;background:rgba(0,0,0,0.55);color:#fff;z-index:2147483647;pointer-events:auto;"; + var c = a.createElement("div"); + c.style.cssText = "display:flex;flex-direction:column;align-items:center;gap:12px;padding:18px 22px;border-radius:10px;background:rgba(0,0,0,0.6);box-shadow:0 8px 24px rgba(0,0,0,0.4);max-width:80vw;"; + var d = a.createElement("div"); + d.style.cssText = "width:28px;height:28px;border:3px solid rgba(255,255,255,0.35);border-top-color:#fff;border-radius:50%;animation:cave-busy-spin 0.8s linear infinite;"; + var f = a.createElement("div"); + f.style.cssText = "font:16px/1.4 'Share Tech Mono', monospace;letter-spacing:0.02em;"; + f.textContent = "Please wait..."; + c.appendChild(d); + c.appendChild(f); + b.appendChild(c); + this.el = b; + this.textEl = f; + (a.body || a.documentElement).appendChild(b); + if (null == a.getElementById("cave-busy-style")) { + var h = a.createElement("style"); + h.id = "cave-busy-style"; + h.textContent = "@keyframes cave-busy-spin{to{transform:rotate(360deg);}}"; + (a.head || a.documentElement).appendChild(h) + } + }, + attach: function () { + if (null != this.listeners) return; + var a = this; + var b = function (c) { + if (!a.active) return; + c.preventDefault(); + c.stopPropagation(); + return !1 + }; + var c = { + capture: !0, + passive: !1 + }; + var d = window.document; + var f = ["keydown", "keyup", "keypress", "mousedown", "mouseup", "click", "dblclick", "contextmenu", "wheel", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup"]; + var h = 0; + for (; h < f.length;) d.addEventListener(f[h++], b, c); + this.listeners = { + handler: b, + options: c, + events: f + }; + try { + null != d.activeElement && d.activeElement.blur() + } catch (k) { + } + }, + detach: function () { + if (null == this.listeners) return; + var a = window.document; + var b = this.listeners.events; + var c = this.listeners.handler; + var d = this.listeners.options; + var f = 0; + for (; f < b.length;) a.removeEventListener(b[f++], c, d); + this.listeners = null + }, + show: function (a) { + this.ensure(); + this.textEl.textContent = null != a && "" !== a ? a : "Please wait..."; + this.el.style.display = "flex"; + this.active = !0; + this.attach() + }, + hide: function () { + if (null == this.el) return; + this.active = !1; + this.el.style.display = "none"; + this.detach() + } + }; + fb.runBusy = function (a, b, c) { + fb._busyOverlay.show(a); + var d = function () { + try { + b() + } catch (f) { + if ("function" == typeof c) { + c(f); + return + } + throw f + } finally { + fb._busyOverlay.hide() + } + }; + if (null != window.requestAnimationFrame) { + window.requestAnimationFrame(function () { + window.requestAnimationFrame(function () { + window.setTimeout(d, 0) + }) + }) + } else window.setTimeout(d, 0) + }; fb.__super__ = Kd; fb.prototype = u(Kd.prototype, { layout: function () { @@ -5867,44 +5972,58 @@ var $lime_init = function (A, r) { })) }, exportPNG: function () { - var a = this.rWidth, - b = this.rHeight, - c = this.model.rect.width, - d = this.model.rect.height, - f = .2 * Math.max(c, d); - c += f; - d += f; - this.setSize(c, d); - var h = Math.sqrt(16777215 / (c * d)); - c = c * h | 0; - d = d * h | 0; - f = new wa; - f.scale(h, h); - h = new Wb(c, d, !1, this.getBgColor()); - h.draw(this, f); - fb.showTitle && (this.removeChild(this.title), - this.addChild(this.title = mc.get(this.model.name, mc.format("title", 48))), this.title.set_textColor(this.view.getTextColor())); - this.setSize(a, b); - Ld.savePNG(h, this.model.name); - h.dispose() + var a = this; + fb.runBusy("Exporting PNG file...", function () { + var b = a.rWidth, + c = a.rHeight, + d = a.model.rect.width, + f = a.model.rect.height, + h = .2 * Math.max(d, f); + d += h; + f += h; + a.setSize(d, f); + var k = Math.sqrt(16777215 / (d * f)); + d = d * k | 0; + f = f * k | 0; + h = new wa; + h.scale(k, k); + k = new Wb(d, f, !1, a.getBgColor()); + k.draw(a, h); + fb.showTitle && (a.removeChild(a.title), + a.addChild(a.title = mc.get(a.model.name, mc.format("title", 48))), a.title.set_textColor(a.view.getTextColor())); + a.setSize(b, c); + Ld.savePNG(k, a.model.name); + k.dispose() + }, function (b) { + var msg = b && b.message || "" + b; + console.error(msg); + Fa.showToast(msg) + }) }, exportSVG: function () { - var a = this.rWidth, - b = this.rHeight, - c = this.model.rect.width, - d = this.model.rect.height, - f = .2 * Math.max(c, d); - this.setSize(c + f, d + f); - Ma.substituteFont = fb.fixFontNames; - c = Ma.create(this.rWidth, this.rHeight, this.getBgColor()); - d = Ma.drawSprite(this); - c.root.addChild(d); - this.setSize(a, b); - d = Ma.getImports(); - c.root.addChild(d); - d = Ma.getGradients(); - c.root.addChild(d); - Ld.saveText('' + Ke.print(c.root), this.model.name + ".cv.svg", "image/svg+xml") + var a = this; + fb.runBusy("Exporting SVG file...", function () { + var b = a.rWidth, + c = a.rHeight, + d = a.model.rect.width, + f = a.model.rect.height, + h = .2 * Math.max(d, f); + a.setSize(d + h, f + h); + Ma.substituteFont = fb.fixFontNames; + d = Ma.create(a.rWidth, a.rHeight, a.getBgColor()); + f = Ma.drawSprite(a); + d.root.addChild(f); + a.setSize(b, c); + f = Ma.getImports(); + d.root.addChild(f); + f = Ma.getGradients(); + d.root.addChild(f); + Ld.saveText('' + Ke.print(d.root), a.model.name + ".cv.svg", "image/svg+xml") + }, function (b) { + var msg = b && b.message || "" + b; + console.error(msg); + Fa.showToast(msg) + }) }, toggleGlade: function () { fb.showGlade = !fb.showGlade; @@ -46113,4 +46232,4 @@ var $lime_init = function (A, r) { if (params !== null) { console.debug(params); $lime_init("undefined" !== typeof exports ? exports : "function" === typeof define && define.amd ? {} : "undefined" !== typeof window ? window : "undefined" !== typeof self ? self : this, "undefined" !== typeof window ? window : "undefined" !== typeof global ? global : "undefined" !== typeof self ? self : this); -} \ No newline at end of file +} From a1ec6999a0b416440b9a6753b8ae35bb2e373d3c Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sat, 14 Feb 2026 19:42:16 +0100 Subject: [PATCH 34/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.4]=20=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/js/shared/data/data.js | 1 + tests/shared/data/Cave.test.js | 18 ++++ tests/shared/data/Dwellings.test.js | 74 ++++++++++++++ tests/shared/data/Glade.test.js | 144 ++++++++++++++++++++++++++++ tests/shared/data/Viewer.test.js | 51 ++++++++++ tests/shared/data/Village.test.js | 85 ++++++++++++++++ tests/shared/data/data.test.js | 87 +++++++++++++++++ tests/shared/data/mfcg.test.js | 14 +++ 9 files changed, 475 insertions(+), 1 deletion(-) create mode 100644 tests/shared/data/Glade.test.js diff --git a/package.json b/package.json index 33654ee..d60f807 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fantasy-maphub", "name_full": "Fantasy MapHub Generators", - "version": "1.2.4-add-data-any-imports.3", + "version": "1.2.4-add-data-any-imports.4", "description": "An offline-first hub that bundles several Watabou map generators into one consistent web app: same UI patterns, local assets, and modern import/export. It adds OpenAPI docs, proto-first serialization (including pure protobuf files), and a PWA build so everything works without an internet connection.", "license": "MPL-2.0", "author": "mail@sunsung.fun", diff --git a/src/js/shared/data/data.js b/src/js/shared/data/data.js index 9b2351f..c38f605 100644 --- a/src/js/shared/data/data.js +++ b/src/js/shared/data/data.js @@ -44,6 +44,7 @@ export function detectLegacyRootType(obj) { if (obj != null && typeof obj === "object" && obj.type === "FeatureCollection" && Array.isArray(obj.features)) return DT.geo; if (!isPlainObject(obj)) return null; + if (isPlainObject(obj.colors) && isPlainObject(obj.trees) && isPlainObject(obj.shadow) && isPlainObject(obj.strokes) && isPlainObject(obj.misc)) return DT.palette_glade; if (isPlainObject(obj.colors) && isPlainObject(obj.misc) && isPlainObject(obj.strokes)) return DT.palette_dwellings; if (isPlainObject(obj.colors) && isPlainObject(obj.shadow) && isPlainObject(obj.strokes) && isPlainObject(obj.hatching)) return DT.palette_cave; diff --git a/tests/shared/data/Cave.test.js b/tests/shared/data/Cave.test.js index f5b2b3d..35ba223 100644 --- a/tests/shared/data/Cave.test.js +++ b/tests/shared/data/Cave.test.js @@ -40,6 +40,24 @@ describe("Cave: paletteObjFromLegacyJsonText", () => { expect(msg.hatching).toBeTruthy(); }); + it("accepts proto-like palette objects", () => { + const protoLike = { + colors: { + page: { r: 10, g: 20, b: 30 }, + floor: { r: 40, g: 50, b: 60 }, + water: { r: 70, g: 80, b: 90 }, + ink: { r: 11, g: 22, b: 33 }, + }, + shadow: { shadeAlpha: 0.25, shadowAlpha: 0.4, shadowDist: 1.5 }, + strokes: { wall: 1.2, detail: 0.6, hatch: 0.9, grid: 1.1 }, + hatching: { strokes: 3, size: 0.4, distance: 0.3, stones: 0.2 }, + }; + const msg = paletteObjFromLegacyJsonText(JSON.stringify(protoLike)); + expect(msg.colors.page).toEqual({ r: 10, g: 20, b: 30 }); + expect(msg.shadow.shadowDist).toBeCloseTo(1.5); + expect(msg.hatching.strokes).toBe(3); + }); + it("parses color values correctly", () => { const msg = paletteObjFromLegacyJsonText(validCaveJsonText()); expect(msg.colors.page).toEqual({ r: 240, g: 228, b: 208 }); diff --git a/tests/shared/data/Dwellings.test.js b/tests/shared/data/Dwellings.test.js index 4425141..84611a6 100644 --- a/tests/shared/data/Dwellings.test.js +++ b/tests/shared/data/Dwellings.test.js @@ -4,6 +4,7 @@ import { paletteObjFromLegacyJsonText, paletteLegacyJsonFromObj, decodePaletteFile, + paletteProtoBytesFromObj, } from "../../../src/js/shared/data/Dwellings.js"; const VALID_DW_JSON = { @@ -40,6 +41,34 @@ describe("Dwellings: paletteObjFromLegacyJsonText", () => { expect(msg.misc).toBeTruthy(); }); + it("accepts proto-like palette objects", () => { + const protoLike = { + colors: { + ink: { r: 1, g: 2, b: 3 }, + paper: { r: 4, g: 5, b: 6 }, + floor: { r: 7, g: 8, b: 9 }, + walls: { r: 10, g: 11, b: 12 }, + props: { r: 13, g: 14, b: 15 }, + windows: { r: 16, g: 17, b: 18 }, + stairs: { r: 19, g: 20, b: 21 }, + roof: { r: 22, g: 23, b: 24 }, + labels: { r: 25, g: 26, b: 27 }, + }, + strokes: { normal: 0.1, grid: 0.2 }, + misc: { + alphaGrid: 0.3, + alphaAo: 0.4, + alphaLights: 0.5, + fontRoom: { face: "", embedded: "", size: 12, bold: false, italic: true }, + hatching: true, + }, + }; + const msg = paletteObjFromLegacyJsonText(JSON.stringify(protoLike)); + expect(msg.colors.paper).toEqual({ r: 4, g: 5, b: 6 }); + expect(msg.misc.fontRoom.size).toBe(12); + expect(msg.misc.hatching).toBe(true); + }); + it("parses all 9 colors correctly", () => { const msg = paletteObjFromLegacyJsonText(validDwJsonText()); expect(msg.colors.ink).toEqual({ r: 34, g: 34, b: 34 }); @@ -95,6 +124,32 @@ describe("Dwellings: paletteDwellingsObjFromLegacyJson", () => { expect(msg.colors.ink).toEqual({ r: 34, g: 34, b: 34 }); }); + it("accepts proto-like palette objects", () => { + const msg = paletteDwellingsObjFromLegacyJson({ + colors: { + ink: { r: 1, g: 2, b: 3 }, + paper: { r: 4, g: 5, b: 6 }, + floor: { r: 7, g: 8, b: 9 }, + walls: { r: 10, g: 11, b: 12 }, + props: { r: 13, g: 14, b: 15 }, + windows: { r: 16, g: 17, b: 18 }, + stairs: { r: 19, g: 20, b: 21 }, + roof: { r: 22, g: 23, b: 24 }, + labels: { r: 25, g: 26, b: 27 }, + }, + strokes: { normal: 0.12, grid: 0.15 }, + misc: { + alphaGrid: 0.1, + alphaAo: 0.2, + alphaLights: 0.3, + fontRoom: { face: "x", embedded: "y", size: 10, bold: false, italic: false }, + hatching: false, + }, + }); + expect(msg.strokes.normal).toBeCloseTo(0.12); + expect(msg.misc.hatching).toBe(false); + }); + it("throws on viewer palette (has 'ground' key)", () => { expect(() => paletteDwellingsObjFromLegacyJson({ ground: "#aabbcc" })).toThrow(); }); @@ -164,6 +219,25 @@ describe("Dwellings: import/export roundtrip", () => { }); }); +// ─── paletteProtoBytesFromObj ─────────────────────────────────── + +describe("Dwellings: paletteProtoBytesFromObj", () => { + it("returns ArrayBuffer", () => { + const msg = paletteObjFromLegacyJsonText(validDwJsonText()); + const bytes = paletteProtoBytesFromObj(msg); + expect(bytes).toBeInstanceOf(ArrayBuffer); + expect(bytes.byteLength).toBeGreaterThan(0); + }); + + it("proto bytes decode back via decodePaletteFile", () => { + const msg = paletteObjFromLegacyJsonText(validDwJsonText()); + const bytes = paletteProtoBytesFromObj(msg); + const decoded = decodePaletteFile("test.bin", bytes); + expect(decoded.colors.ink).toEqual(msg.colors.ink); + expect(decoded.misc.hatching).toBe(msg.misc.hatching); + }); +}); + // ─── decodePaletteFile ────────────────────────────────────────── describe("Dwellings: decodePaletteFile", () => { diff --git a/tests/shared/data/Glade.test.js b/tests/shared/data/Glade.test.js new file mode 100644 index 0000000..5d3aac6 --- /dev/null +++ b/tests/shared/data/Glade.test.js @@ -0,0 +1,144 @@ +import { describe, it, expect } from "vitest"; +import { + paletteObjFromLegacyJsonText, + paletteLegacyJsonFromObj, + paletteProtoBytesFromObj, + decodePaletteFile, +} from "../../../src/js/shared/data/Glade.js"; + +const VALID_GLADE_JSON = { + ink: "#111111", + marks: "#222222", + tree: ["#333333", "#444444"], + ground: "#555555", + treeDetails: "#666666", + thicket: "#777777", + water: "#888888", + shallow: "#999999", + sand: "#aaaaaa", + shadowColor: "#bbbbbb", + shadowLength: "1.2", + shadowAngle: "45", + road: "#cccccc", + roadOutline: "#dddddd", + treeVariance: "0.4", + treeBands: "3", + treeShape: "Cotton", + strokeNormal: "1.0", + strokeThin: "0.5", + strokeGrid: "0.25", + grassLength: "12", + roadWidth: "0.4", + roadWiggle: "0.6", +}; + +function validGladeJsonText() { + return JSON.stringify(VALID_GLADE_JSON); +} + +// ─── paletteObjFromLegacyJsonText ─────────────────────────────── + +describe("Glade: paletteObjFromLegacyJsonText", () => { + it("parses valid JSON into proto message", () => { + const msg = paletteObjFromLegacyJsonText(validGladeJsonText()); + expect(msg).toBeTruthy(); + expect(msg.colors).toBeTruthy(); + expect(msg.trees).toBeTruthy(); + expect(msg.shadow).toBeTruthy(); + expect(msg.strokes).toBeTruthy(); + expect(msg.misc).toBeTruthy(); + }); + + it("accepts proto-like palette objects with defaults", () => { + const protoLike = { + colors: { + ink: { r: 1, g: 2, b: 3 }, + ground: { r: 4, g: 5, b: 6 }, + thicket: { r: 7, g: 8, b: 9 }, + tree: [{ r: 10, g: 11, b: 12 }], + waterDeep: { r: 13, g: 14, b: 15 }, + shadowColor: { r: 16, g: 17, b: 18 }, + road: { r: 19, g: 20, b: 21 }, + }, + trees: { variance: 0.2, bands: 4, shape: "Palm" }, + shadow: { length: 1, angleDeg: 30 }, + strokes: { normal: 1, thin: 0.5, grid: 0.25 }, + misc: { grassLength: 8, roadWidth: 0.4, roadWiggle: 0.6 }, + }; + + const msg = paletteObjFromLegacyJsonText(JSON.stringify(protoLike)); + expect(msg.colors.marks).toEqual({ r: 1, g: 2, b: 3 }); + expect(msg.colors.waterShallow).toEqual({ r: 13, g: 14, b: 15 }); + expect(msg.colors.roadOutline).toEqual({ r: 1, g: 2, b: 3 }); + }); + + it("parses tree and stroke settings", () => { + const msg = paletteObjFromLegacyJsonText(validGladeJsonText()); + expect(msg.trees.variance).toBeCloseTo(0.4); + expect(msg.trees.bands).toBe(3); + expect(msg.strokes.thin).toBeCloseTo(0.5); + }); + + it("throws on invalid JSON", () => { + expect(() => paletteObjFromLegacyJsonText("{bad")).toThrow("An error occurred while parsing"); + }); +}); + +// ─── paletteLegacyJsonFromObj ─────────────────────────────────── + +describe("Glade: paletteLegacyJsonFromObj", () => { + it("exports valid JSON string", () => { + const msg = paletteObjFromLegacyJsonText(validGladeJsonText()); + const json = paletteLegacyJsonFromObj(msg); + expect(() => JSON.parse(json)).not.toThrow(); + }); + + it("exports expected hex colors", () => { + const msg = paletteObjFromLegacyJsonText(validGladeJsonText()); + const obj = JSON.parse(paletteLegacyJsonFromObj(msg)); + expect(obj.ink).toMatch(/^#[0-9a-f]{6}$/); + expect(obj.road).toMatch(/^#[0-9a-f]{6}$/); + expect(Array.isArray(obj.tree)).toBe(true); + }); +}); + +// ─── roundtrip ────────────────────────────────────────────────── + +describe("Glade: import/export roundtrip", () => { + it("preserves key values through roundtrip", () => { + const msg = paletteObjFromLegacyJsonText(validGladeJsonText()); + const parsed = JSON.parse(paletteLegacyJsonFromObj(msg)); + expect(parsed.ink).toBe(VALID_GLADE_JSON.ink); + expect(parsed.shadowColor).toBe(VALID_GLADE_JSON.shadowColor); + expect(parsed.treeShape).toBe(VALID_GLADE_JSON.treeShape); + }); +}); + +// ─── paletteProtoBytesFromObj ─────────────────────────────────── + +describe("Glade: paletteProtoBytesFromObj", () => { + it("returns ArrayBuffer", () => { + const msg = paletteObjFromLegacyJsonText(validGladeJsonText()); + const bytes = paletteProtoBytesFromObj(msg); + expect(bytes).toBeInstanceOf(ArrayBuffer); + expect(bytes.byteLength).toBeGreaterThan(0); + }); + + it("proto bytes decode back via decodePaletteFile", () => { + const msg = paletteObjFromLegacyJsonText(validGladeJsonText()); + const bytes = paletteProtoBytesFromObj(msg); + const decoded = decodePaletteFile("test.bin", bytes); + expect(decoded.colors.ink).toEqual(msg.colors.ink); + expect(decoded.trees.bands).toBe(msg.trees.bands); + }); +}); + +// ─── decodePaletteFile ────────────────────────────────────────── + +describe("Glade: decodePaletteFile", () => { + it("decodes from JSON text bytes", () => { + const textBytes = new TextEncoder().encode(validGladeJsonText()); + const msg = decodePaletteFile("test.json", textBytes); + expect(msg.colors.ink).toEqual({ r: 17, g: 17, b: 17 }); + }); +}); diff --git a/tests/shared/data/Viewer.test.js b/tests/shared/data/Viewer.test.js index ea96b3a..e0c0439 100644 --- a/tests/shared/data/Viewer.test.js +++ b/tests/shared/data/Viewer.test.js @@ -3,6 +3,7 @@ import { paletteObjFromLegacyJsonText, paletteLegacyJsonFromObj, decodePaletteFile, + paletteProtoBytesFromObj, } from "../../../src/js/shared/data/Viewer.js"; const VALID_VIEWER_JSON = { @@ -44,6 +45,37 @@ describe("Viewer: paletteObjFromLegacyJsonText", () => { expect(msg.shapes).toBeTruthy(); }); + it("accepts proto-like palette objects", () => { + const protoLike = { + colors: { + ground: { r: 1, g: 2, b: 3 }, + fields: { r: 4, g: 5, b: 6 }, + greens: { r: 7, g: 8, b: 9 }, + foliage: { r: 10, g: 11, b: 12 }, + roads: { r: 13, g: 14, b: 15 }, + water: { r: 16, g: 17, b: 18 }, + walls1: { r: 19, g: 20, b: 21 }, + walls2: { r: 22, g: 23, b: 24 }, + roofs1: { r: 25, g: 26, b: 27 }, + roofs2: { r: 28, g: 29, b: 30 }, + }, + lighting: { + sky1: { r: 31, g: 32, b: 33 }, + sky2: { r: 34, g: 35, b: 36 }, + sun: { r: 37, g: 38, b: 39 }, + windows: { r: 40, g: 41, b: 42 }, + sunPos: 30, + ambience: 0.4, + lighted: 0.6, + }, + shapes: { roofedTowers: true, towers: 1, treeShape: 2, pitch: 1.2 }, + }; + const msg = paletteObjFromLegacyJsonText(JSON.stringify(protoLike)); + expect(msg.colors.roofs1).toEqual({ r: 25, g: 26, b: 27 }); + expect(msg.lighting.sunPos).toBeCloseTo(30); + expect(msg.shapes.roofedTowers).toBe(true); + }); + it("parses 10 main colors", () => { const msg = paletteObjFromLegacyJsonText(validViewerJsonText()); expect(msg.colors.ground).toEqual({ r: 136, g: 170, b: 102 }); @@ -177,6 +209,25 @@ describe("Viewer: import/export roundtrip", () => { }); }); +// ─── paletteProtoBytesFromObj ─────────────────────────────────── + +describe("Viewer: paletteProtoBytesFromObj", () => { + it("returns ArrayBuffer", () => { + const msg = paletteObjFromLegacyJsonText(validViewerJsonText()); + const bytes = paletteProtoBytesFromObj(msg); + expect(bytes).toBeInstanceOf(ArrayBuffer); + expect(bytes.byteLength).toBeGreaterThan(0); + }); + + it("proto bytes decode back via decodePaletteFile", () => { + const msg = paletteObjFromLegacyJsonText(validViewerJsonText()); + const bytes = paletteProtoBytesFromObj(msg); + const decoded = decodePaletteFile("test.bin", bytes); + expect(decoded.colors.water).toEqual(msg.colors.water); + expect(decoded.lighting.ambience).toBeCloseTo(msg.lighting.ambience); + }); +}); + // ─── decodePaletteFile ────────────────────────────────────────── describe("Viewer: decodePaletteFile", () => { diff --git a/tests/shared/data/Village.test.js b/tests/shared/data/Village.test.js index ed44d94..39d54d9 100644 --- a/tests/shared/data/Village.test.js +++ b/tests/shared/data/Village.test.js @@ -3,6 +3,7 @@ import { paletteObjFromLegacyJsonText, paletteLegacyJsonFromObj, decodePaletteFile, + paletteProtoBytesFromObj, } from "../../../src/js/shared/data/Village.js"; const VALID_VILLAGE_JSON = { @@ -75,6 +76,71 @@ describe("Village: paletteObjFromLegacyJsonText", () => { expect(msg.misc).toBeTruthy(); }); + it("accepts proto-like palette objects", () => { + const protoLike = { + terrain: { + ground: [{ r: 1, g: 2, b: 3 }], + relief: 1, + sand: { r: 4, g: 5, b: 6 }, + plank: { r: 7, g: 8, b: 9 }, + }, + houses: { + roofLight: [{ r: 10, g: 11, b: 12 }], + roofStroke: { r: 13, g: 14, b: 15 }, + roofVariance: 0.2, + roofSlope: 0.3, + roofType: 2, + }, + roads: { + road: { r: 16, g: 17, b: 18 }, + largeRoad: 2, + smallRoad: 1, + outlineRoads: 1, + mergeRoads: false, + }, + fields: { + fieldLight: [{ r: 19, g: 20, b: 21 }], + fieldFurrow: { r: 22, g: 23, b: 24 }, + fieldVariance: 0.4, + outlineFields: 2, + }, + water: { + waterShallow: { r: 25, g: 26, b: 27 }, + waterDeep: { r: 28, g: 29, b: 30 }, + waterTide: { r: 31, g: 32, b: 33 }, + shallowBands: 2, + }, + trees: { + tree: [{ r: 34, g: 35, b: 36 }], + thicket: { r: 37, g: 38, b: 39 }, + treeDetails: { r: 40, g: 41, b: 42 }, + treeVariance: 0.6, + treeShape: 1, + }, + lighting: { + shadowColor: { r: 43, g: 44, b: 45 }, + shadowLength: 1.5, + shadowAngleDeg: 90, + lights: { r: 46, g: 47, b: 48 }, + }, + text: { + fontHeader: { face: "A", size: 10, bold: false, italic: false, embedded: "x" }, + fontPopulation: { face: "B", size: 11, bold: true, italic: false, embedded: "y" }, + fontNumber: { face: "C", size: 12, bold: false, italic: true, embedded: "z" }, + }, + misc: { + ink: { r: 49, g: 50, b: 51 }, + paper: { r: 52, g: 53, b: 54 }, + strokeNormal: 1, + strokeThin: 0.5, + }, + }; + const msg = paletteObjFromLegacyJsonText(JSON.stringify(protoLike)); + expect(msg.terrain.ground[0]).toEqual({ r: 1, g: 2, b: 3 }); + expect(msg.lighting.shadowAngleDeg).toBe(90); + expect(msg.text.fontHeader.size).toBe(10); + }); + it("parses terrain colors as rgb list", () => { const msg = paletteObjFromLegacyJsonText(validVillageJsonText()); expect(msg.terrain.ground).toHaveLength(2); @@ -272,6 +338,25 @@ describe("Village: import/export roundtrip", () => { }); }); +// ─── paletteProtoBytesFromObj ─────────────────────────────────── + +describe("Village: paletteProtoBytesFromObj", () => { + it("returns ArrayBuffer", () => { + const msg = paletteObjFromLegacyJsonText(validVillageJsonText()); + const bytes = paletteProtoBytesFromObj(msg); + expect(bytes).toBeInstanceOf(ArrayBuffer); + expect(bytes.byteLength).toBeGreaterThan(0); + }); + + it("proto bytes decode back via decodePaletteFile", () => { + const msg = paletteObjFromLegacyJsonText(validVillageJsonText()); + const bytes = paletteProtoBytesFromObj(msg); + const decoded = decodePaletteFile("test.bin", bytes); + expect(decoded.terrain.ground).toHaveLength(2); + expect(decoded.misc.ink).toEqual(msg.misc.ink); + }); +}); + // ─── decodePaletteFile ────────────────────────────────────────── describe("Village: decodePaletteFile", () => { diff --git a/tests/shared/data/data.test.js b/tests/shared/data/data.test.js index 79e751a..8120fb1 100644 --- a/tests/shared/data/data.test.js +++ b/tests/shared/data/data.test.js @@ -14,6 +14,10 @@ import { createTypeMismatchError, decodeDataFromFile, encodeDataToBytes, + geoJsonToProtoObject, + geoJsonFromProtoMessage, + decodeCityFromJsonText, + decodeCityFile, } from "../../../src/js/shared/data/data.js"; import { data as DataProto } from "../../../src/js/struct/data.js"; @@ -124,6 +128,50 @@ describe("protoStructToJs", () => { }); }); +// ─── geoJsonToProtoObject / geoJsonFromProtoMessage ───────────── + +describe("geoJsonToProtoObject ↔ geoJsonFromProtoMessage", () => { + it("converts GeoJSON to proto-ready object", () => { + const input = { + type: "FeatureCollection", + features: [ + { + type: "Feature", + id: "roads", + generator: "mfcg", + properties: { road_width: 2 }, + geometry: { + type: "LineString", + coordinates: [[1, 2], [3, 4]], + }, + }, + ], + }; + + const protoObj = geoJsonToProtoObject(input); + expect(protoObj.type).toBe(DataProto.GeoType.FeatureCollection); + expect(protoObj.features[0].type).toBe(DataProto.GeoType.Feature); + expect(protoObj.features[0].id).toBe(DataProto.GeoFeatureType.roads); + expect(protoObj.features[0].generator).toBe(DataProto.GeoGeneratorType.mfcg); + expect(protoObj.features[0].roadWidth).toBe(2); + expect(protoListValueToJs(protoObj.features[0].geometry.coordinates)).toEqual([[1, 2], [3, 4]]); + }); + + it("converts proto message back to GeoJSON", () => { + const msg = { + type: DataProto.GeoType.FeatureCollection, + id: DataProto.GeoFeatureType.values, + generator: DataProto.GeoGeneratorType.mfcg, + features: [], + }; + + const json = geoJsonFromProtoMessage(msg); + expect(json.type).toBe("FeatureCollection"); + expect(json.id).toBe("values"); + expect(json.generator).toBe("mfcg"); + }); +}); + // ─── enumToNumber ─────────────────────────────────────────────── describe("enumToNumber", () => { @@ -337,6 +385,39 @@ describe("createTypeMismatchError", () => { }); }); +// ─── decodeCityFromJsonText / decodeCityFile ──────────────────── + +describe("decodeCityFromJsonText", () => { + it("accepts minimal FeatureCollection GeoJSON", () => { + const text = JSON.stringify({ type: "FeatureCollection", features: [] }); + const obj = decodeCityFromJsonText(text); + expect(obj.type).toBe("FeatureCollection"); + }); + + it("throws on malformed JSON", () => { + expect(() => decodeCityFromJsonText("{bad")).toThrow("An error occurred while parsing"); + }); +}); + +describe("decodeCityFile", () => { + it("preserves hood generator override in values feature", () => { + const city = { + type: "FeatureCollection", + features: [ + { + type: "Feature", + id: "values", + generator: "hood", + geometry: { type: "LineString", coordinates: [[0, 0], [1, 1]] }, + }, + ], + }; + const bytes = new TextEncoder().encode(JSON.stringify(city)); + const out = decodeCityFile("city.json", bytes); + expect(out.features[0].generator).toBe("hood"); + }); +}); + // ─── decodeDataFromFile with DataType ────────────────────────── describe("decodeDataFromFile", () => { @@ -358,6 +439,12 @@ describe("decodeDataFromFile", () => { it("throws on invalid data", () => { expect(() => decodeDataFromFile(DT.geo, () => { throw new Error("not JSON"); }, new Uint8Array([0, 0, 0, 0, 0]))).toThrow(); }); + + it("throws on unknown bin-verify data type", () => { + const frame = encodeDataToBytes(999, new Uint8Array([1, 2, 3])); + expect(() => decodeDataFromFile(DT.geo, () => { throw new Error("not JSON"); }, frame)) + .toThrow("unknown data type"); + }); }); // ─── encodeDataToBytes / decodeDataFromFile bin-verify roundtrip ─ diff --git a/tests/shared/data/mfcg.test.js b/tests/shared/data/mfcg.test.js index edaa2b7..efc3c55 100644 --- a/tests/shared/data/mfcg.test.js +++ b/tests/shared/data/mfcg.test.js @@ -36,6 +36,20 @@ describe("MFCG: paletteObjFromLegacyJsonText", () => { expect(msg.tints).toBeTruthy(); }); + it("accepts proto-like palette objects", () => { + const protoLike = { + colors: { + paper: { r: 1, g: 2, b: 3 }, + light: { r: 4, g: 5, b: 6 }, + dark: { r: 7, g: 8, b: 9 }, + }, + tints: { method: 1, strength: 60, weathering: 10 }, + }; + const msg = paletteObjFromLegacyJsonText(JSON.stringify(protoLike)); + expect(msg.colors.paper).toEqual({ r: 1, g: 2, b: 3 }); + expect(msg.tints.strength).toBe(60); + }); + it("parses required colors", () => { const msg = paletteObjFromLegacyJsonText(validMfcgJsonText()); expect(msg.colors.paper).toEqual({ r: 245, g: 240, b: 230 }); From c0e70f8a6f0f6e5f5b4eb93dec2de04e3f0dc3f9 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sun, 15 Feb 2026 07:54:02 +0100 Subject: [PATCH 35/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.5]=20=20=D0=B4=D0=B5=D0=BB=D0=B0=D0=B5=D0=BC=20=D0=BD?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=203?= =?UTF-8?q?=D0=B4=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B8=D0=B7=202=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/js/Village.js | 2 +- src/js/mfcg.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index d60f807..b62806a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fantasy-maphub", "name_full": "Fantasy MapHub Generators", - "version": "1.2.4-add-data-any-imports.4", + "version": "1.2.4-add-data-any-imports.5", "description": "An offline-first hub that bundles several Watabou map generators into one consistent web app: same UI patterns, local assets, and modern import/export. It adds OpenAPI docs, proto-first serialization (including pure protobuf files), and a PWA build so everything works without an internet connection.", "license": "MPL-2.0", "author": "mail@sunsung.fun", diff --git a/src/js/Village.js b/src/js/Village.js index 154a706..2b45a3e 100644 --- a/src/js/Village.js +++ b/src/js/Village.js @@ -16473,7 +16473,7 @@ var $lime_init = function (E, u) { null != c.style && x.setPalette(Rb.fromAsset(c.style)); this.createVillage(c) }, - onViewIn3D: function (inNewWindow = true) { + onViewIn3D: function (inNewWindow = false) { try { var a = this.village; var b = Hh.getProto(a); diff --git a/src/js/mfcg.js b/src/js/mfcg.js index cf284fb..86eae57 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -14542,7 +14542,7 @@ var $lime_init = function (A, t) { onPermalink: function () { null == u.findWidnow(Jf) && u.showDialog(new Jf) }, - onViewIn3D: function (inNewWindow = true) { + onViewIn3D: function (inNewWindow = false) { try { var a = Ub.instance, b = lg.export(a), c = DataProto.data.GeoObj.encode(b).finish(), d = "", e = 0; for (; e < c.length;) { From 3340a4c39895f1ebff413fd9d98f0f6f9e48b676 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sun, 15 Feb 2026 07:59:27 +0100 Subject: [PATCH 36/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.5]=20=20=D0=B2=D1=80=D0=BE=D0=B4=D0=B5=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/ToyTown2.js | 81 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/src/js/ToyTown2.js b/src/js/ToyTown2.js index 6de42ff..5213711 100644 --- a/src/js/ToyTown2.js +++ b/src/js/ToyTown2.js @@ -13,6 +13,8 @@ const params = FuncProto.initParams(JSON.parse(String.raw`{{EMBED_PARAMETERS_JSO const baseTitle = document.title; let mapName = ""; let isLockedMap = false; +let returnBuffer = null; +let returnProps = null; const setMapName = (name) => { mapName = name || ""; document.title = mapName !== "" ? `${baseTitle} | ${mapName}` : baseTitle; @@ -25,6 +27,53 @@ const setMapName = (name) => { } }; const isFrame = typeof window.parent.pingFrame === "function" +const getReturnPropsFromBuffer = (buffer) => { + if (null == buffer || buffer.length < 2) return null; + const type = buffer.charAt(0); + const payload = buffer.substring(1); + if ("j" === type) { + try { + const obj = JSON.parse(payload); + if (obj && "object" == typeof obj) { + return obj.embedProps != null ? obj.embedProps : obj.embedEditorPayload != null && obj.embedEditorPayload.props != null ? obj.embedEditorPayload.props : null; + } + } catch (e) { + } + return null; + } + if ("p" === type) { + try { + const bytes = new Uint8Array(payload.length); + for (let i = 0; i < payload.length; i++) bytes[i] = payload.charCodeAt(i) & 255; + const geo = DataProto.data.GeoObj.decode(bytes); + let props = null; + geo.embedProps != null && Object.hasOwnProperty.call(geo, "embedProps") && (props = DataGeo.protoStructToJs(geo.embedProps)); + null == props && geo.embedEditorPayload != null && geo.embedEditorPayload.props != null && (props = DataGeo.protoStructToJs(geo.embedEditorPayload.props)); + return props; + } catch (e) { + return null; + } + } + return null; +}; +const blueprintToQuery = (blueprint) => { + if (null == blueprint || "object" != typeof blueprint) return ""; + const search = new URLSearchParams(); + null != blueprint.seed && search.set("seed", "" + blueprint.seed); + if (null != blueprint.tags) { + const tags = Array.isArray(blueprint.tags) ? blueprint.tags.join(",") : blueprint.tags; + null != tags && "" !== tags && search.set("tags", tags); + } + null != blueprint.width && 0 != blueprint.width && search.set("width", "" + blueprint.width); + null != blueprint.height && 0 != blueprint.height && search.set("height", "" + blueprint.height); + null != blueprint.treeSeed && null != blueprint.seed && blueprint.treeSeed != blueprint.seed && search.set("trees", "" + blueprint.treeSeed); + null != blueprint.name && "" !== blueprint.name && search.set("name", "" + blueprint.name); + null != blueprint.pop && 0 != blueprint.pop && search.set("pop", "" + blueprint.pop); + null != blueprint.varSeed && 0 != blueprint.varSeed && search.set("roads", "" + blueprint.varSeed); + null != blueprint.numbered && 0 < blueprint.numbered.length && search.set("marked", Array.isArray(blueprint.numbered) ? blueprint.numbered.toString() : "" + blueprint.numbered); + const query = search.toString(); + return "" !== query ? "?" + query : ""; +}; if (params !== null) (function (S, u) { S.lime = S.lime || {}; @@ -18996,7 +19045,7 @@ if (params !== null) (function (S, u) { function () { b.setMode(b.navMode == b.modeFly ? b.modeFree : b.modeFly) }, this.navMode == this.modeFly); - a.addItem("New view", p(this, isLockedMap ? null : this.loadSample)); + a.addItem(isLockedMap ? "Return to 2D" : "New view", p(this, isLockedMap ? this.returnTo2D : this.loadSample)); a.addItem("Import...", p(this, isLockedMap ? null : this.loadExternal)); a.addItem("Export as OBJ", p(this, this.export)); a.addSeparator(); @@ -19040,6 +19089,8 @@ if (params !== null) (function (S, u) { }, loadFromExchangeOrSample: function () { var a = null; + returnBuffer = null; + returnProps = null; try { var b = Qe.getLocalStorage(); if (null != b) { @@ -19049,14 +19100,20 @@ if (params !== null) (function (S, u) { } catch (c) { isLockedMap = false; setMapName(""); + returnBuffer = null; + returnProps = null; Ia.lastError = c } if (null == a) { isLockedMap = false; setMapName(""); + returnBuffer = null; + returnProps = null; this.loadSample(); return } + returnBuffer = a; + returnProps = getReturnPropsFromBuffer(a); var d = a.charAt(0), e = a.substring(1); if ("p" === d) { @@ -19078,6 +19135,8 @@ if (params !== null) (function (S, u) { } else { isLockedMap = false; setMapName(""); + returnBuffer = null; + returnProps = null; Ma.showMessage("Invalid exchange data"); this.loadSample(); return @@ -19090,6 +19149,26 @@ if (params !== null) (function (S, u) { window.history.replaceState({}, "", url); } }, + returnTo2D: function () { + const generatorVillage = DataProto.data.GeoGeneratorType[DataProto.data.GeoGeneratorType.vg]; + const generator = returnProps != null ? returnProps.generator : null; + if ("vg" === generator || "village" === generator || generatorVillage === generator) { + const blueprint = returnProps != null ? returnProps.blueprint : null; + const query = blueprintToQuery(blueprint); + const adr = FuncProto.paramsUrlString(params.routes.village) + query; + window.open(adr, "_self"); + return + } + if (null != returnBuffer) { + try { + const storage = Qe.getLocalStorage(); + null != storage && storage.setItem("{{LOCALSTORAGE_TOWN_BUF}}", returnBuffer); + } catch (e) { + Ia.lastError = e; + } + } + this.goToMfcg(!1) + }, loadSample: function () { Va.shuffleStyles && this.loadPresetStyle(); Va.lastSample = yb.random(yb.difference(Va.samples, [Va.lastSample])); From 4acb6a589f31691277fd9953346759d680f6f591 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sun, 15 Feb 2026 08:15:04 +0100 Subject: [PATCH 37/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.5]=20=20=D0=BD=D0=B0=D0=BA=D0=BE=D0=BD=D0=B5=D1=86-?= =?UTF-8?q?=D1=82=D0=BE=20=D0=B7=D0=B0=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/mfcg.js | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 86eae57..9d2044f 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -1766,13 +1766,17 @@ var $lime_init = function (A, t) { sb.takeLocalStorageTownBuf = function () { var a = null; try { - var b = qf.getLocalStorage(); - if (null != b) { - a = b.getItem("{{LOCALSTORAGE_TOWN_BUF}}"); - null != a && b.removeItem("{{LOCALSTORAGE_TOWN_BUF}}") - } + a = window.localStorage.getItem("{{LOCALSTORAGE_TOWN_BUF}}") } catch (c) { - Ta.lastError = c + Ta.lastError = c; + try { + var b = qf.getLocalStorage(); + if (null != b) { + a = b.getItem("{{LOCALSTORAGE_TOWN_BUF}}") + } + } catch (d) { + Ta.lastError = d + } } return a }; @@ -1786,11 +1790,21 @@ var $lime_init = function (A, t) { for (var f = 0; f < c.length;) d[f] = c.charCodeAt(f) & 255, ++f; a = be.decodeImportFile("mfcg.pb", d.buffer); be.applyImportPayload(a.payload, a.state, a.url, a.blueprint, a.generator, !0); + try { + window.localStorage.removeItem("{{LOCALSTORAGE_TOWN_BUF}}") + } catch (g) { + Ta.lastError = g + } return !0 } if ("j" === b) { a = be.decodeImportFile("mfcg.json", c); be.applyImportPayload(a.payload, a.state, a.url, a.blueprint, a.generator, !0); + try { + window.localStorage.removeItem("{{LOCALSTORAGE_TOWN_BUF}}") + } catch (g2) { + Ta.lastError = g2 + } return !0 } } catch (g) { @@ -8160,7 +8174,6 @@ var $lime_init = function (A, t) { try { k = FuncBin.importBin(f) } catch (n) { - k = f } if (null != k) { if (k.number != DataProto.data.DataType.geo) throw DataGeo.createTypeMismatchError(DataProto.data.DataType.geo, k.number); From d3bb90b3b06d9b4a7a39844882e3dc0943474060 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sun, 15 Feb 2026 08:19:09 +0100 Subject: [PATCH 38/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.5]=20=20=D0=BF=D1=80=D0=B5=D0=BB=D0=BE=D0=B0=D0=B4?= =?UTF-8?q?=D0=B5=D1=80=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=BC=D0=BE=D1=82=D1=80=D0=B0=203=D0=B4=20=D0=B2=20=D1=82?= =?UTF-8?q?=D1=8F=D0=B6=D0=B5=D0=BB=D1=8B=D1=85=20=D0=B3=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/mfcg.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 9d2044f..accb082 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -14556,7 +14556,7 @@ var $lime_init = function (A, t) { null == u.findWidnow(Jf) && u.showDialog(new Jf) }, onViewIn3D: function (inNewWindow = false) { - try { + return be.runBusy("Preparing 3D view...", function () { var a = Ub.instance, b = lg.export(a), c = DataProto.data.GeoObj.encode(b).finish(), d = "", e = 0; for (; e < c.length;) { var f = e + 32768; @@ -14566,10 +14566,10 @@ var $lime_init = function (A, t) { } window.localStorage.setItem("{{LOCALSTORAGE_TOWN_BUF}}", "p" + d); this.goToViewer(inNewWindow) - } catch (g) { + }.bind(this), function (g) { Ta.lastError = g; u.showDialog(new Wj("" + g)) - } + }) }, goToPrimarySource: function (inNewWindow = true) { const adr = FuncProto.paramsUrlString(params.routes.primary_source); From 908a9403e85aa862407b13356af6a6634dbc3dd9 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sun, 15 Feb 2026 08:21:36 +0100 Subject: [PATCH 39/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.5]=20=20=D0=B5=D1=88=D0=B5=20=D0=BA=D0=BE=D1=81=D1=8F?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=81=203=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/ToyTown2.js | 58 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/src/js/ToyTown2.js b/src/js/ToyTown2.js index 5213711..ec7fa0e 100644 --- a/src/js/ToyTown2.js +++ b/src/js/ToyTown2.js @@ -18530,19 +18530,55 @@ if (params !== null) (function (S, u) { if (null == c) return this.thicken(this.getMultiPolygon(a), b); switch (c) { case DataProto.data.GeoType[DataProto.data.GeoType.FeatureCollection]: - a = a.features; - c = []; - for (b = 0; b < a.length;) { - var d = a[b]; - ++b; - c.push(new lf(this.getPolygon(d.geometry), d.width)) + var features = a.features || []; + var out = []; + for (var i = 0; i < features.length; i++) { + var f = features[i]; + if (!f || !f.geometry) { + console.warn("Skip bad polygon feature:", f); + continue; + } + var poly = null; + try { + poly = this.getPolygon(f.geometry) + } catch (err) { + console.warn("Skip bad polygon feature:", f, err); + continue; + } + if (!poly || poly.length < 3) { + console.warn("Skip bad polygon feature (need >=3 points):", f); + continue; + } + var w = (f.width != null) ? f.width : b; + out.push(new lf(poly, w)) } - return c; + return out; case DataProto.data.GeoType[DataProto.data.GeoType.GeometryCollection]: - a = a.geometries; - c = []; - for (b = 0; b < a.length;) d = a[b], ++b, c.push(new lf(this.getPolygon(d), d.width)); - return c; + var geoms = a.geometries || []; + var out2 = []; + if (Array.isArray(geoms)) { + for (var j = 0; j < geoms.length; j++) { + var g = geoms[j]; + if (!g) { + console.warn("Skip bad polygon geometry:", g); + continue; + } + var poly2 = null; + try { + poly2 = this.getPolygon(g) + } catch (err2) { + console.warn("Skip bad polygon geometry:", g, err2); + continue; + } + if (!poly2 || poly2.length < 3) { + console.warn("Skip bad polygon geometry (need >=3 points):", g); + continue; + } + var w2 = (g.width != null) ? g.width : b; + out2.push(new lf(poly2, w2)) + } + } + return out2; default: return this.thicken(this.getMultiPolygon(a), b) From 1bd36b8d07f4dfe45733c46e4e70e497b70d686d Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sun, 15 Feb 2026 08:29:58 +0100 Subject: [PATCH 40/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.6]=20=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BA?= =?UTF-8?q?=D0=B0=D0=BA=20=D1=81=20=D1=81=D0=B5=D0=BB=D0=BE=D0=BC=20=D1=87?= =?UTF-8?q?=D1=82=D0=BE=20=D0=B4=D0=BE=D0=BC=D0=B0=20=D0=BF=D0=BE=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B8=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/js/mfcg.js | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b62806a..86c0973 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fantasy-maphub", "name_full": "Fantasy MapHub Generators", - "version": "1.2.4-add-data-any-imports.5", + "version": "1.2.4-add-data-any-imports.6", "description": "An offline-first hub that bundles several Watabou map generators into one consistent web app: same UI patterns, local assets, and modern import/export. It adds OpenAPI docs, proto-first serialization (including pure protobuf files), and a PWA build so everything works without an internet connection.", "license": "MPL-2.0", "author": "mail@sunsung.fun", diff --git a/src/js/mfcg.js b/src/js/mfcg.js index accb082..2738942 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -14263,6 +14263,7 @@ var $lime_init = function (A, t) { u.layer.addChild(new le); le.inst.awake.add(l(this, this.onAwake)); this.stage.addEventListener("mouseMove", l(this, this.onMouseMove)); + this.stage.addEventListener("mouseDown", l(this, this.onMouseDown)); this.stage.addEventListener("click", l(this, this.onClick)); vc.loadSaved(Ec.tools); var a = Ub.instance.bp; @@ -14287,6 +14288,7 @@ var $lime_init = function (A, t) { ia.prototype.deactivate.call(this); u.layer.removeChild(this.btnMenu); this.stage.removeEventListener("mouseMove", l(this, this.onMouseMove)); + this.stage.removeEventListener("mouseDown", l(this, this.onMouseDown)); this.stage.removeEventListener("click", l(this, this.onClick)); null != le.inst && u.layer.removeChild(le.inst) }, @@ -14371,6 +14373,79 @@ var $lime_init = function (A, t) { onMouseMove: function (a) { Sd.__neq(a.target, this.stage) || (a = ia.map, this.mouse.setTo(a.get_mouseX(), a.get_mouseY()), a = this.patch = this.model.getCell(this.mouse), a = null != a ? a.ward.getLabel() : null, le.inst.set(a)) }, + onMouseDown: function (a) { + if (1 < a.clickCount) { + var b = ia.map, + c = new I(b.get_mouseX(), b.get_mouseY()), + d = this.model.getCell(c); + if (null != d) { + var f = d.ward, + h = this.model.bp.seed + this.model.cells.indexOf(d), + k = !1; + if (f instanceof Pc) { + var n = ba.get("display_mode", "Lots"); + if ("Block" != n) { + var p = f.group.blocks; + for (var g = 0; g < p.length && !k;) { + var q = p[g]; + ++g; + if (Gb.containsPoint(q.shape, c)) { + var m; + switch (n) { + case "Complex": + m = q.buildings; + break; + case "Simple": + m = q.rects; + break; + default: + m = q.lots + } + for (var u = 0; u < m.length;) { + var r = m[u]; + ++u; + if (Gb.containsPoint(r, c)) { + var t = h + f.group.blocks.indexOf(q) + m.indexOf(r); + Te.openInDwellings(r, !0, t); + k = !0; + break + } + } + } + } + } + } else if (f instanceof xd) { + null != f.building && Gb.containsPoint(f.building, c) && (Te.openInDwellings(f.building, !0, h), k = !0) + } else if (f instanceof Ne) { + var y = f.building || []; + for (var B = 0; B < y.length;) { + var A = y[B]; + ++B; + if (Gb.containsPoint(A, c)) { + Te.openInDwellings(A, !1, h); + k = !0; + break + } + } + } else if (f instanceof yd) { + if ("Block" != ba.get("display_mode", "Lots")) { + var C = f.buildings || []; + for (var D = 0; D < C.length;) { + var E = C[D]; + ++D; + if (Gb.containsPoint(E, c)) { + var F = h + C.indexOf(E); + Te.openInDwellings(E, !1, F); + k = !0; + break + } + } + } + } + k && a.stopPropagation() + } + } + }, onClick: function (a) { null != this.patch && (a.commandKey || a.controlKey ? this.patch.reroll() : a.shiftKey && (null != this.model.focus ? this.zoomIn(null) : null != this.patch.district && this.zoomIn(this.patch.district))) From 9aa7c3edddfa7a97de59535554325e155273578d Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sun, 15 Feb 2026 08:36:07 +0100 Subject: [PATCH 41/42] =?UTF-8?q?add/data/any-imports=20[1.2.4-add-data-an?= =?UTF-8?q?y-imports.6]=20=20=D0=B7=D1=83=D0=BC=20=D0=BF=D0=BE=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BB=D0=B5=D1=81=D0=B8=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/mfcg.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/js/mfcg.js b/src/js/mfcg.js index 2738942..fcfbc6a 100644 --- a/src/js/mfcg.js +++ b/src/js/mfcg.js @@ -14249,6 +14249,7 @@ var $lime_init = function (A, t) { this.mouse = new I; ia.call(this); this.permalinkDisabled = be.importMode; + this.wheelZoomUntil = 0; this.btnMenu = new fb("Menu", l(this, this.onMenu)); sb.preview || u.layer.addChild(this.btnMenu); this.fader = Ke.create(1, l(this, this.onFadeOut)) @@ -14263,6 +14264,7 @@ var $lime_init = function (A, t) { u.layer.addChild(new le); le.inst.awake.add(l(this, this.onAwake)); this.stage.addEventListener("mouseMove", l(this, this.onMouseMove)); + this.stage.addEventListener("mouseWheel", l(this, this.onMouseWheel)); this.stage.addEventListener("mouseDown", l(this, this.onMouseDown)); this.stage.addEventListener("click", l(this, this.onClick)); vc.loadSaved(Ec.tools); @@ -14288,6 +14290,7 @@ var $lime_init = function (A, t) { ia.prototype.deactivate.call(this); u.layer.removeChild(this.btnMenu); this.stage.removeEventListener("mouseMove", l(this, this.onMouseMove)); + this.stage.removeEventListener("mouseWheel", l(this, this.onMouseWheel)); this.stage.removeEventListener("mouseDown", l(this, this.onMouseDown)); this.stage.removeEventListener("click", l(this, this.onClick)); null != le.inst && u.layer.removeChild(le.inst) @@ -14373,6 +14376,24 @@ var $lime_init = function (A, t) { onMouseMove: function (a) { Sd.__neq(a.target, this.stage) || (a = ia.map, this.mouse.setTo(a.get_mouseX(), a.get_mouseY()), a = this.patch = this.model.getCell(this.mouse), a = null != a ? a.ward.getLabel() : null, le.inst.set(a)) }, + onMouseWheel: function (a) { + var b = Date.now(); + if (b < this.wheelZoomUntil) return; + if (0 < a.delta) { + var c = ia.map, + d = new I(c.get_mouseX(), c.get_mouseY()); + c = this.model.getCell(d); + if (null != c && null != c.district) { + this.zoomIn(c.district); + this.wheelZoomUntil = b + 1E3; + a.stopPropagation() + } + } else if (0 > a.delta && null != this.model.focus) { + this.zoomIn(null); + this.wheelZoomUntil = b + 1E3; + a.stopPropagation() + } + }, onMouseDown: function (a) { if (1 < a.clickCount) { var b = ia.map, From 0a1ae564449e2a27bec18da5eb4fdc79593ea902 Mon Sep 17 00:00:00 2001 From: SunSung-W541-2025 Date: Sun, 15 Feb 2026 09:10:12 +0100 Subject: [PATCH 42/42] add/data/any-imports [1.2.4-add-data-any-imports.6] fin --- src/js/Dwellings.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/js/Dwellings.js b/src/js/Dwellings.js index f50d2e1..55ee51d 100644 --- a/src/js/Dwellings.js +++ b/src/js/Dwellings.js @@ -10143,10 +10143,10 @@ var $lime_init = function (K, v) { a.addItem("Elevation", m(this, this.switchView)); a.addItem("Blueprint", m(this, this.switchToBlueprint)); - var g = new Ac; - this.fillExportMenu(g); + var exportMenu = new Ac; + this.fillExportMenu(exportMenu); a.addItem("Import...", m(this, this.importPlan)); - 0 < g.items.length && a.addSubmenu("Export as", g); + 0 < g.items.length && a.addSubmenu("Export as", exportMenu); a.addItem("Permalink...", !this.permalinkDisabled?m(this, this.onPermalink):null); a.addSeparator();