diff --git a/LICENSE b/LICENSE index 21b4891..e8c7430 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ ISC License -Copyright (c) 2024, Mapbox +Copyright (c) 2026, Mapbox Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice diff --git a/README.md b/README.md index eb4b48b..d197b89 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## Earcut -The fastest and smallest JavaScript polygon triangulation library. 3KB gzipped. +The fastest and smallest JavaScript polygon triangulation library. 3.5KB gzipped. [![Node](https://github.com/mapbox/earcut/actions/workflows/node.yml/badge.svg)](https://github.com/mapbox/earcut/actions/workflows/node.yml) [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/mapbox/earcut.svg)](http://isitmaintained.com/project/mapbox/earcut "Average time to resolve an issue") @@ -25,20 +25,30 @@ The aim of this project is to create a JS triangulation library that is **fast enough for real-time triangulation in the browser**, sacrificing triangulation quality for raw speed and simplicity, while being robust enough to handle most practical datasets without crashing or producing garbage. -Some benchmarks using Node 0.12: -(ops/sec) | pts | earcut | libtess | poly2tri | pnltri | polyk -------------------| ---- | --------- | -------- | -------- | --------- | ------ -OSM building | 15 | _795,935_ | _50,640_ | _61,501_ | _122,966_ | _175,570_ -dude shape | 94 | _35,658_ | _10,339_ | _8,784_ | _11,172_ | _13,557_ -holed dude shape | 104 | _28,319_ | _8,883_ | _7,494_ | _2,130_ | n/a -complex OSM water | 2523 | _543_ | _77.54_ | failure | failure | n/a -huge OSM water | 5667 | _95_ | _29.30_ | failure | failure | n/a +The original use case it was created for is [Mapbox GL JS](https://www.mapbox.com/mapbox-gljs), WebGL-based interactive maps. -The original use case it was created for is [Mapbox GL](https://www.mapbox.com/mapbox-gl), WebGL-based interactive maps. +#### Performance -If you want to get correct triangulation even on very bad data with lots of self-intersections -and earcut is not precise enough, take a look at [libtess.js](https://github.com/brendankenny/libtess.js). +Earcut is heavily optimized for its primary workload — triangulating polygons from +[Mapbox Vector Tiles](https://github.com/mapbox/vector-tile-spec). On a representative +benchmark of **119,680 real-world polygons (1.9M vertices)** drawn from a window of map tiles +through zooms 4–16, it triangulates the whole set in **~480 ms** on a Macbook Pro M1 Pro (2021) — +roughly **250,000 polygons/s** or **4M vertices/s**. You can run the benchmark yourself with +`node bench/bench-tiles.js`. + +#### Robustness and alternatives + +Earcut does **not** guarantee a correct triangulation on arbitrary input — it trades quality +for speed and aims to always produce an acceptable result on practical data without crashing or +emitting garbage. It handles holes, twisted polygons, and degeneracies gracefully, but on +self-intersecting or otherwise dirty input the result can be noticeably wrong — even a small +self-intersection (especially around holes) can leave a sizable chunk of the polygon +mistriangulated. Clean your input first if correctness matters. + +If you need a guaranteed-correct triangulation even on very bad data, +[libtess.js](https://github.com/brendankenny/libtess.js) is the most widely used robust +alternative (a port of the OpenGL GLU tessellator), at the cost of being slower and larger. #### Usage diff --git a/bench/basic.js b/bench/basic.js index 8ba5f37..ab297cf 100644 --- a/bench/basic.js +++ b/bench/basic.js @@ -6,7 +6,7 @@ const {vertices, holes} = flatten(data); const start = performance.now(); let ops = 0; -let passed = 0; +let passed; do { earcut(vertices, holes); diff --git a/bench/bench-tiles.js b/bench/bench-tiles.js new file mode 100644 index 0000000..181592a --- /dev/null +++ b/bench/bench-tiles.js @@ -0,0 +1,78 @@ +// Benchmark earcut over a realistic set of MVT polygons. The fixture was generated +// from a local tile cache by a one-off, author-machine-specific script; regenerating +// it is intentionally out of scope for this repo. +import earcut from '../src/earcut.js'; +import {readTilesFixture} from './tiles-fixture.js'; + +const polys = readTilesFixture(); // each: {vertices, holes, dimensions, z} ready for earcut + +// --- distribution (representativeness check) --- +const vc = polys.map(p => p.vertices.length / p.dimensions).sort((a, b) => a - b); +const q = f => vc[Math.min(vc.length - 1, Math.floor(f * vc.length))]; +const withHoles = polys.filter(p => p.holes.length > 0).length; +const totalVerts = vc.reduce((a, b) => a + b, 0); + +console.log(`fixture: ${polys.length.toLocaleString()} polygons, ${totalVerts.toLocaleString()} vertices`); +console.log(` ${(100 * withHoles / polys.length).toFixed(1)}% with holes`); +console.log(` verts/poly: median ${q(.5)}, p90 ${q(.9)}, p99 ${q(.99)}, max ${vc[vc.length - 1]}`); + +// --- timing --- +// lean timed path: just triangulate. kept free of any extra work so timing measures +// earcut alone (the checksum is computed separately, outside the timing loop). +function run(set) { + let tris = 0; + for (const d of set) tris += earcut(d.vertices, d.holes, d.dimensions).length; + return tris; +} + +// position-weighted fold over all indices: a sensitive drift signal (catches reordered/ +// changed triangulations, not just gross breakage). Run once, never inside timing. +function checksum(set) { + let sum = 0; + for (const d of set) { + const idx = earcut(d.vertices, d.holes, d.dimensions); + for (let i = 0; i < idx.length; i++) sum = (sum + idx[i] * (i + 1)) >>> 0; + } + return sum; +} +// median wall time over a set. Assumes the JIT/caches are already primed: the overall +// pass is warmed by the tris + checksum runs before it, and the per-zoom slices are +// warmed by that overall pass (they're subsets of the same polygons). +function timeSet(set) { + const t = []; + for (let i = 0; i < 5; i++) { const s = performance.now(); run(set); t.push(performance.now() - s); } + t.sort((a, b) => a - b); + return {median: t[2], lo: t[0], hi: t[4]}; +} + +const tris = run(polys); +const sum = checksum(polys); +const overall = timeSet(polys); + +console.log(`\nresult: ${(tris / 3).toLocaleString()} triangles (checksum ${sum})`); +console.log(`time: ${overall.median.toFixed(0)} ms (${overall.lo.toFixed(0)}–${overall.hi.toFixed(0)} ms over 5 runs)`); +console.log(`speed: ${Math.round(polys.length / (overall.median / 1000)).toLocaleString()} polygons/s, ` + + `${(totalVerts / (overall.median / 1000) / 1e6).toFixed(1)}M verts/s`); + +// --- per-zoom breakdown --- +const byZoom = new Map(); +for (const d of polys) { + if (!byZoom.has(d.z)) byZoom.set(d.z, []); + byZoom.get(d.z).push(d); +} +const zooms = [...byZoom.keys()].sort((a, b) => a - b); +console.log('\nper zoom:'); +console.log(' z polygons verts med.v time %time polys/s'); +for (const z of zooms) { + const set = byZoom.get(z); + const v = set.map(d => d.vertices.length / d.dimensions).sort((a, b) => a - b); + const verts = v.reduce((a, b) => a + b, 0); + const med = v[Math.floor(v.length / 2)]; + const {median} = timeSet(set); // already warm from the overall pass + const pct = 100 * median / overall.median; + console.log( + ` ${String(z).padStart(2)} ${set.length.toLocaleString().padStart(8)} ` + + `${verts.toLocaleString().padStart(9)} ${String(med).padStart(5)} ` + + `${median.toFixed(0).padStart(5)} ms ${pct.toFixed(1).padStart(5)}% ` + + `${Math.round(set.length / (median / 1000)).toLocaleString().padStart(8)}`); +} diff --git a/bench/tiles-fixture.bin b/bench/tiles-fixture.bin new file mode 100644 index 0000000..e475e22 Binary files /dev/null and b/bench/tiles-fixture.bin differ diff --git a/bench/tiles-fixture.js b/bench/tiles-fixture.js new file mode 100644 index 0000000..d6cd8d1 --- /dev/null +++ b/bench/tiles-fixture.js @@ -0,0 +1,119 @@ +import {readFileSync} from 'fs'; +import {flatten} from '../src/earcut.js'; + +// Reads tiles-fixture.bin: length-delimited packed-varint MVT geometry blobs, +// one per polygon feature. Decodes them with a small varint reader (no pbf +// dependency), reconstructs polygons by splitting multipolygons and classifying +// holes by signed area, per the MVT spec. +// +// tiles-fixture.bin format (little-endian LEB128 unsigned varints throughout): +// +// file := tile* (repeated until EOF) +// tile := zoom featureCount feature* +// feature := geomLen geom (geomLen = number of varints in geom) +// geom := uint32* (raw MVT command/parameter integers) +// +// The geom integers are the native MVT polygon encoding: MoveTo/LineTo/ClosePath +// command-integers interleaved with zigzag delta-encoded coordinate pairs. +export function readTilesFixture() { + const buf = readFileSync(new URL('./tiles-fixture.bin', import.meta.url)); + const cursor = {pos: 0}; + const polys = []; + + while (cursor.pos < buf.length) { + const z = readVarint(buf, cursor); + const features = readVarint(buf, cursor); + + for (let feature = 0; feature < features; feature++) { + const count = readVarint(buf, cursor); + + const geom = new Array(count); + for (let i = 0; i < count; i++) geom[i] = readVarint(buf, cursor); + + let current = null; + const push = (rings) => { + const data = flatten(rings); + data.z = z; + polys.push(data); + }; + + for (const ring of decodeMvtRings(geom)) { + if (ring.length < 3) continue; + + const area = ringArea(ring); + if (area === 0) continue; + + if (area > 0) { + if (current) push(current); + current = [ring]; + } else if (current) { + current.push(ring); + } + } + if (current) push(current); + } + } + + return polys; +} + +function readVarint(buf, cursor) { + let val = 0; + let shift = 0; + let b; + do { + let pos = cursor.pos; + b = buf[pos++]; + cursor.pos = pos; + val |= (b & 0x7f) << shift; + shift += 7; + } while (b & 0x80); + return val >>> 0; +} + +function decodeMvtRings(geom) { + const rings = []; + let x = 0; + let y = 0; + let ring = null; + let i = 0; + + while (i < geom.length) { + const cmd = geom[i] & 0x7; + const count = geom[i] >> 3; + i++; + + if (cmd === 1) { + for (let k = 0; k < count; k++) { + x += zigZagDecode(geom[i++]); + y += zigZagDecode(geom[i++]); + if (ring) rings.push(ring); + ring = [[x, y]]; + } + } else if (cmd === 2) { + for (let k = 0; k < count; k++) { + x += zigZagDecode(geom[i++]); + y += zigZagDecode(geom[i++]); + ring.push([x, y]); + } + } else if (cmd === 7 && ring) { + rings.push(ring); + ring = null; + } + } + + if (ring) rings.push(ring); + return rings; +} + +function zigZagDecode(n) { + return (n >> 1) ^ (-(n & 1)); +} + +function ringArea(ring) { + let sum = 0; + for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) { + sum += (ring[j][0] - ring[i][0]) * (ring[i][1] + ring[j][1]); + } + return sum / 2; +} diff --git a/package-lock.json b/package-lock.json index 29e6e0b..cbb9f7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,17 +9,17 @@ "version": "3.0.2", "license": "ISC", "devDependencies": { - "@rollup/plugin-terser": "^0.4.4", + "@rollup/plugin-terser": "^1.0.0", "benchmark": "^2.1.4", - "eslint": "^9.34.0", - "eslint-config-mourner": "^4.1.0", - "rollup": "^4.48.1" + "eslint": "^10.5.0", + "eslint-config-mourner": "^5.0.1", + "rollup": "^4.62.2" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -49,9 +49,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -59,140 +59,127 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^10.2.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^1.2.1", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -263,9 +250,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -274,18 +261,18 @@ } }, "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-1.0.0.tgz", + "integrity": "sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==", "dev": true, "license": "MIT", "dependencies": { - "serialize-javascript": "^6.0.1", + "serialize-javascript": "^7.0.3", "smob": "^1.0.0", "terser": "^5.17.4" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" @@ -297,9 +284,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.48.1.tgz", - "integrity": "sha512-rGmb8qoG/zdmKoYELCBwu7vt+9HxZ7Koos3pD0+sH5fR3u3Wb/jGcpnqxcnWsPEKDUyzeLSqksN8LJtgXjqBYw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", "cpu": [ "arm" ], @@ -311,9 +298,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.48.1.tgz", - "integrity": "sha512-4e9WtTxrk3gu1DFE+imNJr4WsL13nWbD/Y6wQcyku5qadlKHY3OQ3LJ/INrrjngv2BJIHnIzbqMk1GTAC2P8yQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", "cpu": [ "arm64" ], @@ -325,9 +312,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.48.1.tgz", - "integrity": "sha512-+XjmyChHfc4TSs6WUQGmVf7Hkg8ferMAE2aNYYWjiLzAS/T62uOsdfnqv+GHRjq7rKRnYh4mwWb4Hz7h/alp8A==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", "cpu": [ "arm64" ], @@ -339,9 +326,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.48.1.tgz", - "integrity": "sha512-upGEY7Ftw8M6BAJyGwnwMw91rSqXTcOKZnnveKrVWsMTF8/k5mleKSuh7D4v4IV1pLxKAk3Tbs0Lo9qYmii5mQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", "cpu": [ "x64" ], @@ -353,9 +340,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.48.1.tgz", - "integrity": "sha512-P9ViWakdoynYFUOZhqq97vBrhuvRLAbN/p2tAVJvhLb8SvN7rbBnJQcBu8e/rQts42pXGLVhfsAP0k9KXWa3nQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", "cpu": [ "arm64" ], @@ -367,9 +354,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.48.1.tgz", - "integrity": "sha512-VLKIwIpnBya5/saccM8JshpbxfyJt0Dsli0PjXozHwbSVaHTvWXJH1bbCwPXxnMzU4zVEfgD1HpW3VQHomi2AQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", "cpu": [ "x64" ], @@ -381,13 +368,16 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.48.1.tgz", - "integrity": "sha512-3zEuZsXfKaw8n/yF7t8N6NNdhyFw3s8xJTqjbTDXlipwrEHo4GtIKcMJr5Ed29leLpB9AugtAQpAHW0jvtKKaQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", "cpu": [ "arm" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -395,13 +385,16 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.48.1.tgz", - "integrity": "sha512-leo9tOIlKrcBmmEypzunV/2w946JeLbTdDlwEZ7OnnsUyelZ72NMnT4B2vsikSgwQifjnJUbdXzuW4ToN1wV+Q==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", "cpu": [ "arm" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -409,13 +402,16 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.48.1.tgz", - "integrity": "sha512-Vy/WS4z4jEyvnJm+CnPfExIv5sSKqZrUr98h03hpAMbE2aI0aD2wvK6GiSe8Gx2wGp3eD81cYDpLLBqNb2ydwQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -423,27 +419,50 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.48.1.tgz", - "integrity": "sha512-x5Kzn7XTwIssU9UYqWDB9VpLpfHYuXw5c6bJr4Mzv9kIv242vmJHbI5PJJEnmBYitUIfoMCODDhR7KoZLot2VQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.48.1.tgz", - "integrity": "sha512-yzCaBbwkkWt/EcgJOKDUdUpMHjhiZT/eDktOPWvSRpqrVE04p0Nd6EGV4/g7MARXXeOqstflqsKuXVM3H9wOIQ==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", "cpu": [ "loong64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -451,13 +470,33 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.48.1.tgz", - "integrity": "sha512-UK0WzWUjMAJccHIeOpPhPcKBqax7QFg47hwZTp6kiMhQHeOYJeaMwzeRZe1q5IiTKsaLnHu9s6toSYVUlZ2QtQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -465,13 +504,16 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.48.1.tgz", - "integrity": "sha512-3NADEIlt+aCdCbWVZ7D3tBjBX1lHpXxcvrLt/kdXTiBrOds8APTdtk2yRL2GgmnSVeX4YS1JIf0imFujg78vpw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -479,13 +521,16 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.48.1.tgz", - "integrity": "sha512-euuwm/QTXAMOcyiFCcrx0/S2jGvFlKJ2Iro8rsmYL53dlblp3LkUQVFzEidHhvIPPvcIsxDhl2wkBE+I6YVGzA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -493,13 +538,16 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.48.1.tgz", - "integrity": "sha512-w8mULUjmPdWLJgmTYJx/W6Qhln1a+yqvgwmGXcQl2vFBkWsKGUBRbtLRuKJUln8Uaimf07zgJNxOhHOvjSQmBQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -507,13 +555,16 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.48.1.tgz", - "integrity": "sha512-90taWXCWxTbClWuMZD0DKYohY1EovA+W5iytpE89oUPmT5O1HFdf8cuuVIylE6vCbrGdIGv85lVRzTcpTRZ+kA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -521,23 +572,54 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.48.1.tgz", - "integrity": "sha512-2Gu29SkFh1FfTRuN1GR1afMuND2GKzlORQUP3mNMJbqdndOg7gNsa81JnORctazHRokiDzQ5+MLE5XYmZW5VWg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.48.1.tgz", - "integrity": "sha512-6kQFR1WuAO50bxkIlAVeIYsz3RUx+xymwhTo9j94dJ+kmHe9ly7muH23sdfWduD0BA8pD9/yhonUvAjxGh34jQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", "cpu": [ "arm64" ], @@ -549,9 +631,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.48.1.tgz", - "integrity": "sha512-RUyZZ/mga88lMI3RlXFs4WQ7n3VyU07sPXmMG7/C1NOi8qisUg57Y7LRarqoGoAiopmGmChUhSwfpvQ3H5iGSQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", "cpu": [ "ia32" ], @@ -562,10 +644,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.48.1.tgz", - "integrity": "sha512-8a/caCUN4vkTChxkaIJcMtwIVcBhi4X2PQRoT+yCK3qRYaZ7cURrmJFL5Ux9H9RaMIXj9RuihckdmkBX3zZsgg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", "cpu": [ "x64" ], @@ -577,14 +673,14 @@ ] }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.2.3.tgz", - "integrity": "sha512-oY7GVkJGVMI5benlBDCaRrSC1qPasafyv5dOBLLv5MTilMGnErKhO6ziEfodDDIZbo5QxPUNW360VudJOFODMw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/types": "^8.38.0", + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.56.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", @@ -594,13 +690,51 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": ">=9.0.0" + "eslint": "^9.0.0 || ^10.0.0" } }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, @@ -612,9 +746,9 @@ "license": "MIT" }, "node_modules/@typescript-eslint/types": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.40.0.tgz", - "integrity": "sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==", + "version": "8.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.0.tgz", + "integrity": "sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==", "dev": true, "license": "MIT", "engines": { @@ -626,9 +760,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", "bin": { @@ -649,9 +783,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -665,36 +799,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "18 || 20 || >=22" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, "node_modules/benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", @@ -707,14 +821,16 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/buffer-from": { @@ -724,53 +840,6 @@ "dev": true, "license": "MIT" }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -778,13 +847,6 @@ "dev": true, "license": "MIT" }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -801,9 +863,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -839,34 +901,33 @@ } }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.5.0.tgz", + "integrity": "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==", "dev": true, "license": "MIT", + "workspaces": [ + "packages/*" + ], "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", + "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -876,8 +937,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -885,7 +945,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -900,82 +960,71 @@ } }, "node_modules/eslint-config-mourner": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-mourner/-/eslint-config-mourner-4.1.0.tgz", - "integrity": "sha512-XEPuEuauqbnLPi/QZGjZr57w2+quw1fEXa2p6jz3tR8ggDk/ciMjiQo7/PR43t47osdS/RaduN/T1MGncwmOKQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-mourner/-/eslint-config-mourner-5.0.1.tgz", + "integrity": "sha512-+bJjgJanAP1Nk0HIO1aV7CJZLa7zl/ymaFSff+HeSLHr9ifuHc8nX9dNdrjO7GnGdrgRMrmrAq3TCqfwj6NHiQ==", "dev": true, "license": "ISC", "dependencies": { - "@eslint/js": "^9.31.0", - "@stylistic/eslint-plugin": "^5.1.0", - "globals": "^16.3.0" - } - }, - "node_modules/eslint-config-mourner/node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@eslint/js": "^10.0.1", + "@stylistic/eslint-plugin": "^5.10.0", + "globals": "^17.6.0" } }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1084,9 +1133,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -1119,9 +1168,9 @@ } }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", + "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", "dev": true, "license": "MIT", "engines": { @@ -1131,16 +1180,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -1151,23 +1190,6 @@ "node": ">= 4" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -1208,19 +1230,6 @@ "dev": true, "license": "ISC" }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -1283,30 +1292,26 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true, "license": "MIT" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.5" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ms": { @@ -1373,19 +1378,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1407,9 +1399,9 @@ } }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -1446,34 +1438,14 @@ "node": ">=6" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/rollup": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.48.1.tgz", - "integrity": "sha512-jVG20NvbhTYDkGAty2/Yh7HK6/q3DGSRH4o8ALKGArmMuaauM9kLfoMZ+WliPwA5+JHr2lTn3g557FxBV87ifg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@types/estree": "1.0.9" }, "bin": { "rollup": "dist/bin/rollup" @@ -1483,58 +1455,42 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.48.1", - "@rollup/rollup-android-arm64": "4.48.1", - "@rollup/rollup-darwin-arm64": "4.48.1", - "@rollup/rollup-darwin-x64": "4.48.1", - "@rollup/rollup-freebsd-arm64": "4.48.1", - "@rollup/rollup-freebsd-x64": "4.48.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.48.1", - "@rollup/rollup-linux-arm-musleabihf": "4.48.1", - "@rollup/rollup-linux-arm64-gnu": "4.48.1", - "@rollup/rollup-linux-arm64-musl": "4.48.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.48.1", - "@rollup/rollup-linux-ppc64-gnu": "4.48.1", - "@rollup/rollup-linux-riscv64-gnu": "4.48.1", - "@rollup/rollup-linux-riscv64-musl": "4.48.1", - "@rollup/rollup-linux-s390x-gnu": "4.48.1", - "@rollup/rollup-linux-x64-gnu": "4.48.1", - "@rollup/rollup-linux-x64-musl": "4.48.1", - "@rollup/rollup-win32-arm64-msvc": "4.48.1", - "@rollup/rollup-win32-ia32-msvc": "4.48.1", - "@rollup/rollup-win32-x64-msvc": "4.48.1", + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", "fsevents": "~2.3.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.6.tgz", + "integrity": "sha512-ATTK5Q4gFVg0YDp1my2vqygyvhcklD/UV5GIlYHooGTn/NogJqIzpetkD6E5kmuVULqz/S9inUL25XcAgDRJQg==", "dev": true, "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "engines": { + "node": ">=20.0.0" } }, "node_modules/shebang-command": { @@ -1561,11 +1517,14 @@ } }, "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.6.2.tgz", + "integrity": "sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } }, "node_modules/source-map": { "version": "0.6.1", @@ -1588,41 +1547,15 @@ "source-map": "^0.6.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, diff --git a/package.json b/package.json index 4550d5b..4a4f4d0 100644 --- a/package.json +++ b/package.json @@ -17,24 +17,20 @@ "prepublishOnly": "npm run build", "cov": "node --test --experimental-test-coverage" }, - "author": "Vladimir Agafonkin", + "author": "Volodymyr Agafonkin", "license": "ISC", "devDependencies": { - "@rollup/plugin-terser": "^0.4.4", + "@rollup/plugin-terser": "^1.0.0", "benchmark": "^2.1.4", - "eslint": "^9.34.0", - "eslint-config-mourner": "^4.1.0", - "rollup": "^4.48.1" - }, - "eslintConfig": { - "extends": "mourner", - "parserOptions": { - "sourceType": "module", - "ecmaVersion": 2020 - } + "eslint": "^10.5.0", + "eslint-config-mourner": "^5.0.1", + "rollup": "^4.62.2" }, "repository": { "type": "git", "url": "git://github.com/mapbox/earcut.git" + }, + "allowScripts": { + "fsevents@2.3.3": true } } diff --git a/src/earcut.js b/src/earcut.js index 6c2ed21..0cf76c2 100644 --- a/src/earcut.js +++ b/src/earcut.js @@ -1,8 +1,14 @@ +// single-vertex holes to preserve through filterPoints (steiner points); kept off the Node +// shape since they're rare — the empty-set fast path means non-steiner inputs pay nothing +const steiners = new Set(); + export default function earcut(data, holeIndices, dim = 2) { const hasHoles = holeIndices && holeIndices.length; const outerLen = hasHoles ? holeIndices[0] * dim : data.length; + if (steiners.size) steiners.clear(); + let outerNode = linkedList(data, 0, outerLen, dim, true); const triangles = []; @@ -10,7 +16,11 @@ export default function earcut(data, holeIndices, dim = 2) { let minX, minY, invSize; - if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + if (hasHoles) { + outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + // collapse collinear/coincident points across the whole merged ring once before clipping + outerNode = filterPoints(outerNode); + } // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox if (data.length > 80 * dim) { @@ -56,24 +66,27 @@ function linkedList(data, start, end, dim, clockwise) { return last; } -// eliminate colinear or duplicate points -function filterPoints(start, end) { - if (!start) return start; - if (!end) end = start; +// Remove collinear or coincident points; removability depends only on a node's immediate +// neighbors, so we sweep forward and re-check the predecessor after each removal. With no `end` +// we sweep the whole ring, lapping until nothing is removable (the fixpoint the clipper needs). +// With an explicit `end` we heal only the dirty window around a bridge/diagonal cut, stopping at +// `end` rather than lapping — O(window) instead of O(ring). +function filterPoints(start, end = start) { + if (!start) return null; + const full = end === start; - let p = start, - again; + let p = start, again; do { again = false; - - if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + if (p !== p.next && (steiners.size === 0 || !steiners.has(p)) && + (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + if (full || p === end) end = p.prev; // pull the stop bound back past the removal removeNode(p); - p = end = p.prev; - if (p === p.next) break; + p = p.prev; // re-check the predecessor again = true; - - } else { + } else if (full || p !== end) { p = p.next; + again = !full; // local heal: keep looping until the sweep reaches end } } while (again || p !== end); @@ -94,14 +107,13 @@ function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { const prev = ear.prev; const next = ear.next; - if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { + if (area(prev, ear, next) < 0 && (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear))) { triangles.push(prev.i, ear.i, next.i); // cut off the triangle removeNode(ear); - // skipping the next vertex leads to less sliver triangles - ear = next.next; - stop = next.next; + ear = next; + stop = next; continue; } @@ -135,9 +147,11 @@ function isEar(ear) { b = ear, c = ear.next; - if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + // reflex check (area(a, b, c) >= 0) is hoisted into the earcutLinked caller to avoid non-inlined call here - // now make sure we don't have other points inside the potential ear + // make sure we don't have other points inside the potential ear; the point-in-triangle + // test (false when the point coincides with the first vertex a) is inlined here and in + // isEarHashed rather than called — V8 doesn't inline it and the call sits in the hot loop const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; // triangle bbox @@ -149,7 +163,7 @@ function isEar(ear) { let p = c.next; while (p !== a) { if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && - pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && + !(ax === p.x && ay === p.y) && (cx - p.x) * (ay - p.y) >= (ax - p.x) * (cy - p.y) && (ax - p.x) * (by - p.y) >= (bx - p.x) * (ay - p.y) && (bx - p.x) * (cy - p.y) >= (cx - p.x) * (by - p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.next; } @@ -162,7 +176,7 @@ function isEarHashed(ear, minX, minY, invSize) { b = ear, c = ear.next; - if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + // reflex check is hoisted into the earcutLinked caller (see isEar) const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; @@ -181,26 +195,26 @@ function isEarHashed(ear, minX, minY, invSize) { // look for points inside the triangle in both directions while (p && p.z >= minZ && n && n.z <= maxZ) { - if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && - pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== c && + !(ax === p.x && ay === p.y) && (cx - p.x) * (ay - p.y) >= (ax - p.x) * (cy - p.y) && (ax - p.x) * (by - p.y) >= (bx - p.x) * (ay - p.y) && (bx - p.x) * (cy - p.y) >= (cx - p.x) * (by - p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.prevZ; - if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && - pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== c && + !(ax === n.x && ay === n.y) && (cx - n.x) * (ay - n.y) >= (ax - n.x) * (cy - n.y) && (ax - n.x) * (by - n.y) >= (bx - n.x) * (ay - n.y) && (bx - n.x) * (cy - n.y) >= (cx - n.x) * (by - n.y) && area(n.prev, n, n.next) >= 0) return false; n = n.nextZ; } // look for remaining points in decreasing z-order while (p && p.z >= minZ) { - if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && - pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== c && + !(ax === p.x && ay === p.y) && (cx - p.x) * (ay - p.y) >= (ax - p.x) * (cy - p.y) && (ax - p.x) * (by - p.y) >= (bx - p.x) * (ay - p.y) && (bx - p.x) * (cy - p.y) >= (cx - p.x) * (by - p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.prevZ; } // look for remaining points in increasing z-order while (n && n.z <= maxZ) { - if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && - pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== c && + !(ax === n.x && ay === n.y) && (cx - n.x) * (ay - n.y) >= (ax - n.x) * (cy - n.y) && (ax - n.x) * (by - n.y) >= (bx - n.x) * (ay - n.y) && (bx - n.x) * (cy - n.y) >= (cx - n.x) * (by - n.y) && area(n.prev, n, n.next) >= 0) return false; n = n.nextZ; } @@ -210,11 +224,12 @@ function isEarHashed(ear, minX, minY, invSize) { // go through all polygon nodes and cure small local self-intersections function cureLocalIntersections(start, triangles) { let p = start; + let cured = false; do { const a = p.prev, b = p.next.next; - if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { + if (intersects(a, p, p.next, b, false) && locallyInside(a, b) && locallyInside(b, a)) { triangles.push(a.i, p.i, b.i); @@ -223,11 +238,12 @@ function cureLocalIntersections(start, triangles) { removeNode(p.next); p = start = b; + cured = true; } p = p.next; } while (p !== start); - return filterPoints(p); + return cured ? filterPoints(p) : p; } // try splitting polygon into two and triangulate them independently @@ -256,6 +272,9 @@ function splitEarcut(start, triangles, dim, minX, minY, invSize) { } while (a !== start); } +// true only while eliminateHoles merges holes, so removeNode keeps the block index live (growBlock) +let indexActive = false; + // link every hole into the outer loop, producing a single-ring polygon without holes function eliminateHoles(data, holeIndices, outerNode, dim) { const queue = []; @@ -264,33 +283,34 @@ function eliminateHoles(data, holeIndices, outerNode, dim) { const start = holeIndices[i] * dim; const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; const list = linkedList(data, start, end, dim, false); - if (list === list.next) list.steiner = true; + if (list === list.next) steiners.add(list); queue.push(getLeftmost(list)); } queue.sort(compareXYSlope); - // process holes from left to right + // block-bbox index for findHoleBridge, grown append-only as holes merge (see notes + // above buildBlockIndex). Seed it with the outer ring, then append each merged hole. + buildBlockIndex(data.length / dim, holeIndices.length); + indexSegment(outerNode, outerNode); + + // process holes from left to right; indexActive lets removeNode keep block bboxes live as + // filterPoints heals edges during merges (see growBlock) + indexActive = true; for (let i = 0; i < queue.length; i++) { outerNode = eliminateHole(queue[i], outerNode); } + indexActive = false; return outerNode; } function compareXYSlope(a, b) { - let result = a.x - b.x; // when the left-most point of 2 holes meet at a vertex, sort the holes counterclockwise so that when we find // the bridge to the outer shell is always the point that they meet at. - if (result === 0) { - result = a.y - b.y; - if (result === 0) { - const aSlope = (a.next.y - a.y) / (a.next.x - a.x); - const bSlope = (b.next.y - b.y) / (b.next.x - b.x); - result = aSlope - bSlope; - } - } - return result; + return a.x - b.x || a.y - b.y || + (a.next.y - a.y) / (a.next.x - a.x) - + (b.next.y - b.y) / (b.next.x - b.x); } // find a bridge between vertices that connects hole with an outer ring and link it @@ -302,11 +322,97 @@ function eliminateHole(hole, outerNode) { const bridgeReverse = splitPolygon(bridge, hole); - // filter collinear points around the cuts + // index the merged-in segment before filtering: in ring order the splice runs + // bridge -> hole -> bridgeReverse -> bridge2 -> (bridge's old next), covering the + // hole's edges and both new slit edges. filterPoints below only drops collinear / + // coincident points, so these bboxes stay valid (conservative) supersets. + const bridge2 = bridgeReverse.next; + indexSegment(bridge, bridge2.next); + + // heal collinear/coincident points around the two new slit edges filterPoints(bridgeReverse, bridgeReverse.next); return filterPoints(bridge, bridge.next); } +// Block-bbox index for findHoleBridge (issue #183): one [minX,minY,maxX,maxY] bbox per K +// consecutive ring edges, in a flat Float64Array, so the leftward-ray scan can skip whole +// blocks in O(1) instead of walking the entire merged ring. Grown append-only — the outer +// ring seeds it, then each merged hole appends a segment (head node, stop node, K-blocks +// over head..stop); independent segments, not a ring tiling, since splices land mid-ring. +// Buffers are sized once from the input upper bound and reused across calls. +// +// filterPoints only drops collinear/coincident points, so a stale bbox stays a conservative +// superset of its live edges (never a false skip); the scan skips dead nodes (p.prev.next !== +// p) and lazily advances a dead stop. Blocks are scanned in append (not ring) order, so the +// chosen bridge can differ from the un-indexed code — a different but equally valid result. +const K = 16; // edges per block + +let blockBBox = new Float64Array(0); // [minX,minY,maxX,maxY] per block +let numBlocks = 0; +const blockHead = []; // first node of each block's segment +const blockStop = []; // node just past each block's segment (exclusive walk bound) + +function buildBlockIndex(maxNodes, numHoles) { + // upper bound: every input node indexed once, +2 bridge nodes per hole, plus a partial + // trailing block per appended segment (outer ring + one per hole) + const maxBlocks = Math.ceil((maxNodes + 2 * numHoles) / K) + numHoles + 2; + if (blockBBox.length < maxBlocks * 4) blockBBox = new Float64Array(maxBlocks * 4); + numBlocks = 0; +} + +// index the ring run head..stop (exclusive) as ceil(len / K) blocks; head === stop means +// the whole ring. each block's bbox covers both endpoints of every edge it owns. +function indexSegment(head, stop) { + let p = head; + do { + const b = numBlocks++; + blockHead[b] = p; + let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; + let k = 0; + do { + const c = p.next; // edge p->c; bbox must bound both endpoints + p.z = b; // reuse z as the owning block during eliminateHoles (see growBlock) + if (p.x < minX) minX = p.x; if (p.x > maxX) maxX = p.x; + if (p.y < minY) minY = p.y; if (p.y > maxY) maxY = p.y; + if (c.x < minX) minX = c.x; if (c.x > maxX) maxX = c.x; + if (c.y < minY) minY = c.y; if (c.y > maxY) maxY = c.y; + p = c; + } while (++k < K && p !== stop); + blockStop[b] = p; + const g = b * 4; + blockBBox[g] = minX; blockBBox[g + 1] = minY; blockBBox[g + 2] = maxX; blockBBox[g + 3] = maxY; + } while (p !== stop); +} + +// when filterPoints heals an edge head->tail (removing the collinear node between them), the +// healed edge can extend past head's frozen block bbox if its old far endpoint lived in another +// block; grow head's block bbox to cover tail so the leftward-ray prune can't false-skip it. +function growBlock(head, tail) { + const g = head.z * 4; + if (tail.x < blockBBox[g]) blockBBox[g] = tail.x; + if (tail.y < blockBBox[g + 1]) blockBBox[g + 1] = tail.y; + if (tail.x > blockBBox[g + 2]) blockBBox[g + 2] = tail.x; + if (tail.y > blockBBox[g + 3]) blockBBox[g + 3] = tail.y; +} + +function liveBlockStop(b) { + let stop = blockStop[b]; + while (stop.prev.next !== stop) stop = stop.next; + blockStop[b] = stop; + return stop; +} + +// the block's head node can be removed by filterPoints during merges; advance it to the next +// live node so the walk doesn't start on (and immediately terminate at) a dead node. For the +// single full-ring seed block (head === stop) the same forward advance keeps them equal, so the +// do-while still laps the whole ring instead of collapsing to an empty walk. +function liveBlockHead(b) { + let head = blockHead[b]; + while (head.prev.next !== head) head = head.next; + blockHead[b] = head; + return head; +} + // David Eberly's algorithm for finding a bridge between hole and outer polygon function findHoleBridge(hole, outerNode) { let p = outerNode; @@ -319,18 +425,31 @@ function findHoleBridge(hole, outerNode) { // segment's endpoint with lesser x will be potential connection point // unless they intersect at a vertex, then choose the vertex if (equals(hole, p)) return p; - do { - if (equals(hole, p.next)) return p.next; - else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { - const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); - if (x <= hx && x > qx) { - qx = x; - m = p.x < p.next.x ? p : p.next; - if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint + + // scan blocks; skip any whose bbox can't hold a crossing that beats qx and lies left + // of hx (the prune Morton order can't express — explicit per-axis [minY,maxY]/[minX,maxX]) + for (let b = 0, g = 0; b < numBlocks; b++, g += 4) { + if (hy < blockBBox[g + 1] || hy > blockBBox[g + 3] || blockBBox[g] > hx || blockBBox[g + 2] <= qx) continue; + + // ensure the walk's exclusive bound is live so we don't overrun into other blocks + const stop = liveBlockStop(b); + + p = liveBlockHead(b); + do { + if (p.prev.next === p) { // skip nodes removed by filterPoints (stale in the index) + if (equals(hole, p.next)) return p.next; + else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { + const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); + if (x <= hx && x > qx) { + qx = x; + m = p.x < p.next.x ? p : p.next; + if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint + } + } } - } - p = p.next; - } while (p !== outerNode); + p = p.next; + } while (p !== stop); + } if (!m) return null; @@ -338,28 +457,35 @@ function findHoleBridge(hole, outerNode) { // if there are no points found, we have a valid connection; // otherwise choose the point of the minimum angle with the ray as connection point - const stop = m; const mx = m.x; const my = m.y; + const tminY = Math.min(hy, my); // the triangle's y span; x span is [mx, hx] + const tmaxY = Math.max(hy, my); let tanMin = Infinity; - p = m; + // scan the same blocks; skip any whose bbox can't overlap the triangle's [mx,hx]×[tminY,tmaxY] box + for (let b = 0, g = 0; b < numBlocks; b++, g += 4) { + if (blockBBox[g + 2] < mx || blockBBox[g] > hx || blockBBox[g + 3] < tminY || blockBBox[g + 1] > tmaxY) continue; - do { - if (hx >= p.x && p.x >= mx && hx !== p.x && - pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { + const stop = liveBlockStop(b); - const tan = Math.abs(hy - p.y) / (hx - p.x); // tangential + p = liveBlockHead(b); + do { + if (p.prev.next === p && hx >= p.x && p.x >= mx && hx !== p.x && // skip dead nodes + pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { - if (locallyInside(p, hole) && - (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) { - m = p; - tanMin = tan; + const tan = Math.abs(hy - p.y) / (hx - p.x); // tangential + + if (locallyInside(p, hole) && + (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) { + m = p; + tanMin = tan; + } } - } - p = p.next; - } while (p !== stop); + p = p.next; + } while (p !== stop); + } return m; } @@ -369,74 +495,61 @@ function sectorContainsSector(m, p) { return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0; } -// interlink polygon nodes in z-order +// scratch array of node refs, reused across calls and grown on demand +const sortArr = []; + +// interlink polygon nodes in z-order: collect into an array, quicksort by z, relink function indexCurve(start, minX, minY, invSize) { let p = start; + let n = 0; do { - if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize); - p.prevZ = p.prev; - p.nextZ = p.next; + // always (re)compute: z may still hold a block index left over from eliminateHoles + p.z = zOrder(p.x, p.y, minX, minY, invSize); + sortArr[n++] = p; p = p.next; } while (p !== start); - p.prevZ.nextZ = null; - p.prevZ = null; + quicksortNodes(sortArr, 0, n - 1); - sortLinked(p); + let prev = null; + for (let i = 0; i < n; i++) { + const node = sortArr[i]; + node.prevZ = prev; + if (prev) prev.nextZ = node; + prev = node; + } + prev.nextZ = null; } -// Simon Tatham's linked list merge sort algorithm -// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html -function sortLinked(list) { - let numMerges; - let inSize = 1; - - do { - let p = list; - let e; - list = null; - let tail = null; - numMerges = 0; - - while (p) { - numMerges++; - let q = p; - let pSize = 0; - for (let i = 0; i < inSize; i++) { - pSize++; - q = q.nextZ; - if (!q) break; - } - let qSize = inSize; - - while (pSize > 0 || (qSize > 0 && q)) { - - if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { - e = p; - p = p.nextZ; - pSize--; - } else { - e = q; - q = q.nextZ; - qSize--; - } - - if (tail) tail.nextZ = e; - else list = e; +// quicksort an array of nodes by z; middle-element pivot + insertion sort for small ranges +function quicksortNodes(arr, left, right) { + while (right - left > 20) { + // middle pivot splits already-sorted/reversed runs evenly; real ring-order-by-z data + // is non-adversarial, so the median-of-three guard isn't needed + const pivot = arr[(left + right) >> 1].z; - e.prevZ = tail; - tail = e; - } - - p = q; + let i = left, j = right, t; + while (i <= j) { + while (arr[i].z < pivot) i++; + while (arr[j].z > pivot) j--; + if (i <= j) { t = arr[i]; arr[i] = arr[j]; arr[j] = t; i++; j--; } } - - tail.nextZ = null; - inSize *= 2; - - } while (numMerges > 1); - - return list; + // recurse into the smaller half, loop on the larger to bound stack depth + if (j - left < right - i) { + quicksortNodes(arr, left, j); + left = i; + } else { + quicksortNodes(arr, i, right); + right = j; + } + } + // insertion sort the small remaining range + for (let i = left + 1; i <= right; i++) { + const node = arr[i], z = node.z; + let j = i - 1; + while (j >= left && arr[j].z > z) { arr[j + 1] = arr[j]; j--; } + arr[j + 1] = node; + } } // z-order of a point given coords and inverse of the longer side of data bbox @@ -477,14 +590,9 @@ function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { (bx - px) * (cy - py) >= (cx - px) * (by - py); } -// check if a point lies within a convex triangle but false if its equal to the first point of the triangle -function pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) { - return !(ax === px && ay === py) && pointInTriangle(ax, ay, bx, by, cx, cy, px, py); -} - // check if a diagonal between two polygon nodes is valid (lies in polygon interior) function isValidDiagonal(a, b) { - return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges + return a.next.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case @@ -500,14 +608,16 @@ function equals(p1, p2) { return p1.x === p2.x && p1.y === p2.y; } -// check if two segments intersect -function intersects(p1, q1, p2, q2) { - const o1 = sign(area(p1, q1, p2)); - const o2 = sign(area(p1, q1, q2)); - const o3 = sign(area(p2, q2, p1)); - const o4 = sign(area(p2, q2, q1)); +// check if two segments intersect; by default includes collinear boundary touches +function intersects(p1, q1, p2, q2, includeBoundary = true) { + const o1 = area(p1, q1, p2); + const o2 = area(p1, q1, q2); + const o3 = area(p2, q2, p1); + const o4 = area(p2, q2, q1); + + if (((o1 > 0 && o2 < 0) || (o1 < 0 && o2 > 0)) && ((o3 > 0 && o4 < 0) || (o3 < 0 && o4 > 0))) return true; - if (o1 !== o2 && o3 !== o4) return true; // general case + if (!includeBoundary) return false; if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1 if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1 @@ -522,17 +632,26 @@ function onSegment(p, q, r) { return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y); } -function sign(num) { - return num > 0 ? 1 : num < 0 ? -1 : 0; -} - // check if a polygon diagonal intersects any polygon segments function intersectsPolygon(a, b) { + // diagonal bbox; an edge whose bbox can't overlap it can't intersect it, so + // skip the orientation test for those (the common case — the diagonal is short) + const minX = Math.min(a.x, b.x); + const maxX = Math.max(a.x, b.x); + const minY = Math.min(a.y, b.y); + const maxY = Math.max(a.y, b.y); + let p = a; do { - if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && - intersects(p, p.next, a, b)) return true; - p = p.next; + const n = p.next; + if ((p.x > maxX && n.x > maxX) || (p.x < minX && n.x < minX) || + (p.y > maxY && n.y > maxY) || (p.y < minY && n.y < minY)) { + p = n; + continue; + } + if (p.i !== a.i && n.i !== a.i && p.i !== b.i && n.i !== b.i && + intersects(p, n, a, b)) return true; + p = n; } while (p !== a); return false; @@ -552,10 +671,10 @@ function middleInside(a, b) { const px = (a.x + b.x) / 2; const py = (a.y + b.y) / 2; do { - if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y && - (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) + const n = p.next; + if (((p.y > py) !== (n.y > py)) && (px < (n.x - p.x) * (py - p.y) / (n.y - p.y) + p.x)) inside = !inside; - p = p.next; + p = n; } while (p !== a); return inside; @@ -607,6 +726,9 @@ function removeNode(p) { if (p.prevZ) p.prevZ.nextZ = p.nextZ; if (p.nextZ) p.nextZ.prevZ = p.prevZ; + + // keep the hole-bridge index's block bboxes covering the healed prev->next edge + if (indexActive) growBlock(p.prev, p.next); } function createNode(i, x, y) { @@ -615,10 +737,9 @@ function createNode(i, x, y) { x, y, // vertex coordinates prev: null, // previous and next vertex nodes in a polygon ring next: null, - z: 0, // z-order curve value + z: 0, // z-order curve value; doubles as owning block in the hole-bridge index during eliminateHoles prevZ: null, // previous and next nodes in z-order - nextZ: null, - steiner: false // indicates whether this is a steiner point + nextZ: null }; } diff --git a/test/expected.json b/test/expected.json index aa80d67..0883913 100644 --- a/test/expected.json +++ b/test/expected.json @@ -3,12 +3,17 @@ "building": 13, "dude": 106, "water": 2482, - "water2": 1212, + "water2": 1211, "water3": 197, "water3b": 25, "water4": 705, - "water-huge": 5176, - "water-huge2": 4462, + "water-huge": 5174, + "water-huge2": 4484, + "water-huge3": 15470, + "self-tangent-1": 23, + "self-tangent-2": 25, + "self-tangent-3": 174, + "self-tangent-4": 3082, "degenerate": 0, "bad-hole": 42, "empty-square": 0, @@ -16,7 +21,7 @@ "issue17": 11, "steiner": 9, "issue29": 40, - "issue34": 139, + "issue34": 138, "issue35": 844, "self-touching": 124, "outside-ring": 64, @@ -31,8 +36,8 @@ "hilbert": 1024, "issue45": 10, "eberly-3": 73, - "eberly-6": 1429, - "issue52": 109, + "eberly-6": 1428, + "issue52": 108, "shared-points": 4, "bad-diagonals": 7, "issue83": 0, @@ -55,21 +60,21 @@ }, "errors": { "dude": 2e-15, - "water": 0.0008, - "water-huge": 0.0011, - "water-huge2": 0.004, + "water": 0.0009, + "water-huge": 0.0018, + "water-huge2": 0.003, "bad-hole": 0.019, "issue16": 4e-16, "issue17": 2e-16, - "issue29": 2e-15, - "self-touching": 2e-13, - "eberly-6": 2e-14, + "issue29": 1e-15, + "self-touching": 1e-13, + "eberly-6": 2.2e-14, "issue142": 0.13 }, "errors-with-rotation": { - "water-huge": 0.0035, - "water-huge2": 0.061, - "bad-hole": 0.04, - "issue16": 8e-16 + "water-huge": 0.005, + "water-huge2": 0.03, + "bad-hole": 0.03, + "issue16": 1e-15 } } diff --git a/test/fixtures/self-tangent-1.json b/test/fixtures/self-tangent-1.json new file mode 100644 index 0000000..5f203cd --- /dev/null +++ b/test/fixtures/self-tangent-1.json @@ -0,0 +1 @@ +[[[3211,3316],[3217,3332],[3222,3324],[3239,3333],[3238,3343],[3245,3338],[3271,3366],[3264,3381],[3226,3371],[3221,3383],[3229,3360],[3211,3357],[3212,3373],[3191,3366],[3191,3336],[3210,3334]],[[3252,3361],[3260,3376],[3261,3364]],[[3210,3334],[3210,3343],[3235,3349],[3229,3337]]] \ No newline at end of file diff --git a/test/fixtures/self-tangent-2.json b/test/fixtures/self-tangent-2.json new file mode 100644 index 0000000..5778188 --- /dev/null +++ b/test/fixtures/self-tangent-2.json @@ -0,0 +1 @@ +[[[2975,2506],[3001,2537],[2982,2545],[3001,2542],[3002,2548],[3012,2548],[2979,2553],[2903,2532],[2924,2524],[2931,2528],[2939,2513],[2944,2518],[2938,2527],[2943,2526],[2966,2512]],[[2977,2510],[2966,2512],[2971,2516],[2967,2525],[2981,2526],[2974,2520],[2979,2518]],[[2973,2534],[2973,2540],[2981,2535]]] \ No newline at end of file diff --git a/test/fixtures/self-tangent-3.json b/test/fixtures/self-tangent-3.json new file mode 100644 index 0000000..0cdf5e4 --- /dev/null +++ b/test/fixtures/self-tangent-3.json @@ -0,0 +1 @@ +[[[731,1513],[739,1506],[731,1490],[723,1489],[733,1481],[720,1475],[723,1465],[714,1475],[701,1473],[708,1472],[708,1459],[718,1457],[723,1445],[801,1445],[805,1451],[805,1445],[853,1445],[868,1460],[868,1529],[853,1528],[851,1538],[836,1536],[826,1544],[837,1559],[847,1557],[853,1548],[862,1548],[860,1555],[868,1553],[868,1559],[860,1557],[860,1570],[845,1574],[841,1568],[832,1574],[822,1569],[822,1578],[807,1567],[792,1567],[799,1565],[797,1557],[784,1561],[784,1572],[746,1572],[748,1561],[731,1555],[731,1536],[723,1536],[725,1521],[713,1508],[723,1506],[723,1513]],[[841,1568],[851,1559],[841,1559]],[[837,1559],[830,1563],[837,1565]],[[799,1529],[786,1534],[789,1540],[782,1551],[792,1555],[797,1538],[815,1534],[813,1529],[801,1529],[805,1521],[799,1521]],[[769,1567],[777,1561],[769,1561]],[[762,1555],[758,1561],[752,1557],[752,1563],[764,1565]],[[847,1502],[851,1517],[834,1517],[828,1523],[853,1528],[853,1515],[862,1517],[860,1506]],[[801,1515],[811,1523],[815,1517],[809,1513],[820,1513],[824,1519],[828,1513],[822,1512],[822,1504],[807,1504]],[[813,1538],[807,1550],[826,1544],[828,1540]],[[760,1532],[752,1534],[761,1536]],[[769,1519],[769,1530],[792,1529],[792,1521],[773,1525]],[[731,1513],[729,1521],[739,1521],[737,1513]],[[742,1512],[740,1525],[746,1525]],[[739,1491],[739,1498],[746,1498],[746,1491]],[[815,1481],[818,1491],[822,1483]],[[834,1470],[834,1477],[843,1475]],[[750,1500],[742,1506],[753,1505]],[[837,1508],[837,1515],[845,1515]],[[752,1483],[744,1487],[754,1489]],[[754,1508],[754,1513],[761,1512]],[[853,1481],[860,1483],[855,1479],[859,1475],[853,1475]],[[733,1460],[727,1464],[733,1468]],[[739,1491],[739,1483],[733,1491]]] \ No newline at end of file diff --git a/test/fixtures/self-tangent-4.json b/test/fixtures/self-tangent-4.json new file mode 100644 index 0000000..e74888f --- /dev/null +++ b/test/fixtures/self-tangent-4.json @@ -0,0 +1 @@ +[[[248,3883],[243,3890],[216,3888],[206,3854],[182,3856],[170,3832],[171,3854],[161,3856],[168,3872],[183,3873],[210,3916],[198,3915],[206,3919],[199,3931],[190,3928],[201,3935],[195,3941],[205,3940],[192,3946],[201,3953],[196,3973],[171,3993],[175,3999],[152,3992],[158,3966],[173,3960],[182,3975],[190,3955],[185,3948],[165,3959],[156,3952],[139,3987],[125,3983],[96,3997],[63,4027],[59,4018],[44,4046],[56,4059],[67,4045],[69,4060],[33,4094],[97,4098],[90,4116],[97,4120],[96,4105],[111,4103],[128,4085],[110,4083],[102,4096],[98,4089],[108,4077],[102,4055],[110,4046],[100,4038],[113,4025],[114,4009],[130,3998],[188,4002],[208,3958],[219,3960],[225,3982],[215,3977],[204,3985],[225,3987],[216,3996],[224,4010],[218,4022],[233,4037],[219,4037],[225,4062],[218,4074],[241,4070],[239,4042],[258,4065],[273,4067],[256,4098],[289,4124],[285,4132],[304,4132],[294,4137],[301,4159],[312,4160],[245,4160],[222,4160],[220,4153],[229,4152],[220,4142],[215,4160],[185,4160],[186,4149],[163,4158],[155,4148],[154,4157],[147,4148],[133,4160],[-31,4160],[-25,4139],[-35,4134],[-33,4125],[-22,4122],[-12,4137],[-15,4118],[6,4114],[22,4098],[-19,4092],[-10,4090],[-31,4079],[-30,4102],[-44,4085],[-47,4100],[-52,4090],[-64,4090],[-64,4053],[-62,4059],[-48,4049],[-44,4058],[-34,4044],[-38,4016],[-30,4013],[-48,4015],[-51,4026],[-59,4022],[-64,4050],[-64,4003],[-55,4008],[-56,3995],[-64,4002],[-55,3986],[-64,3989],[-64,3962],[-42,3947],[-64,3951],[-64,3892],[-32,3881],[-47,3881],[-43,3868],[-64,3890],[-64,3741],[-54,3738],[-53,3708],[-34,3688],[-6,3690],[-11,3682],[13,3671],[24,3652],[48,3650],[29,3643],[31,3632],[52,3619],[43,3618],[44,3600],[78,3586],[71,3593],[82,3593],[79,3585],[86,3582],[68,3574],[56,3547],[42,3558],[46,3590],[30,3597],[23,3582],[29,3516],[23,3517],[22,3492],[37,3449],[61,3449],[77,3434],[70,3443],[86,3452],[73,3463],[84,3473],[120,3468],[131,3482],[130,3466],[139,3483],[153,3487],[168,3510],[158,3522],[142,3521],[150,3568],[169,3543],[192,3549],[199,3539],[196,3550],[208,3559],[193,3578],[193,3598],[176,3601],[181,3596],[173,3589],[157,3589],[167,3610],[147,3617],[167,3630],[174,3653],[187,3662],[219,3659],[213,3678],[203,3681],[203,3708],[218,3724],[211,3734],[223,3731],[228,3739],[220,3770],[238,3791],[250,3782],[249,3758],[266,3753],[258,3744],[260,3723],[275,3722],[237,3691],[254,3682],[248,3679],[267,3679],[284,3696],[295,3690],[291,3669],[253,3657],[266,3643],[293,3639],[281,3637],[281,3627],[292,3625],[294,3602],[268,3591],[300,3581],[278,3564],[263,3577],[242,3552],[255,3547],[259,3525],[267,3531],[265,3518],[275,3529],[284,3520],[288,3512],[276,3504],[281,3494],[270,3502],[256,3493],[238,3499],[229,3486],[221,3498],[218,3490],[203,3490],[212,3466],[244,3457],[243,3448],[226,3443],[208,3450],[180,3424],[198,3431],[218,3407],[216,3390],[208,3409],[198,3392],[139,3383],[131,3355],[118,3353],[110,3372],[98,3366],[112,3358],[105,3349],[117,3321],[140,3313],[159,3335],[147,3318],[172,3322],[163,3360],[154,3355],[152,3359],[182,3369],[212,3362],[228,3378],[237,3369],[238,3417],[279,3335],[302,3329],[309,3351],[340,3361],[352,3353],[342,3326],[324,3336],[315,3328],[321,3326],[290,3320],[255,3333],[237,3328],[236,3310],[259,3300],[287,3307],[316,3289],[345,3295],[346,3285],[336,3281],[342,3252],[315,3251],[314,3226],[305,3219],[321,3197],[314,3181],[275,3158],[278,3138],[292,3152],[289,3162],[302,3161],[298,3154],[311,3146],[323,3165],[334,3155],[345,3168],[352,3153],[411,3160],[397,3140],[408,3135],[404,3127],[396,3140],[385,3132],[407,3114],[384,3123],[374,3109],[401,3105],[416,3117],[442,3100],[471,3104],[463,3075],[483,3070],[480,3079],[491,3064],[521,3062],[526,3051],[544,3054],[539,3074],[555,3062],[580,3079],[576,3086],[583,3081],[596,3091],[600,3078],[613,3081],[619,3072],[598,3077],[581,3054],[582,3039],[580,3047],[566,3047],[552,3030],[557,3010],[570,3021],[595,3018],[604,3026],[596,3034],[612,3048],[604,3030],[612,3037],[619,3023],[611,3032],[596,3015],[574,3010],[574,2980],[531,3005],[587,2943],[633,2934],[664,2895],[673,2898],[661,2912],[675,2928],[656,2940],[677,2952],[664,2975],[675,2984],[675,2965],[699,2975],[702,2956],[718,2978],[740,2969],[744,2987],[784,2989],[784,2981],[794,2992],[793,3008],[804,3006],[807,3017],[818,2999],[858,2997],[884,3010],[904,2999],[925,3001],[934,2988],[951,3010],[947,3068],[911,3052],[927,3077],[940,3081],[937,3106],[880,3098],[869,3059],[856,3065],[865,3082],[851,3090],[866,3090],[867,3106],[884,3107],[906,3128],[910,3154],[843,3150],[853,3133],[843,3125],[820,3140],[812,3130],[788,3144],[776,3139],[764,3162],[751,3164],[752,3186],[734,3201],[758,3191],[771,3155],[790,3151],[817,3160],[827,3173],[819,3178],[845,3184],[851,3194],[824,3198],[834,3223],[815,3219],[802,3228],[799,3221],[782,3230],[798,3199],[786,3194],[799,3181],[785,3175],[777,3201],[730,3255],[734,3237],[716,3227],[710,3198],[732,3155],[754,3142],[727,3128],[708,3136],[708,3145],[688,3141],[680,3152],[667,3142],[674,3151],[663,3157],[667,3170],[679,3160],[702,3226],[687,3231],[683,3268],[652,3277],[607,3274],[621,3286],[684,3273],[674,3278],[675,3294],[662,3310],[640,3309],[641,3339],[613,3338],[614,3347],[589,3360],[588,3375],[572,3387],[586,3401],[577,3410],[617,3426],[626,3419],[621,3413],[655,3417],[649,3435],[681,3448],[668,3456],[690,3452],[708,3473],[720,3463],[724,3438],[712,3436],[713,3410],[721,3409],[712,3399],[696,3418],[669,3415],[665,3423],[655,3409],[664,3396],[654,3393],[647,3403],[628,3395],[603,3399],[596,3391],[621,3379],[593,3370],[606,3359],[621,3365],[615,3347],[640,3346],[700,3293],[705,3304],[721,3292],[722,3324],[740,3331],[733,3355],[715,3364],[714,3352],[712,3364],[705,3359],[711,3352],[687,3340],[677,3349],[668,3350],[669,3340],[654,3346],[687,3370],[705,3367],[699,3375],[708,3378],[713,3370],[736,3373],[734,3388],[757,3390],[763,3404],[752,3407],[754,3416],[737,3414],[728,3423],[737,3425],[737,3459],[748,3468],[741,3473],[756,3486],[755,3463],[775,3440],[792,3438],[796,3418],[768,3410],[762,3394],[775,3391],[755,3368],[772,3371],[772,3343],[781,3349],[791,3337],[803,3341],[823,3323],[831,3330],[834,3321],[792,3298],[797,3280],[815,3270],[814,3254],[821,3251],[830,3267],[834,3250],[868,3250],[864,3257],[869,3253],[873,3264],[859,3304],[882,3318],[899,3320],[900,3309],[919,3317],[905,3316],[901,3332],[892,3326],[884,3336],[848,3325],[855,3320],[849,3315],[837,3320],[870,3348],[855,3360],[863,3364],[848,3366],[851,3374],[868,3381],[864,3365],[878,3366],[882,3357],[903,3365],[915,3352],[930,3365],[924,3380],[935,3380],[936,3394],[951,3404],[921,3411],[915,3388],[909,3396],[890,3383],[895,3399],[887,3412],[861,3393],[866,3408],[874,3405],[869,3418],[887,3422],[901,3410],[915,3438],[940,3421],[928,3413],[954,3418],[944,3427],[933,3487],[910,3491],[917,3499],[892,3479],[877,3494],[874,3512],[904,3500],[904,3520],[923,3521],[913,3558],[894,3556],[884,3573],[868,3564],[863,3576],[882,3602],[883,3574],[902,3581],[908,3597],[915,3581],[938,3594],[949,3583],[935,3583],[921,3562],[932,3553],[952,3490],[998,3472],[1012,3478],[1011,3492],[1015,3483],[1033,3487],[1031,3475],[1017,3482],[1031,3446],[1043,3447],[1053,3474],[1085,3477],[1093,3492],[1088,3507],[1079,3508],[1097,3550],[1105,3550],[1099,3528],[1112,3501],[1115,3517],[1138,3531],[1144,3512],[1132,3494],[1159,3490],[1151,3482],[1137,3491],[1126,3487],[1134,3441],[1120,3428],[1124,3413],[1135,3411],[1116,3407],[1115,3425],[1106,3419],[1099,3427],[1104,3439],[1079,3447],[1069,3468],[1058,3436],[1065,3428],[1055,3416],[1060,3405],[1030,3380],[1042,3369],[1048,3374],[1050,3357],[1069,3354],[1077,3322],[1098,3306],[1111,3323],[1091,3347],[1107,3359],[1099,3366],[1100,3395],[1111,3403],[1117,3384],[1136,3374],[1148,3389],[1136,3411],[1159,3420],[1164,3449],[1184,3450],[1197,3443],[1161,3419],[1175,3389],[1177,3398],[1192,3378],[1211,3397],[1190,3400],[1201,3402],[1210,3419],[1220,3409],[1245,3441],[1245,3458],[1224,3466],[1238,3485],[1221,3480],[1226,3495],[1235,3488],[1238,3502],[1250,3504],[1250,3517],[1240,3526],[1230,3510],[1217,3508],[1203,3527],[1196,3521],[1180,3561],[1187,3573],[1212,3560],[1239,3580],[1250,3564],[1250,3541],[1276,3546],[1262,3515],[1273,3390],[1285,3399],[1280,3412],[1289,3450],[1310,3436],[1296,3406],[1350,3382],[1349,3370],[1322,3379],[1297,3368],[1347,3329],[1365,3360],[1359,3370],[1377,3377],[1358,3409],[1412,3403],[1445,3425],[1432,3454],[1413,3460],[1413,3487],[1435,3506],[1433,3533],[1413,3563],[1361,3568],[1345,3561],[1339,3549],[1380,3546],[1370,3542],[1398,3502],[1386,3498],[1354,3503],[1356,3518],[1336,3543],[1321,3536],[1318,3519],[1291,3555],[1383,3585],[1415,3583],[1409,3602],[1423,3602],[1406,3630],[1416,3632],[1423,3650],[1408,3645],[1401,3653],[1419,3660],[1418,3668],[1444,3662],[1455,3672],[1434,3695],[1442,3700],[1471,3670],[1475,3679],[1528,3675],[1527,3687],[1544,3699],[1540,3708],[1530,3704],[1536,3731],[1529,3721],[1524,3733],[1521,3724],[1515,3732],[1517,3752],[1494,3752],[1509,3754],[1515,3769],[1490,3794],[1479,3793],[1485,3798],[1455,3826],[1424,3807],[1412,3775],[1412,3792],[1401,3803],[1406,3823],[1433,3848],[1446,3838],[1475,3856],[1477,3874],[1486,3863],[1489,3872],[1520,3875],[1523,3895],[1491,3887],[1486,3894],[1497,3896],[1500,3922],[1523,3909],[1520,3941],[1529,3949],[1545,3931],[1553,3940],[1557,3982],[1578,3979],[1574,3995],[1594,3996],[1582,3975],[1591,3955],[1572,3950],[1579,3958],[1565,3971],[1571,3961],[1557,3946],[1572,3942],[1563,3930],[1571,3898],[1582,3912],[1599,3910],[1559,3887],[1567,3866],[1576,3867],[1567,3838],[1582,3823],[1570,3805],[1570,3781],[1589,3776],[1584,3761],[1587,3753],[1593,3740],[1616,3741],[1628,3730],[1674,3736],[1676,3748],[1679,3739],[1700,3754],[1699,3764],[1713,3763],[1710,3798],[1720,3796],[1722,3804],[1727,3797],[1753,3813],[1759,3803],[1783,3804],[1779,3796],[1747,3802],[1716,3766],[1770,3784],[1779,3781],[1762,3771],[1773,3751],[1830,3742],[1819,3746],[1819,3756],[1809,3750],[1801,3760],[1811,3762],[1799,3771],[1812,3776],[1805,3786],[1828,3783],[1822,3796],[1831,3795],[1855,3821],[1867,3813],[1867,3834],[1853,3842],[1859,3825],[1846,3836],[1849,3844],[1837,3846],[1843,3853],[1835,3849],[1830,3857],[1838,3856],[1824,3863],[1833,3890],[1813,3901],[1819,3912],[1806,3908],[1781,3924],[1783,3912],[1775,3917],[1783,3946],[1754,3944],[1772,3949],[1766,3968],[1750,3977],[1750,3970],[1739,3972],[1742,3980],[1716,3979],[1724,3987],[1745,3985],[1734,4010],[1754,4003],[1746,4012],[1754,4009],[1768,4032],[1760,4050],[1732,4076],[1728,4071],[1720,4087],[1707,4072],[1716,4072],[1706,4068],[1711,4053],[1706,4064],[1692,4061],[1693,4074],[1701,4072],[1649,4133],[1641,4132],[1650,4119],[1638,4077],[1624,4066],[1611,4095],[1634,4110],[1637,4142],[1625,4146],[1615,4114],[1605,4111],[1615,4131],[1606,4134],[1609,4155],[1626,4151],[1627,4160],[1530,4160],[1520,4154],[1541,4150],[1523,4125],[1539,4095],[1526,4059],[1543,4043],[1525,4029],[1543,4004],[1523,4006],[1504,3962],[1465,3963],[1453,3955],[1452,3969],[1465,3965],[1497,3987],[1507,4019],[1491,4035],[1518,4036],[1522,4048],[1506,4088],[1527,4107],[1497,4149],[1471,4157],[1465,4148],[1481,4149],[1481,4126],[1471,4139],[1455,4141],[1461,4150],[1441,4148],[1447,4119],[1425,4118],[1419,4084],[1410,4092],[1376,4088],[1376,4063],[1386,4062],[1373,4051],[1359,4055],[1372,4061],[1369,4090],[1417,4102],[1421,4160],[1311,4160],[1311,4131],[1306,4160],[1273,4160],[1138,4160],[1145,4140],[1169,4150],[1137,4123],[1124,4160],[1113,4160],[1120,4145],[1094,4136],[1084,4146],[1099,4160],[1075,4160],[1077,4143],[1074,4150],[1046,4151],[1052,4160],[904,4160],[925,4136],[923,4126],[897,4153],[880,4143],[883,4157],[895,4160],[856,4160],[856,4153],[855,4160],[594,4160],[577,4148],[572,4160],[496,4160],[490,4152],[503,4146],[497,4124],[474,4134],[475,4160],[412,4160],[389,4144],[417,4122],[403,4121],[409,4084],[393,4077],[402,4078],[396,4065],[414,4050],[401,4043],[402,4033],[384,4082],[350,4112],[352,4124],[334,4093],[343,4081],[333,4081],[333,4065],[322,4059],[331,4036],[304,4038],[302,4019],[294,4024],[299,4037],[290,4028],[269,4036],[258,4024],[248,4045],[233,4033],[227,3993],[247,4003],[258,3995],[231,3969],[237,3959],[227,3942],[247,3935],[258,3915],[284,3910],[302,3890],[318,3892],[317,3920],[327,3928],[331,3887],[315,3871],[356,3859],[351,3850],[361,3836],[351,3833],[370,3833],[381,3816],[391,3819],[378,3811],[383,3802],[421,3793],[384,3788],[365,3800],[354,3788],[343,3802],[335,3786],[308,3818],[341,3814],[341,3815],[346,3839],[326,3838],[294,3882],[283,3884],[283,3875],[253,3863],[251,3844],[261,3839],[253,3817],[256,3808],[241,3829],[255,3828],[250,3839],[239,3840],[253,3865],[242,3868],[251,3875],[240,3874],[244,3871],[234,3875],[234,3887]],[[169,4110],[177,4149],[181,4115]],[[264,4142],[245,4160],[263,4152]],[[215,3836],[211,3849],[219,3847]],[[179,4007],[166,4011],[171,4018],[158,4029],[161,4039],[148,4045],[158,4055],[136,4087],[138,4111],[124,4122],[123,4135],[134,4119],[145,4126],[159,4121],[160,4104],[174,4095],[161,4059],[171,4056],[162,4047],[163,4029],[184,4011]],[[243,4117],[233,4118],[234,4127]],[[341,3815],[331,3819],[337,3824]],[[614,4129],[612,4150],[595,4159],[621,4152]],[[213,4108],[214,4119],[219,4113]],[[183,4100],[183,4118],[191,4101]],[[247,4086],[246,4097],[255,4098]],[[718,4132],[707,4138],[717,4146]],[[207,4058],[201,4068],[212,4071]],[[857,4135],[859,4142],[869,4136]],[[757,4122],[734,4125],[753,4130]],[[216,4047],[194,4049],[212,4059]],[[1025,4126],[1010,4130],[1014,4146],[1028,4143]],[[926,4092],[931,4115],[923,4126],[944,4124],[958,4143],[979,4131],[970,4105],[955,4094]],[[1268,4151],[1273,4160],[1277,4154]],[[22,3934],[17,3938],[29,3952],[39,3953]],[[130,3915],[118,3931],[130,3941],[120,3942],[156,3952],[147,3932]],[[-1,3939],[-39,3946],[-16,3949]],[[994,4115],[997,4126],[1002,4119]],[[26,3884],[9,3894],[30,3908]],[[144,3887],[140,3903],[152,3902],[151,3889]],[[87,3864],[84,3890],[92,3882]],[[8,3866],[-8,3875],[10,3873]],[[89,3850],[88,3859],[100,3860],[99,3851]],[[92,3833],[84,3836],[101,3837],[102,3850],[105,3834]],[[-18,3830],[-27,3831],[-25,3842]],[[601,4117],[597,4125],[610,4123]],[[-46,3755],[-52,3762],[-34,3804],[-61,3829],[-10,3796],[-27,3796],[-17,3767]],[[120,3805],[130,3820],[142,3811],[148,3816],[149,3807]],[[658,4067],[652,4069],[668,4083],[669,4104],[685,4102],[689,4124],[691,4082],[670,4083]],[[183,3797],[185,3810],[195,3803]],[[262,3795],[242,3796],[256,3808]],[[104,3790],[94,3793],[109,3800]],[[1079,3400],[1069,3407],[1090,3408]],[[173,3775],[165,3788],[174,3785]],[[1375,4132],[1375,4147],[1389,4155]],[[1175,4107],[1186,4124],[1186,4110]],[[1330,4017],[1302,4023],[1310,4027],[1302,4072],[1293,4080],[1302,4085],[1296,4118],[1308,4123],[1307,4115],[1303,4112],[1312,4035],[1319,4033],[1327,4049],[1328,4042],[1343,4044],[1324,4039],[1322,4023]],[[850,4097],[844,4114],[855,4115]],[[365,4036],[355,4046],[333,4038],[341,4052],[352,4052]],[[1290,4081],[1278,4082],[1284,4093]],[[749,4075],[742,4080],[749,4090]],[[874,3953],[861,3985],[843,3975],[843,3954],[819,3953],[810,3963],[831,3988],[861,3986],[855,3997],[864,4033],[829,4051],[849,4070],[841,4085],[852,4089],[864,4085],[857,4080],[874,4049],[869,4022],[902,4015],[899,3982],[882,3981]],[[923,4069],[914,4082],[922,4087]],[[1231,4018],[1208,4025],[1199,4085],[1213,4068],[1212,4053],[1228,4045]],[[1055,4001],[1045,4023],[1027,4023],[1012,4040],[993,4043],[998,4051],[989,4047],[990,4056],[982,4056],[982,4048],[973,4059],[1002,4083],[1033,4038],[1052,4033],[1053,4017],[1071,4009]],[[1648,4066],[1641,4076],[1654,4072]],[[481,3986],[472,3987],[465,4016],[475,4025],[461,4030],[461,4064],[483,4070],[483,4060],[507,4058],[500,4032],[475,4016],[484,3998]],[[1074,4049],[1080,4069],[1116,4061]],[[904,4043],[924,4063],[938,4058]],[[434,4046],[418,4052],[423,4060]],[[808,4045],[807,4056],[815,4050]],[[1553,4134],[1544,4139],[1561,4142]],[[657,3985],[646,3987],[630,3999],[646,4017],[625,4027],[640,4040],[639,4028],[657,4028],[694,4044],[701,4029],[682,4014],[685,3999],[664,4008]],[[1576,4126],[1574,4137],[1581,4130]],[[1590,4095],[1575,4106],[1583,4128],[1605,4111],[1608,4097]],[[591,4029],[592,4038],[599,4036]],[[722,3985],[736,4002],[726,4009],[746,4002],[745,4017],[756,4018],[752,4030],[767,4032],[774,4021],[758,3994],[748,4002]],[[1414,3995],[1410,4005],[1421,4025]],[[1231,3989],[1231,4018],[1253,4013],[1251,4023],[1261,4024],[1254,4018],[1259,4001]],[[1440,4014],[1438,4022],[1447,4017]],[[1378,4005],[1352,4010],[1349,4021],[1374,4017]],[[1608,4019],[1599,4046],[1586,4043],[1591,4080],[1609,4042],[1624,4056],[1624,4046],[1609,4038]],[[1391,4012],[1410,4005],[1379,4005]],[[290,3996],[285,4005],[298,4010]],[[1630,4042],[1627,4056],[1642,4055]],[[572,3957],[552,3979],[561,3987],[563,3999],[571,3998],[558,4008],[573,4001],[578,4008],[592,3997],[581,3986],[593,3975]],[[1558,4039],[1555,4047],[1564,4053],[1573,4046]],[[276,3947],[255,3969],[294,3974],[292,3992],[307,3984],[300,3992],[314,3990],[323,4004],[340,4005],[338,3995],[347,3999],[360,3987],[354,3978],[328,3997],[305,3977],[315,3967],[311,3955],[297,3953],[295,3961],[283,3954]],[[1655,4022],[1662,4036],[1667,4029]],[[1574,3995],[1561,4004],[1559,4019],[1547,4020],[1548,4029],[1556,4032]],[[1748,4013],[1748,4020],[1755,4017]],[[1666,3960],[1648,3984],[1637,3981],[1641,3988],[1622,3990],[1611,4006],[1595,3998],[1591,4010],[1618,4012],[1626,4001],[1646,4013],[1660,4010],[1643,4002],[1661,3994],[1649,3988],[1677,3965]],[[903,3631],[914,3645],[916,3636]],[[1032,3968],[1037,3973],[1027,3983],[1045,3992],[1054,3971]],[[1679,3968],[1679,3981],[1687,3979]],[[1228,3973],[1221,3984],[1227,3987]],[[981,3973],[969,3979],[979,3981]],[[494,3964],[489,3978],[500,3970]],[[1208,3957],[1203,3976],[1220,3965]],[[1650,3790],[1613,3799],[1625,3812],[1638,3811],[1636,3855],[1649,3862],[1651,3877],[1659,3873],[1686,3896],[1678,3900],[1673,3940],[1644,3934],[1655,3939],[1659,3955],[1663,3939],[1699,3961],[1705,3950],[1698,3936],[1735,3926],[1738,3934],[1746,3931],[1757,3913],[1736,3917],[1746,3909],[1738,3895],[1738,3911],[1728,3901],[1719,3912],[1690,3898],[1724,3879],[1718,3868],[1715,3880],[1698,3888],[1681,3876],[1677,3887],[1660,3866],[1683,3867],[1682,3851],[1669,3849],[1665,3860],[1658,3852],[1669,3819],[1672,3830],[1685,3824],[1705,3834],[1692,3816],[1675,3817],[1688,3805],[1668,3816]],[[756,3779],[748,3792],[720,3795],[728,3817],[719,3825],[735,3829],[726,3849],[736,3908],[716,3925],[690,3918],[693,3935],[714,3941],[705,3951],[717,3966],[710,3955],[746,3918],[748,3892],[758,3893],[744,3888],[742,3861],[778,3865],[751,3846],[754,3825],[746,3825],[743,3806],[766,3801],[768,3790],[749,3792]],[[1118,3946],[1110,3949],[1122,3965]],[[1185,3955],[1172,3959],[1178,3964]],[[372,3957],[367,3962],[376,3963]],[[802,3944],[797,3950],[805,3950]],[[813,3927],[808,3932],[806,3950]],[[1249,3913],[1252,3947],[1271,3942],[1270,3924]],[[1042,3940],[1036,3945],[1045,3947]],[[1433,3848],[1365,3891],[1402,3906],[1415,3922],[1422,3920],[1420,3896],[1430,3896],[1432,3913],[1443,3920],[1407,3926],[1418,3945],[1451,3918],[1431,3887],[1445,3871],[1428,3862]],[[426,3901],[414,3905],[420,3917],[412,3928],[425,3924],[424,3940],[442,3931],[427,3922]],[[659,3915],[639,3923],[641,3934]],[[1161,3922],[1190,3930],[1202,3918],[1199,3908],[1209,3915],[1212,3907],[1199,3900],[1191,3919]],[[687,3862],[695,3874],[682,3883],[668,3878],[685,3888],[668,3908],[680,3913],[678,3927],[695,3890],[714,3882],[686,3886],[706,3869],[701,3864]],[[1651,3883],[1605,3909],[1634,3925],[1642,3910],[1655,3905],[1658,3912]],[[983,3903],[988,3923],[997,3916],[998,3924],[1009,3924],[1011,3917]],[[837,3906],[827,3918],[840,3924],[843,3916],[836,3918]],[[620,3904],[616,3920],[625,3918]],[[1012,3916],[1028,3898],[1019,3898]],[[1293,3901],[1286,3903],[1295,3912]],[[866,3854],[845,3870],[852,3885],[844,3892],[845,3911],[850,3897],[872,3889]],[[798,3901],[793,3909],[800,3911],[809,3908]],[[1212,3869],[1208,3880],[1202,3877],[1215,3907],[1238,3905],[1217,3904],[1232,3882],[1227,3875],[1221,3882]],[[605,3892],[600,3897],[611,3907]],[[1066,3894],[1060,3905],[1070,3901]],[[945,3873],[953,3904],[959,3902],[961,3880]],[[586,3895],[590,3904],[599,3900]],[[663,3888],[651,3895],[658,3900]],[[1122,3879],[1115,3889],[1120,3899],[1147,3898],[1143,3889],[1124,3896]],[[913,3884],[904,3895],[895,3888],[885,3891],[907,3897]],[[592,3882],[591,3883],[583,3892],[594,3895]],[[1124,3832],[1104,3833],[1096,3846],[1078,3833],[1071,3837],[1082,3845],[1066,3846],[1066,3858],[1054,3845],[1045,3866],[1029,3860],[1032,3886],[1051,3894],[1052,3884],[1060,3892],[1078,3875],[1089,3892],[1098,3891],[1098,3880],[1088,3881],[1102,3853],[1097,3847],[1144,3861],[1157,3839],[1140,3835],[1137,3846]],[[539,3804],[531,3805],[525,3813],[525,3808],[503,3839],[549,3847],[520,3851],[520,3867],[479,3872],[503,3892],[530,3893],[533,3879],[551,3880],[563,3862],[554,3860],[558,3849],[574,3834],[551,3849],[552,3839],[536,3831],[543,3825],[526,3826],[525,3815],[537,3812]],[[1463,3879],[1466,3890],[1468,3883]],[[583,3865],[585,3888],[591,3883],[585,3868]],[[1724,3879],[1740,3888],[1742,3881]],[[906,3821],[896,3883],[906,3870],[905,3836]],[[941,3871],[936,3875],[944,3872]],[[422,3848],[420,3857],[410,3855],[427,3872]],[[939,3850],[927,3872],[941,3865]],[[406,3860],[409,3870],[412,3863]],[[610,3854],[584,3862],[585,3868]],[[448,3860],[433,3862],[444,3868]],[[640,3832],[614,3860],[624,3867],[639,3855]],[[462,3853],[454,3857],[465,3867]],[[1016,3821],[1001,3825],[1010,3830],[1002,3844],[966,3849],[950,3837],[939,3850],[950,3840],[958,3853],[989,3847],[995,3864],[1019,3861],[1000,3862],[1014,3849]],[[1746,3852],[1744,3861],[1752,3861]],[[518,3850],[510,3856],[515,3861]],[[585,3831],[600,3856],[609,3845]],[[1740,3840],[1733,3846],[1746,3852]],[[1807,3829],[1809,3848],[1827,3833]],[[1195,3836],[1190,3846],[1204,3846]],[[1168,3833],[1157,3839],[1170,3839]],[[594,3820],[580,3824],[585,3831]],[[1791,3803],[1783,3804],[1807,3829]],[[1258,3809],[1246,3823],[1282,3823]],[[1029,3807],[1030,3819],[1038,3810]],[[1344,3814],[1338,3819],[1350,3815]],[[839,3805],[841,3814],[853,3813]],[[1394,3546],[1387,3547],[1395,3552]],[[1101,3778],[1084,3793],[1094,3809]],[[641,3799],[649,3809],[658,3802]],[[674,3804],[661,3805],[679,3808]],[[815,3557],[780,3566],[770,3588],[750,3599],[737,3580],[734,3594],[706,3573],[706,3610],[671,3628],[670,3619],[669,3626],[636,3621],[634,3634],[642,3638],[648,3626],[658,3638],[665,3629],[671,3646],[681,3643],[675,3639],[682,3629],[687,3641],[679,3649],[687,3658],[694,3640],[747,3661],[771,3675],[763,3691],[794,3707],[802,3685],[836,3693],[834,3710],[842,3712],[852,3699],[844,3692],[847,3679],[881,3694],[882,3685],[910,3682],[911,3698],[927,3702],[926,3752],[904,3777],[896,3760],[882,3756],[887,3764],[872,3781],[883,3806],[897,3800],[923,3807],[921,3798],[940,3789],[948,3799],[959,3797],[935,3778],[940,3773],[924,3776],[925,3770],[933,3769],[927,3768],[936,3743],[957,3726],[945,3714],[971,3703],[971,3685],[990,3679],[982,3672],[993,3663],[969,3660],[963,3641],[957,3653],[942,3652],[957,3661],[937,3683],[894,3680],[868,3663],[866,3648],[854,3668],[851,3651],[832,3673],[800,3671],[751,3636],[745,3626],[757,3637],[762,3619],[737,3624],[749,3612],[773,3612],[781,3628],[790,3627],[787,3617],[831,3636],[837,3622],[864,3620],[833,3599],[815,3599],[801,3618],[783,3573],[795,3578]],[[968,3793],[963,3800],[968,3807],[980,3799]],[[1808,3793],[1809,3804],[1816,3798]],[[790,3787],[768,3790],[785,3797]],[[1231,3782],[1216,3786],[1220,3794]],[[1647,3768],[1650,3790],[1665,3775]],[[1417,3510],[1411,3518],[1423,3529]],[[64,3779],[65,3786],[82,3783]],[[1073,3760],[1074,3780],[1063,3778],[1065,3784],[1080,3785],[1088,3768]],[[736,3002],[659,3021],[683,3029],[682,3052],[719,3045],[731,3058],[749,3055],[757,3067],[728,3089],[731,3103],[681,3102],[754,3108],[769,3119],[795,3088],[827,3083],[794,3048],[804,3012],[793,3020],[792,3035],[770,3039],[759,3055],[729,3036],[733,3023],[757,3018]],[[705,3764],[706,3780],[712,3770]],[[306,3720],[293,3745],[274,3751],[288,3764],[285,3750],[308,3752],[310,3743],[321,3751],[308,3765],[335,3774],[327,3767],[335,3752],[323,3755],[323,3741],[305,3738]],[[650,3697],[639,3716],[678,3723],[646,3755],[651,3759],[676,3758],[685,3769],[692,3757],[704,3762],[707,3733],[686,3736],[670,3700]],[[985,3748],[979,3752],[991,3766]],[[1241,3719],[1214,3737],[1210,3735],[1210,3765],[1228,3759],[1233,3746],[1252,3743],[1259,3728]],[[1157,3639],[1145,3649],[1144,3716],[1129,3679],[1083,3691],[1074,3682],[1071,3695],[1087,3710],[1066,3736],[1072,3732],[1078,3742],[1100,3728],[1102,3734],[1145,3724],[1146,3742],[1153,3743],[1155,3697],[1163,3691]],[[553,3185],[526,3187],[542,3190],[568,3237],[591,3230],[605,3236],[595,3242],[611,3252],[614,3225],[642,3234],[641,3215],[657,3205],[676,3217],[677,3197],[660,3186],[620,3198],[607,3218],[587,3201],[567,3212]],[[1010,3501],[975,3603],[950,3591],[937,3604],[934,3622],[961,3611],[968,3616],[965,3637],[986,3595],[1004,3581],[1002,3549],[1048,3525],[1011,3514]],[[431,3458],[414,3514],[412,3520],[406,3518],[400,3528],[412,3535],[419,3561],[419,3522],[415,3521],[421,3520],[419,3513],[436,3523],[444,3517],[439,3508],[451,3508],[456,3522],[478,3499],[454,3498],[477,3487],[478,3477],[451,3473],[444,3480]],[[13,3682],[0,3706],[-20,3718],[-35,3752],[-29,3754],[-16,3724],[14,3708],[23,3694]],[[1038,3632],[1037,3658],[1018,3653],[1013,3691],[1049,3702],[1044,3683],[1068,3678],[1051,3644]],[[845,3727],[834,3743],[851,3752],[857,3740]],[[851,3432],[798,3459],[788,3476],[805,3461],[820,3463],[830,3476],[841,3462],[864,3474],[865,3449]],[[100,3688],[95,3709],[51,3745],[82,3737],[112,3711],[115,3691]],[[374,3736],[359,3738],[351,3738],[366,3744]],[[479,3124],[462,3136],[450,3129],[437,3159],[468,3170],[478,3165],[467,3151],[485,3148],[485,3131]],[[98,3732],[99,3743],[106,3739]],[[328,3495],[313,3497],[320,3498],[315,3518],[323,3515],[312,3524],[336,3511],[339,3524],[354,3518],[379,3528],[381,3498],[371,3502],[368,3520],[362,3506]],[[1336,3448],[1309,3464],[1305,3483],[1337,3486],[1346,3458]],[[198,3724],[197,3737],[208,3736]],[[536,3261],[513,3290],[507,3284],[507,3304],[489,3312],[494,3317],[482,3327],[519,3312],[526,3291],[541,3284]],[[1193,3723],[1180,3732],[1210,3735]],[[797,3711],[800,3735],[820,3721]],[[361,3566],[347,3572],[352,3611],[343,3628],[377,3615],[360,3590],[367,3575]],[[1047,3547],[1047,3567],[1037,3566],[1031,3582],[1019,3584],[1043,3592],[1043,3606],[1060,3589],[1049,3576],[1063,3559],[1054,3560],[1055,3548]],[[1262,3726],[1261,3734],[1269,3733]],[[1507,3690],[1507,3697],[1498,3693],[1501,3713],[1474,3728],[1483,3732],[1512,3704]],[[621,3685],[585,3694],[582,3715],[595,3723],[597,3703]],[[1054,3711],[1058,3720],[1049,3722],[1063,3722]],[[1372,3699],[1363,3703],[1372,3722],[1379,3712]],[[49,3691],[38,3715],[51,3711]],[[1265,3689],[1288,3714],[1301,3691]],[[764,3494],[712,3495],[710,3502],[702,3496],[704,3514],[713,3501],[736,3499],[732,3506],[747,3509],[736,3526],[747,3527]],[[1050,3704],[1044,3712],[1054,3711]],[[84,3673],[52,3711],[62,3709]],[[613,3089],[597,3098],[618,3100],[663,3142],[657,3118],[644,3115],[643,3108],[659,3106],[655,3101],[618,3099]],[[486,3572],[481,3589],[472,3585],[478,3591],[499,3601],[512,3585],[503,3576],[494,3583]],[[1337,3663],[1312,3673],[1310,3692],[1329,3692]],[[370,3186],[344,3187],[350,3202],[378,3202]],[[360,3261],[352,3262],[341,3280],[371,3285]],[[1057,3601],[1050,3610],[1057,3627],[1067,3627],[1070,3604]],[[506,3610],[504,3621],[522,3636],[527,3619]],[[52,3664],[58,3674],[48,3681],[60,3686],[73,3672],[91,3672]],[[94,3634],[82,3651],[95,3656],[107,3636]],[[1371,3661],[1377,3679],[1383,3670]],[[22,3670],[15,3676],[26,3677]],[[1284,3663],[1277,3668],[1285,3670]],[[587,3112],[593,3144],[607,3128]],[[1003,3649],[993,3663],[1010,3652]],[[1208,3623],[1177,3639],[1176,3654],[1184,3644],[1198,3645],[1193,3635]],[[628,3594],[607,3603],[623,3612],[634,3601]],[[836,3543],[826,3554],[817,3556],[834,3562],[847,3547]],[[308,3649],[308,3656],[315,3653]],[[438,3327],[434,3365],[447,3359]],[[368,3635],[375,3642],[366,3641],[364,3650],[377,3650],[378,3640]],[[1115,3614],[1101,3623],[1090,3642],[1114,3631],[1108,3623]],[[1288,3490],[1284,3511],[1300,3509]],[[428,3395],[416,3411],[430,3416]],[[437,3292],[428,3278],[409,3278]],[[548,3101],[533,3102],[532,3119]],[[625,2952],[615,2963],[635,2966]],[[881,3535],[865,3548],[869,3554],[880,3540],[887,3546]],[[1190,3596],[1168,3619],[1188,3608]],[[1142,3566],[1132,3585],[1139,3593]],[[1161,3631],[1168,3619],[1158,3619]],[[543,3618],[530,3619],[534,3629],[545,3629],[536,3624]],[[544,3243],[541,3254],[561,3249]],[[1162,3598],[1151,3606],[1158,3619]],[[563,3428],[553,3442],[563,3445]],[[625,3613],[623,3626],[634,3621]],[[126,3561],[104,3577],[117,3575]],[[1248,3611],[1238,3612],[1250,3621]],[[892,3033],[876,3051],[894,3041]],[[1213,3497],[1196,3516],[1216,3503]],[[578,3606],[567,3607],[569,3615]],[[1174,3530],[1159,3532],[1170,3541]],[[433,3366],[422,3373],[427,3384]],[[1146,3591],[1140,3594],[1148,3603]],[[640,3160],[636,3174],[647,3173]],[[815,3413],[806,3417],[827,3424]],[[427,3259],[434,3268],[444,3260]],[[102,3587],[100,3595],[108,3596]],[[858,3542],[847,3547],[859,3554]],[[544,3506],[546,3499],[527,3499]],[[727,3391],[720,3400],[728,3408]],[[656,3562],[649,3573],[659,3575]],[[351,3413],[347,3419],[366,3421]],[[666,3216],[670,3230],[677,3224]],[[486,3356],[476,3359],[485,3368]],[[481,3459],[475,3474],[483,3473]],[[308,3566],[303,3575],[312,3574]],[[294,3524],[285,3530],[297,3534]],[[351,3384],[349,3395],[359,3393]],[[339,3560],[337,3566],[351,3566]],[[377,3292],[367,3295],[372,3304]],[[486,3451],[481,3459],[494,3458]],[[1056,3511],[1055,3521],[1065,3514]],[[216,3390],[226,3380],[217,3380]],[[427,3164],[418,3167],[421,3176]],[[495,3530],[494,3541],[503,3531]],[[788,3477],[778,3485],[787,3486]],[[1348,3429],[1341,3431],[1350,3440]],[[96,3477],[98,3483],[111,3483]],[[826,3393],[832,3402],[836,3395]],[[1069,3389],[1067,3395],[1080,3395]],[[859,3304],[854,3313],[864,3310]],[[293,3503],[296,3510],[304,3504]],[[758,3516],[756,3522],[769,3519]],[[1329,3417],[1327,3429],[1334,3423]],[[1161,3922],[1157,3914],[1152,3922]],[[577,3410],[560,3416],[563,3428],[563,3417]],[[375,3257],[368,3261],[380,3263]],[[441,3225],[434,3229],[439,3235]],[[364,3361],[356,3365],[363,3369]],[[632,3379],[626,3380],[626,3389]],[[565,3364],[560,3372],[557,3381]]] \ No newline at end of file diff --git a/test/fixtures/water-huge3.json b/test/fixtures/water-huge3.json new file mode 100644 index 0000000..da6d076 --- /dev/null +++ b/test/fixtures/water-huge3.json @@ -0,0 +1 @@ +[[[-29,90],[-25,43],[-35,38],[-33,29],[-22,26],[-12,41],[-15,22],[6,18],[22,2],[-19,-4],[-10,-6],[-32,-17],[-29,5],[-44,-11],[-49,3],[-52,-6],[-64,-6],[-64,-43],[-62,-37],[-48,-47],[-44,-38],[-34,-52],[-37,-64],[45,-64],[44,-50],[56,-37],[67,-51],[69,-36],[33,-2],[97,2],[90,20],[97,24],[96,9],[111,7],[128,-11],[110,-13],[100,0],[98,-15],[108,-19],[102,-41],[110,-50],[102,-64],[162,-64],[148,-51],[158,-41],[136,-9],[138,15],[124,26],[126,40],[134,23],[145,30],[159,25],[160,8],[174,-1],[161,-36],[171,-40],[163,-64],[230,-64],[231,-56],[219,-59],[225,-34],[218,-22],[241,-26],[239,-54],[258,-31],[273,-29],[256,2],[289,28],[285,36],[304,36],[294,41],[301,63],[311,63],[320,84],[334,86],[310,56],[313,48],[329,54],[319,61],[382,64],[376,81],[366,78],[370,91],[361,105],[351,93],[337,110],[350,109],[358,119],[361,106],[371,109],[390,96],[405,110],[388,86],[392,72],[425,94],[434,69],[391,56],[389,48],[417,26],[403,25],[409,-12],[393,-19],[402,-18],[396,-31],[414,-46],[396,-62],[384,-14],[361,2],[347,28],[334,-3],[343,-15],[333,-15],[333,-31],[322,-37],[333,-58],[315,-54],[303,-64],[462,-64],[461,-32],[483,-26],[483,-36],[507,-38],[497,-54],[501,-64],[551,-64],[544,-56],[554,-64],[635,-64],[640,-56],[639,-64],[671,-64],[694,-52],[699,-64],[864,-64],[829,-45],[849,-26],[841,-11],[853,-7],[864,-11],[857,-16],[874,-47],[865,-64],[1024,-64],[973,-37],[1000,-13],[1041,-64],[1207,-64],[1198,-41],[1204,-10],[1210,-40],[1228,-51],[1228,-64],[1305,-64],[1302,-24],[1293,-16],[1302,-11],[1296,22],[1308,27],[1312,21],[1303,16],[1307,-48],[1316,-63],[1327,-47],[1328,-54],[1343,-52],[1323,-64],[1515,-61],[1522,-47],[1506,-8],[1527,11],[1497,53],[1471,61],[1465,52],[1481,53],[1481,30],[1471,43],[1455,45],[1461,54],[1444,54],[1447,23],[1425,22],[1419,-12],[1410,-4],[1376,-8],[1376,-33],[1386,-34],[1373,-45],[1359,-41],[1372,-35],[1369,-6],[1417,6],[1418,59],[1426,72],[1451,66],[1449,99],[1461,104],[1479,91],[1489,105],[1500,104],[1497,114],[1518,113],[1512,127],[1527,126],[1488,169],[1520,187],[1510,204],[1502,203],[1507,209],[1564,211],[1562,233],[1576,241],[1579,273],[1573,267],[1558,274],[1550,264],[1541,272],[1578,290],[1590,265],[1602,271],[1607,262],[1602,267],[1600,241],[1580,239],[1579,215],[1538,183],[1538,166],[1530,164],[1531,135],[1548,116],[1536,103],[1554,108],[1550,94],[1550,101],[1538,99],[1538,83],[1571,74],[1533,79],[1520,58],[1541,54],[1523,30],[1539,-1],[1526,-37],[1543,-53],[1527,-64],[1605,-64],[1599,-50],[1586,-53],[1591,-16],[1609,-54],[1624,-40],[1607,-64],[1768,-64],[1720,-9],[1707,-24],[1716,-24],[1706,-28],[1711,-43],[1706,-32],[1692,-35],[1693,-22],[1701,-24],[1677,0],[1677,13],[1705,16],[1699,10],[1724,-6],[1757,1],[1746,11],[1753,11],[1753,34],[1763,46],[1773,43],[1755,67],[1773,88],[1767,62],[1786,38],[1803,75],[1798,103],[1781,104],[1780,93],[1771,92],[1751,108],[1767,105],[1796,125],[1800,154],[1817,159],[1819,147],[1830,159],[1828,171],[1833,159],[1843,159],[1851,131],[1894,133],[1913,119],[1929,131],[1931,157],[1945,146],[1935,143],[1936,123],[1948,117],[1962,132],[1985,110],[2021,110],[2028,101],[1997,93],[1990,82],[1973,87],[1952,72],[1963,64],[1958,52],[1977,38],[1968,32],[1989,29],[2010,45],[2002,49],[2010,57],[2005,67],[2017,63],[2033,84],[2009,13],[2019,9],[2020,-19],[1995,15],[1984,-4],[1978,8],[1987,19],[1961,1],[1952,4],[1953,31],[1930,38],[1901,66],[1903,53],[1890,46],[1900,33],[1878,19],[1881,6],[1868,3],[1887,-25],[1896,-17],[1894,-35],[1904,-43],[1928,-34],[1935,-22],[1928,-64],[1947,-64],[1940,-49],[1949,-38],[1963,-42],[1951,-53],[1964,-56],[1959,-64],[2026,-64],[2023,-55],[2036,-64],[2066,-46],[2061,-37],[2047,-41],[2065,-23],[2070,-30],[2082,1],[2080,54],[2095,51],[2092,-1],[2074,-26],[2085,-36],[2083,-58],[2096,-59],[2101,-45],[2144,-28],[2148,-44],[2134,-42],[2119,-54],[2131,-56],[2130,-64],[2246,-64],[2247,-54],[2218,-57],[2222,-32],[2229,-33],[2225,-41],[2242,-36],[2244,-46],[2253,-37],[2249,-9],[2273,-16],[2293,-7],[2302,-12],[2302,-45],[2283,-43],[2282,-31],[2264,-24],[2251,-55],[2268,-52],[2269,-64],[2435,-64],[2444,-54],[2428,-14],[2434,12],[2407,61],[2347,55],[2341,76],[2327,74],[2338,92],[2352,92],[2353,102],[2319,161],[2292,158],[2289,138],[2301,131],[2292,132],[2292,117],[2289,133],[2238,149],[2222,120],[2208,130],[2210,142],[2183,148],[2161,178],[2131,188],[2129,198],[2114,204],[2095,189],[2083,198],[2082,187],[2078,207],[2061,197],[2057,222],[2034,222],[2031,232],[2069,232],[2073,219],[2097,213],[2102,227],[2108,210],[2120,212],[2150,186],[2192,169],[2190,201],[2210,188],[2227,155],[2233,167],[2248,169],[2279,152],[2277,162],[2293,168],[2291,182],[2267,191],[2279,196],[2303,174],[2315,175],[2263,273],[2266,341],[2241,353],[2219,399],[2237,404],[2246,418],[2240,438],[2252,428],[2249,405],[2228,384],[2242,357],[2282,345],[2284,322],[2296,309],[2304,313],[2303,304],[2326,331],[2306,301],[2317,290],[2314,272],[2358,288],[2348,274],[2320,264],[2324,247],[2331,248],[2330,212],[2345,174],[2367,191],[2358,174],[2365,168],[2345,164],[2369,165],[2352,156],[2362,153],[2366,128],[2382,146],[2382,138],[2392,145],[2384,115],[2417,142],[2399,118],[2417,103],[2430,107],[2421,99],[2439,82],[2442,58],[2477,30],[2490,34],[2480,27],[2504,6],[2543,14],[2551,8],[2542,-2],[2508,-2],[2507,-31],[2523,-35],[2502,-47],[2508,-61],[2538,-52],[2539,-64],[2829,-64],[2839,-48],[2839,-64],[2865,-64],[2855,-34],[2868,-46],[2866,-64],[2894,-64],[2903,-40],[2897,-15],[2885,-17],[2881,1],[2856,6],[2852,-23],[2833,24],[2841,15],[2869,12],[2875,20],[2865,39],[2884,31],[2877,10],[2893,7],[2893,-1],[2907,20],[2926,6],[2926,29],[2932,14],[2941,30],[2933,8],[2938,3],[2945,11],[2967,-9],[2960,-13],[2970,-19],[2957,-37],[2924,-2],[2918,-14],[2916,-7],[2905,-13],[2915,-64],[2957,-63],[2947,-62],[2958,-40],[2998,-64],[3107,-64],[3119,-36],[3128,-34],[3118,-2],[3106,5],[3102,-4],[3096,14],[3121,21],[3120,37],[3140,-38],[3165,-64],[3166,-64],[3193,-64],[3184,-51],[3189,-29],[3202,-64],[3303,-64],[3299,-53],[3319,-63],[3320,-56],[3339,-57],[3326,-64],[3402,-64],[3385,-41],[3367,-40],[3362,-24],[3336,-9],[3326,6],[3328,26],[3316,18],[3312,27],[3324,28],[3320,39],[3326,37],[3304,93],[3304,125],[3314,142],[3300,147],[3312,149],[3283,203],[3253,183],[3257,164],[3272,163],[3283,148],[3264,143],[3263,131],[3258,139],[3244,131],[3264,106],[3250,96],[3240,135],[3209,140],[3218,158],[3215,178],[3199,179],[3193,206],[3163,231],[3164,247],[3194,223],[3207,228],[3217,201],[3226,201],[3219,227],[3198,236],[3188,261],[3215,263],[3256,198],[3283,210],[3232,287],[3238,288],[3231,311],[3240,322],[3223,340],[3224,360],[3214,355],[3208,367],[3167,375],[3151,367],[3152,341],[3161,335],[3148,329],[3142,341],[3128,342],[3130,363],[3108,372],[3140,393],[3203,372],[3190,393],[3204,394],[3206,403],[3192,429],[3234,384],[3236,392],[3247,389],[3251,370],[3244,361],[3251,361],[3242,352],[3253,353],[3275,295],[3293,280],[3312,300],[3319,286],[3338,286],[3328,278],[3327,253],[3350,254],[3377,204],[3371,228],[3386,222],[3384,234],[3356,297],[3363,289],[3395,315],[3410,304],[3418,314],[3397,319],[3410,329],[3393,353],[3377,349],[3365,366],[3365,406],[3338,399],[3333,409],[3342,414],[3342,430],[3338,436],[3325,429],[3323,441],[3336,442],[3320,447],[3314,463],[3324,473],[3289,529],[3297,542],[3263,580],[3250,607],[3258,627],[3245,632],[3248,649],[3224,655],[3233,665],[3226,674],[3195,653],[3209,629],[3224,630],[3211,648],[3226,647],[3227,629],[3216,616],[3224,603],[3215,607],[3209,599],[3217,573],[3235,563],[3264,513],[3257,506],[3277,476],[3290,474],[3292,460],[3260,478],[3254,441],[3231,465],[3240,471],[3234,492],[3226,492],[3211,529],[3226,514],[3237,533],[3204,571],[3198,550],[3189,550],[3196,534],[3173,542],[3150,522],[3162,521],[3164,506],[3174,503],[3160,495],[3168,474],[3150,474],[3157,484],[3150,500],[3145,487],[3137,495],[3134,488],[3129,508],[3149,507],[3135,540],[3156,531],[3156,540],[3176,548],[3145,595],[3131,601],[3136,612],[3122,612],[3128,581],[3119,597],[3093,602],[3074,631],[3084,636],[3067,648],[3086,672],[3076,695],[3103,707],[3083,726],[3094,707],[3073,705],[3063,736],[3034,745],[3034,758],[3047,744],[3047,754],[3023,788],[3037,794],[3035,802],[3051,799],[3059,807],[3036,852],[3027,852],[3021,838],[3013,854],[3013,846],[3004,851],[3018,863],[3011,867],[3020,875],[3009,877],[3014,896],[2997,891],[2990,877],[2979,883],[2984,897],[2954,887],[2967,905],[2942,940],[2979,967],[2964,986],[2944,966],[2938,970],[2959,992],[2952,994],[2958,1014],[2926,1034],[2946,1037],[2964,1015],[2968,994],[2982,991],[2995,966],[2989,960],[2998,958],[3022,915],[3037,882],[3032,871],[3061,832],[3074,787],[3083,776],[3090,786],[3096,776],[3081,771],[3082,755],[3092,755],[3086,751],[3096,734],[3123,734],[3124,725],[3152,708],[3134,687],[3141,682],[3136,673],[3161,662],[3157,677],[3167,677],[3175,694],[3192,685],[3210,690],[3211,704],[3253,645],[3270,680],[3275,667],[3262,656],[3270,650],[3259,644],[3259,612],[3295,650],[3316,656],[3305,650],[3314,650],[3294,615],[3287,618],[3292,634],[3273,615],[3271,609],[3287,606],[3273,604],[3274,586],[3283,573],[3291,576],[3287,569],[3304,549],[3302,528],[3320,487],[3346,518],[3339,501],[3348,502],[3348,490],[3330,493],[3323,481],[3361,441],[3365,452],[3361,416],[3386,400],[3380,392],[3395,383],[3408,389],[3392,375],[3406,361],[3402,351],[3414,350],[3410,341],[3428,312],[3449,315],[3442,288],[3471,292],[3468,274],[3480,282],[3487,270],[3472,262],[3475,251],[3496,252],[3507,236],[3501,227],[3486,242],[3483,214],[3506,168],[3501,159],[3513,117],[3487,174],[3485,202],[3455,236],[3449,229],[3442,253],[3427,249],[3440,258],[3427,268],[3388,243],[3408,243],[3410,231],[3395,222],[3407,208],[3419,212],[3422,197],[3448,201],[3454,177],[3443,164],[3433,173],[3435,156],[3425,157],[3448,113],[3434,119],[3403,161],[3398,147],[3407,125],[3393,119],[3385,153],[3363,158],[3359,143],[3352,146],[3350,165],[3369,165],[3346,211],[3335,190],[3322,203],[3304,196],[3321,145],[3349,114],[3347,100],[3355,110],[3358,99],[3376,91],[3387,105],[3389,92],[3407,85],[3418,70],[3416,53],[3431,48],[3440,15],[3499,-63],[3550,-64],[3553,-57],[3574,-64],[3574,-55],[3580,-64],[3775,-64],[3774,-53],[3791,-64],[3920,-64],[3917,-45],[3902,-49],[3902,-57],[3864,-43],[3854,-15],[3872,-3],[3882,-31],[3904,-33],[3898,-20],[3908,-16],[3915,-37],[3923,-27],[3931,-31],[3925,-38],[3932,-64],[3969,-64],[3977,-44],[3986,-45],[3980,-64],[4091,-64],[4108,-55],[4125,-60],[4124,-53],[4134,-64],[4160,-64],[4160,2],[4149,17],[4151,31],[4130,45],[4121,70],[4107,75],[4105,95],[4077,82],[4047,102],[4031,66],[4056,38],[4040,28],[4068,14],[4070,26],[4076,23],[4073,13],[4092,-13],[4075,-25],[4079,-37],[4070,-38],[4058,-32],[4058,-12],[4033,-10],[4032,28],[3980,66],[3977,82],[3985,85],[3956,138],[3946,139],[3948,151],[3921,200],[3922,257],[3932,272],[3920,304],[3917,295],[3911,299],[3918,311],[3893,289],[3861,299],[3836,279],[3852,213],[3859,116],[3850,131],[3823,118],[3845,132],[3850,178],[3841,206],[3846,210],[3849,193],[3850,200],[3848,212],[3835,216],[3845,219],[3832,245],[3840,259],[3827,258],[3833,300],[3821,303],[3833,313],[3815,317],[3825,318],[3815,321],[3831,338],[3823,347],[3832,349],[3824,358],[3821,411],[3813,412],[3821,417],[3789,454],[3742,560],[3728,572],[3735,593],[3692,608],[3653,599],[3679,633],[3713,649],[3702,652],[3687,640],[3690,653],[3680,644],[3658,650],[3644,683],[3614,689],[3607,699],[3617,703],[3613,712],[3591,714],[3573,795],[3561,803],[3569,814],[3555,822],[3557,843],[3541,875],[3507,864],[3522,902],[3510,931],[3467,966],[3482,965],[3490,977],[3474,990],[3474,1005],[3418,1009],[3439,1016],[3449,1041],[3441,1055],[3445,1073],[3434,1074],[3419,1126],[3400,1141],[3403,1173],[3393,1184],[3376,1182],[3331,1242],[3305,1315],[3288,1322],[3289,1315],[3262,1341],[3255,1335],[3255,1347],[3249,1331],[3242,1335],[3248,1341],[3224,1349],[3230,1359],[3223,1365],[3215,1358],[3212,1367],[3206,1357],[3195,1371],[3156,1376],[3025,1540],[2999,1515],[2998,1525],[2990,1522],[3003,1508],[2998,1496],[2973,1528],[2958,1526],[2997,1547],[2991,1553],[3002,1565],[2942,1616],[2931,1612],[2904,1642],[2913,1636],[2922,1645],[2921,1631],[2986,1591],[3016,1591],[3072,1637],[3067,1657],[3088,1654],[3109,1695],[3088,1710],[3076,1707],[3088,1724],[3059,1731],[3043,1759],[3029,1751],[3021,1770],[3012,1732],[3004,1732],[2996,1755],[2990,1745],[2982,1749],[2983,1761],[2942,1751],[2956,1760],[2938,1756],[2950,1762],[2958,1761],[2979,1775],[2956,1777],[2996,1791],[2979,1806],[2961,1803],[2968,1812],[2997,1813],[2995,1824],[3011,1808],[3027,1812],[3033,1826],[3037,1815],[3040,1821],[3051,1813],[3076,1836],[3031,1873],[3021,1861],[3030,1847],[3010,1851],[3011,1839],[3005,1859],[2995,1849],[3000,1833],[2989,1855],[2979,1856],[2972,1888],[2983,1886],[2975,1901],[2950,1905],[2943,1913],[2950,1921],[2936,1924],[2940,1938],[2967,1931],[2983,1906],[3007,1902],[2984,1917],[2968,1945],[2942,1959],[2946,1978],[2954,1983],[2962,1957],[2982,1951],[2990,1926],[3015,1904],[3043,1918],[3046,1931],[3036,1930],[3034,1939],[3043,1941],[3022,1949],[3013,1942],[3002,1949],[3007,1956],[2995,1950],[2993,1959],[3009,1962],[3008,1976],[3017,1973],[3010,1990],[2991,1997],[2984,1980],[2973,1986],[2967,1972],[2968,1995],[2965,1987],[2959,1998],[2931,1967],[2937,1955],[2926,1930],[2934,1905],[2922,1921],[2919,1906],[2914,1928],[2904,1932],[2899,1908],[2894,1924],[2875,1925],[2872,1898],[2859,1900],[2856,1912],[2848,1898],[2830,1892],[2808,1902],[2827,1929],[2858,1943],[2877,1931],[2896,1947],[2888,1960],[2879,1948],[2867,1953],[2875,1956],[2865,1968],[2875,1979],[2870,1987],[2852,1978],[2857,1994],[2870,1998],[2847,2003],[2857,2014],[2837,2014],[2843,2022],[2829,2035],[2797,2040],[2772,2061],[2800,2086],[2829,2088],[2854,2035],[2866,2033],[2861,2018],[2880,2007],[2897,2009],[2889,2014],[2896,2050],[2920,2019],[2922,2013],[2913,2025],[2898,2020],[2903,2003],[2914,2003],[2918,1993],[2952,2023],[2963,2012],[2967,2020],[2955,2031],[3001,2013],[3014,2018],[3026,2032],[2999,2038],[3014,2045],[3031,2034],[3028,2019],[3039,2008],[3045,2022],[3033,2039],[3049,2034],[3069,1988],[3079,1992],[3076,2000],[3091,1999],[3079,2011],[3091,2025],[3077,2032],[3095,2031],[3074,2055],[3069,2050],[3061,2068],[3073,2056],[3059,2072],[3049,2061],[3047,2080],[3004,2107],[2995,2104],[2994,2114],[2979,2106],[2964,2109],[2953,2074],[2947,2080],[2951,2071],[2940,2090],[2926,2080],[2935,2103],[2961,2108],[2975,2148],[2960,2149],[2955,2130],[2935,2130],[2936,2117],[2927,2112],[2915,2114],[2918,2128],[2908,2122],[2906,2140],[2886,2142],[2881,2176],[2892,2185],[2889,2193],[2906,2190],[2891,2197],[2884,2216],[2874,2213],[2874,2231],[2864,2234],[2866,2214],[2822,2238],[2828,2246],[2799,2266],[2798,2280],[2808,2282],[2791,2307],[2781,2307],[2779,2332],[2773,2329],[2755,2365],[2707,2398],[2674,2353],[2682,2338],[2674,2341],[2671,2326],[2690,2321],[2679,2318],[2681,2305],[2667,2302],[2675,2277],[2659,2271],[2656,2240],[2628,2241],[2627,2252],[2622,2246],[2615,2253],[2604,2235],[2605,2208],[2619,2201],[2633,2210],[2636,2198],[2653,2197],[2656,2184],[2646,2192],[2640,2178],[2630,2188],[2627,2178],[2618,2187],[2574,2193],[2557,2186],[2555,2171],[2573,2153],[2572,2132],[2557,2108],[2599,2122],[2646,2124],[2609,2103],[2584,2112],[2562,2105],[2560,2085],[2567,2083],[2559,2078],[2554,2086],[2526,2037],[2532,2039],[2546,2007],[2553,2012],[2571,1995],[2576,1999],[2568,2004],[2591,1998],[2588,1991],[2583,1997],[2585,1972],[2561,1997],[2546,1991],[2542,1998],[2556,1956],[2574,1977],[2573,1961],[2583,1951],[2576,1949],[2610,1950],[2614,1928],[2632,1945],[2635,1933],[2648,1943],[2629,1910],[2606,1895],[2599,1915],[2590,1910],[2569,1873],[2587,1849],[2629,1849],[2650,1869],[2648,1908],[2652,1911],[2658,1915],[2661,1901],[2688,1913],[2755,1872],[2806,1816],[2828,1767],[2887,1723],[2888,1712],[2875,1692],[2867,1718],[2823,1766],[2760,1860],[2691,1899],[2665,1898],[2656,1886],[2651,1836],[2660,1824],[2655,1802],[2686,1771],[2638,1736],[2658,1771],[2644,1790],[2652,1805],[2645,1812],[2638,1809],[2588,1848],[2577,1828],[2581,1838],[2572,1847],[2524,1845],[2500,1873],[2483,1869],[2490,1881],[2489,1883],[2482,1873],[2483,1887],[2487,1884],[2484,1888],[2461,1886],[2463,1897],[2452,1897],[2458,1902],[2428,1908],[2434,1912],[2426,1920],[2413,1909],[2401,1918],[2405,1932],[2388,1928],[2394,1935],[2373,1933],[2332,1950],[2313,1931],[2319,1926],[2311,1929],[2324,1912],[2324,1892],[2299,1892],[2295,1859],[2311,1836],[2305,1788],[2313,1783],[2306,1777],[2319,1779],[2322,1771],[2305,1717],[2308,1710],[2337,1717],[2343,1701],[2337,1684],[2324,1688],[2326,1677],[2354,1648],[2372,1653],[2367,1642],[2376,1647],[2378,1631],[2389,1626],[2396,1606],[2404,1608],[2413,1563],[2405,1562],[2375,1615],[2343,1618],[2328,1585],[2338,1557],[2352,1542],[2335,1548],[2330,1541],[2324,1555],[2299,1560],[2298,1571],[2329,1603],[2325,1612],[2301,1610],[2294,1597],[2297,1606],[2288,1604],[2304,1618],[2297,1629],[2310,1636],[2302,1678],[2291,1687],[2310,1692],[2275,1762],[2301,1802],[2297,1816],[2284,1822],[2297,1848],[2290,1855],[2270,1851],[2293,1863],[2292,1878],[2279,1881],[2286,1867],[2262,1858],[2273,1883],[2260,1881],[2269,1892],[2250,1878],[2234,1885],[2217,1876],[2201,1897],[2173,1872],[2109,1858],[2113,1868],[2170,1876],[2177,1886],[2153,1908],[2128,1916],[2108,1949],[2043,1991],[2051,1995],[2068,1979],[2110,1971],[2122,1942],[2132,1941],[2122,1937],[2175,1906],[2227,1919],[2202,1904],[2223,1884],[2274,1904],[2274,1920],[2288,1938],[2277,1936],[2283,1946],[2241,1923],[2270,1941],[2276,1963],[2262,1965],[2273,1984],[2261,1975],[2272,1992],[2245,1973],[2241,1988],[2240,1981],[2235,1989],[2215,1981],[2229,2010],[2215,2030],[2222,2034],[2233,2030],[2232,2013],[2269,2016],[2286,2004],[2311,2004],[2315,1973],[2306,1967],[2308,1963],[2322,1974],[2332,1957],[2422,1929],[2430,1929],[2433,1942],[2441,1928],[2506,1889],[2531,1877],[2541,1884],[2561,1877],[2596,1935],[2583,1947],[2557,1945],[2542,1978],[2526,1972],[2537,1987],[2524,1997],[2509,1981],[2522,1999],[2488,2010],[2485,2030],[2527,2067],[2526,2079],[2517,2081],[2531,2091],[2525,2105],[2535,2104],[2559,2133],[2556,2160],[2524,2175],[2441,2110],[2438,2094],[2425,2098],[2417,2125],[2396,2131],[2405,2156],[2400,2166],[2348,2178],[2312,2208],[2298,2235],[2296,2228],[2288,2232],[2271,2284],[2247,2313],[2235,2313],[2212,2338],[2166,2348],[2160,2399],[2169,2402],[2149,2423],[2134,2427],[2133,2414],[2119,2427],[2103,2425],[2098,2439],[2111,2442],[2098,2444],[2106,2446],[2099,2466],[2124,2474],[2110,2541],[2067,2580],[2061,2603],[2057,2592],[2045,2608],[2023,2608],[2022,2615],[2038,2616],[2053,2608],[2045,2642],[2058,2685],[2039,2706],[2010,2714],[2008,2704],[1990,2714],[1988,2698],[1975,2723],[1948,2731],[1939,2721],[1933,2738],[1916,2750],[1910,2741],[1910,2753],[1896,2751],[1895,2767],[1865,2787],[1870,2793],[1861,2802],[1884,2787],[1879,2779],[1906,2769],[1898,2768],[1904,2759],[1917,2756],[1917,2765],[1926,2748],[1948,2755],[1945,2768],[1928,2778],[1981,2763],[1950,2760],[1995,2734],[2018,2739],[2024,2725],[2008,2730],[2070,2696],[2062,2716],[2073,2711],[2093,2723],[2052,2759],[1969,2791],[1901,2871],[1879,2885],[1874,2876],[1859,2899],[1852,2896],[1858,2921],[1831,2929],[1844,2930],[1835,2944],[1870,2965],[1840,2992],[1844,3003],[1843,2994],[1862,2992],[1876,2973],[1875,2960],[1892,2955],[1885,2938],[1914,2944],[1957,2929],[1965,2941],[1956,2959],[1937,2957],[1918,3028],[1910,3028],[1910,3038],[1903,3029],[1895,3034],[1897,3052],[1880,3042],[1885,3047],[1848,3062],[1839,3051],[1843,3036],[1882,3006],[1852,3028],[1819,3018],[1816,3029],[1836,3047],[1811,3060],[1804,3077],[1782,3088],[1728,3091],[1714,3106],[1701,3095],[1713,3066],[1747,3031],[1746,3017],[1763,3027],[1803,3008],[1776,3019],[1765,3012],[1761,2991],[1784,2977],[1765,2975],[1760,2954],[1768,2953],[1753,2945],[1759,2924],[1769,2920],[1762,2908],[1776,2908],[1781,2894],[1798,2885],[1787,2895],[1795,2896],[1818,2874],[1835,2873],[1826,2870],[1851,2839],[1854,2846],[1859,2830],[1845,2837],[1841,2825],[1831,2824],[1839,2831],[1830,2832],[1832,2854],[1823,2851],[1821,2862],[1815,2857],[1786,2887],[1777,2882],[1769,2899],[1754,2894],[1760,2906],[1739,2906],[1746,2966],[1739,2975],[1747,2983],[1740,2983],[1746,2990],[1735,2984],[1735,2997],[1748,3000],[1730,3007],[1731,3016],[1702,2999],[1716,2986],[1707,2975],[1710,2962],[1702,2961],[1709,2955],[1699,2949],[1714,2933],[1698,2926],[1709,2915],[1687,2920],[1681,2912],[1691,2908],[1689,2893],[1716,2897],[1727,2877],[1751,2865],[1751,2845],[1735,2838],[1725,2846],[1716,2835],[1697,2856],[1666,2857],[1646,2872],[1642,2888],[1610,2902],[1599,2898],[1604,2904],[1596,2913],[1579,2900],[1585,2931],[1560,2943],[1495,2946],[1486,2972],[1474,2964],[1478,2953],[1447,2958],[1453,2972],[1438,2972],[1436,2951],[1429,2965],[1418,2959],[1407,2969],[1398,2957],[1398,2970],[1412,2975],[1405,2982],[1416,2984],[1410,2995],[1423,3004],[1411,3012],[1416,3023],[1386,2976],[1397,2957],[1386,2953],[1397,2924],[1388,2903],[1398,2911],[1408,2901],[1387,2902],[1400,2879],[1392,2855],[1406,2848],[1415,2855],[1409,2841],[1432,2839],[1430,2828],[1439,2835],[1460,2818],[1503,2817],[1524,2804],[1536,2809],[1531,2824],[1543,2820],[1547,2836],[1558,2834],[1563,2813],[1591,2814],[1605,2798],[1612,2803],[1664,2762],[1642,2760],[1684,2736],[1688,2741],[1690,2731],[1701,2738],[1705,2725],[1723,2722],[1725,2730],[1753,2719],[1768,2696],[1774,2702],[1789,2681],[1799,2685],[1801,2661],[1834,2652],[1840,2636],[1851,2642],[1867,2625],[1880,2626],[1880,2608],[1896,2612],[1938,2558],[1959,2552],[1911,2542],[1919,2530],[1954,2520],[1968,2525],[1964,2535],[1971,2530],[1961,2551],[1985,2544],[1993,2553],[2007,2540],[2015,2549],[2033,2531],[2052,2534],[2060,2518],[2066,2525],[2074,2501],[2056,2497],[2071,2496],[2077,2485],[2052,2478],[2012,2487],[2003,2502],[1971,2500],[1971,2507],[1950,2508],[1952,2518],[1948,2510],[1872,2540],[1858,2565],[1837,2568],[1837,2577],[1816,2582],[1818,2590],[1808,2587],[1809,2605],[1803,2594],[1787,2602],[1790,2615],[1754,2635],[1756,2649],[1741,2647],[1746,2656],[1731,2659],[1725,2680],[1707,2697],[1681,2694],[1697,2708],[1682,2714],[1684,2726],[1675,2721],[1670,2740],[1620,2767],[1579,2804],[1580,2789],[1569,2808],[1552,2798],[1587,2770],[1573,2764],[1600,2742],[1596,2726],[1629,2731],[1598,2724],[1599,2710],[1616,2695],[1603,2705],[1597,2700],[1591,2716],[1549,2725],[1566,2726],[1537,2748],[1521,2745],[1524,2754],[1512,2753],[1501,2770],[1488,2759],[1477,2767],[1463,2761],[1462,2772],[1436,2755],[1426,2759],[1425,2744],[1418,2745],[1427,2740],[1424,2730],[1409,2733],[1414,2744],[1398,2751],[1398,2767],[1392,2752],[1364,2778],[1366,2769],[1353,2777],[1358,2758],[1351,2759],[1348,2741],[1327,2742],[1348,2757],[1344,2776],[1326,2782],[1302,2770],[1298,2757],[1310,2731],[1332,2727],[1297,2714],[1316,2661],[1312,2649],[1287,2699],[1278,2708],[1266,2703],[1264,2720],[1253,2714],[1252,2734],[1283,2732],[1287,2753],[1281,2737],[1263,2753],[1233,2745],[1235,2737],[1251,2745],[1238,2728],[1230,2730],[1231,2745],[1189,2750],[1189,2740],[1196,2741],[1185,2732],[1171,2739],[1159,2710],[1111,2749],[1092,2708],[1099,2710],[1112,2687],[1145,2684],[1159,2709],[1174,2686],[1146,2684],[1142,2676],[1161,2661],[1179,2666],[1160,2659],[1160,2640],[1198,2614],[1196,2599],[1204,2610],[1231,2581],[1251,2589],[1250,2608],[1259,2599],[1264,2608],[1309,2588],[1310,2571],[1325,2576],[1320,2566],[1347,2551],[1350,2540],[1340,2534],[1311,2550],[1310,2533],[1334,2511],[1349,2508],[1348,2516],[1368,2506],[1368,2493],[1377,2497],[1377,2489],[1358,2483],[1348,2453],[1356,2445],[1342,2445],[1344,2435],[1357,2433],[1343,2429],[1348,2416],[1331,2427],[1280,2424],[1297,2410],[1294,2387],[1322,2402],[1318,2380],[1303,2372],[1330,2350],[1306,2347],[1314,2335],[1310,2336],[1296,2323],[1279,2328],[1287,2367],[1264,2357],[1273,2348],[1266,2342],[1255,2354],[1242,2351],[1269,2377],[1279,2415],[1267,2416],[1273,2446],[1299,2461],[1292,2468],[1304,2479],[1296,2483],[1303,2484],[1296,2487],[1301,2495],[1291,2496],[1277,2458],[1263,2486],[1272,2515],[1254,2523],[1212,2484],[1225,2475],[1228,2485],[1227,2466],[1208,2470],[1189,2448],[1194,2421],[1190,2427],[1176,2420],[1170,2425],[1183,2427],[1173,2432],[1186,2445],[1180,2459],[1196,2463],[1183,2482],[1175,2479],[1182,2494],[1170,2495],[1165,2486],[1165,2494],[1150,2493],[1166,2453],[1161,2415],[1198,2402],[1193,2387],[1173,2383],[1173,2372],[1155,2369],[1150,2377],[1151,2360],[1162,2353],[1179,2363],[1180,2345],[1176,2346],[1157,2322],[1167,2325],[1169,2313],[1193,2308],[1192,2319],[1203,2319],[1197,2326],[1215,2326],[1209,2306],[1228,2303],[1215,2297],[1179,2307],[1166,2291],[1122,2277],[1119,2295],[1129,2312],[1113,2318],[1115,2306],[1105,2315],[1114,2320],[1108,2342],[1106,2330],[1093,2335],[1122,2379],[1133,2376],[1119,2382],[1133,2391],[1122,2411],[1129,2421],[1106,2414],[1105,2420],[1143,2444],[1143,2458],[1130,2465],[1138,2469],[1119,2463],[1112,2468],[1121,2471],[1111,2472],[1141,2477],[1140,2494],[1126,2499],[1121,2521],[1107,2525],[1108,2511],[1094,2505],[1101,2485],[1094,2480],[1082,2489],[1087,2518],[1056,2503],[1078,2521],[1071,2530],[1059,2523],[1049,2533],[1055,2541],[1089,2546],[1094,2564],[1098,2550],[1114,2549],[1093,2572],[1085,2572],[1085,2561],[1067,2588],[1065,2595],[1082,2606],[1098,2603],[1087,2599],[1099,2592],[1117,2610],[1109,2620],[1093,2618],[1076,2643],[1060,2635],[1057,2643],[1073,2656],[1056,2653],[1031,2677],[1015,2673],[1020,2681],[1007,2673],[1009,2696],[981,2709],[974,2705],[980,2696],[962,2699],[957,2680],[931,2665],[920,2676],[928,2694],[922,2699],[931,2702],[888,2709],[910,2714],[959,2703],[945,2724],[884,2737],[867,2726],[863,2734],[802,2740],[795,2708],[803,2705],[811,2724],[816,2719],[796,2690],[773,2699],[760,2694],[780,2688],[778,2678],[790,2679],[787,2661],[796,2648],[784,2641],[801,2619],[811,2620],[796,2607],[797,2592],[811,2598],[829,2582],[871,2569],[851,2581],[865,2583],[877,2569],[862,2548],[828,2550],[813,2536],[814,2515],[779,2501],[794,2490],[774,2489],[742,2504],[750,2513],[743,2522],[782,2536],[785,2527],[802,2530],[815,2561],[797,2585],[786,2561],[775,2560],[786,2570],[777,2578],[785,2591],[739,2567],[734,2575],[734,2561],[750,2564],[749,2543],[730,2560],[725,2554],[725,2562],[707,2555],[717,2573],[707,2574],[708,2594],[717,2588],[721,2603],[722,2592],[728,2619],[727,2637],[717,2633],[719,2625],[709,2643],[729,2647],[711,2659],[712,2668],[702,2667],[703,2660],[695,2640],[657,2661],[651,2676],[645,2663],[660,2648],[653,2643],[608,2681],[628,2682],[613,2701],[600,2698],[603,2713],[587,2719],[569,2708],[557,2717],[570,2740],[549,2739],[532,2719],[508,2736],[502,2729],[496,2745],[480,2746],[466,2763],[438,2777],[430,2771],[430,2779],[421,2778],[422,2791],[440,2794],[425,2810],[433,2839],[424,2835],[408,2850],[400,2827],[376,2857],[352,2858],[328,2875],[312,2869],[318,2876],[300,2891],[336,2885],[346,2899],[377,2884],[378,2873],[395,2894],[394,2908],[335,2922],[316,2917],[312,2929],[353,2931],[320,2938],[322,2948],[352,2938],[345,2948],[337,2945],[335,2955],[320,2957],[306,2943],[302,2956],[289,2953],[277,2964],[260,2958],[254,2977],[238,2984],[271,2983],[239,3005],[207,2989],[199,3004],[182,2987],[263,2949],[206,2964],[208,2970],[186,2975],[137,3009],[92,3023],[107,3030],[100,3030],[107,3043],[93,3051],[92,3062],[90,3049],[79,3049],[93,3037],[78,3046],[72,3038],[81,3031],[27,3050],[35,3027],[50,3020],[41,3020],[41,2992],[14,2999],[7,2990],[24,2962],[118,2923],[115,2907],[104,2905],[108,2897],[119,2905],[117,2884],[107,2886],[117,2881],[114,2869],[124,2857],[98,2868],[95,2852],[84,2851],[62,2867],[47,2865],[38,2878],[78,2880],[68,2893],[72,2904],[84,2903],[81,2928],[31,2946],[10,2937],[-14,2945],[-7,2959],[-18,2969],[-17,2984],[-23,2973],[-64,2980],[-64,2938],[-61,2947],[-56,2943],[-64,2934],[-64,2528],[-60,2544],[-53,2535],[-64,2527],[-64,2078],[-56,2067],[-64,2076],[-64,1882],[-44,1896],[-15,1891],[22,1867],[-18,1875],[-30,1863],[-43,1890],[-54,1885],[-51,1875],[-64,1881],[-64,1675],[-55,1681],[-51,1715],[-37,1710],[-28,1721],[-18,1756],[13,1758],[15,1772],[18,1766],[26,1773],[21,1799],[34,1796],[28,1817],[63,1802],[63,1813],[73,1807],[86,1825],[97,1787],[90,1775],[82,1787],[62,1755],[45,1745],[47,1719],[41,1739],[28,1743],[30,1692],[21,1694],[17,1684],[11,1717],[-1,1706],[4,1672],[20,1666],[-3,1650],[-12,1656],[-11,1644],[-19,1644],[-35,1646],[-54,1674],[-64,1672],[-64,1632],[-51,1632],[-53,1624],[-64,1625],[-64,1370],[-56,1364],[-64,1358],[-64,1121],[28,1167],[34,1157],[-22,1126],[-35,1102],[-58,1103],[-55,1086],[-63,1091],[-39,1056],[-58,1062],[-41,1046],[-23,1044],[-49,1020],[-57,1025],[-52,1040],[-64,1048],[-64,943],[-56,926],[-15,950],[-6,968],[-18,1044],[-11,1090],[7,1091],[86,1174],[77,1176],[73,1192],[89,1194],[89,1201],[70,1222],[79,1224],[103,1203],[108,1195],[100,1185],[120,1167],[120,1191],[135,1189],[141,1198],[127,1246],[140,1253],[133,1299],[146,1270],[157,1266],[164,1279],[159,1294],[169,1281],[161,1268],[171,1236],[180,1236],[166,1228],[172,1208],[147,1203],[139,1186],[125,1182],[126,1162],[177,1128],[188,1131],[204,1173],[207,1157],[233,1160],[243,1152],[244,1161],[247,1150],[264,1143],[285,1187],[334,1204],[357,1195],[366,1200],[369,1226],[393,1260],[372,1275],[377,1293],[378,1277],[395,1264],[433,1296],[434,1307],[439,1296],[491,1306],[496,1296],[464,1297],[409,1264],[402,1252],[415,1246],[397,1245],[378,1223],[373,1194],[388,1167],[373,1189],[357,1182],[323,1187],[330,1174],[343,1173],[351,1154],[329,1157],[331,1167],[324,1155],[321,1185],[289,1174],[280,1161],[307,1157],[319,1136],[303,1128],[277,1141],[263,1130],[211,1147],[199,1122],[212,1101],[195,1120],[165,1120],[137,1140],[136,1119],[145,1130],[144,1112],[157,1098],[125,1116],[133,1119],[104,1142],[108,1149],[90,1154],[-2,1060],[-2,1016],[14,974],[10,956],[26,950],[-45,910],[-3,869],[-18,846],[-1,835],[23,842],[29,818],[2,821],[6,804],[13,794],[21,801],[19,790],[29,782],[89,782],[100,798],[118,790],[133,804],[141,778],[131,781],[132,770],[122,769],[126,756],[105,755],[121,717],[114,714],[156,697],[176,668],[169,667],[142,701],[118,703],[106,717],[107,733],[99,730],[99,757],[83,767],[31,772],[-3,795],[-21,771],[4,763],[-30,754],[-45,786],[-41,801],[-53,802],[-56,795],[-62,799],[-57,808],[-64,806],[-64,749],[-38,742],[-64,748],[-64,674],[-55,672],[-64,671],[-64,654],[-64,463],[-38,465],[-27,454],[-46,436],[-47,450],[-64,460],[-64,313],[-54,310],[-64,308],[-64,253],[-63,260],[-54,257],[-64,252],[-64,238],[-57,242],[-51,229],[-20,222],[0,227],[11,200],[-8,197],[-23,214],[-42,216],[-28,209],[-35,204],[-64,219],[-64,171],[-54,168],[-44,178],[-44,159],[-33,147],[-52,132],[-64,148],[-64,74],[-54,82],[-54,101],[-51,89],[-43,90],[-37,82]],[[1761,3044],[1761,3054],[1782,3060]],[[1735,2908],[1710,2915],[1728,2919],[1737,2918]],[[1422,2881],[1402,2890],[1417,2898]],[[1529,2844],[1505,2851],[1501,2845],[1496,2856],[1491,2847],[1466,2866],[1467,2854],[1445,2857],[1449,2875],[1471,2881],[1482,2866],[1487,2877],[1493,2869],[1511,2872],[1515,2862],[1531,2863],[1520,2850]],[[1765,2832],[1761,2841],[1781,2838],[1782,2853],[1796,2849],[1796,2836]],[[1854,2884],[1841,2888],[1854,2892]],[[1689,2815],[1684,2825],[1692,2827],[1678,2836],[1689,2832],[1682,2842],[1694,2844],[1692,2834],[1699,2838],[1701,2830]],[[1341,2711],[1335,2728],[1359,2746],[1373,2740],[1396,2722],[1345,2718]],[[1538,2735],[1529,2741],[1539,2742]],[[1833,2800],[1810,2809],[1812,2824]],[[1888,2808],[1876,2817],[1885,2818]],[[1488,2720],[1448,2725],[1461,2727],[1459,2735],[1488,2729]],[[1508,2671],[1508,2721],[1522,2707],[1525,2675],[1514,2672]],[[1223,2719],[1212,2720],[1208,2733],[1207,2720],[1196,2730],[1204,2743],[1211,2745]],[[1923,2781],[1905,2786],[1907,2793]],[[1925,2770],[1923,2781],[1927,2778]],[[1235,2717],[1239,2727],[1246,2723]],[[1176,2717],[1181,2725],[1187,2719]],[[2042,2734],[1981,2763],[2028,2750]],[[1684,2747],[1679,2756],[1691,2754]],[[1176,2696],[1172,2701],[1183,2698]],[[1211,2621],[1208,2634],[1190,2632],[1171,2648],[1196,2652],[1208,2636],[1219,2640],[1219,2630]],[[1646,2630],[1643,2638],[1651,2635]],[[1250,2609],[1231,2614],[1220,2630],[1235,2637],[1234,2623],[1246,2623]],[[1751,2571],[1720,2582],[1697,2612],[1708,2605],[1715,2628],[1714,2608],[1735,2601],[1734,2587]],[[1864,2685],[1873,2698],[1859,2711],[1884,2697]],[[1692,2553],[1684,2561],[1697,2560]],[[1402,2483],[1405,2495],[1379,2529],[1352,2537],[1357,2546],[1370,2546],[1370,2539],[1373,2545],[1388,2525],[1436,2504],[1436,2485],[1426,2498]],[[1974,2631],[1946,2650],[1962,2661]],[[1814,2524],[1799,2531],[1800,2540],[1814,2540]],[[1938,2622],[1938,2630],[1952,2633]],[[1989,2630],[1974,2631],[1983,2632]],[[1835,2509],[1816,2528],[1845,2510]],[[1639,2454],[1638,2495],[1661,2497],[1628,2508],[1637,2517],[1644,2505],[1654,2503],[1657,2512],[1668,2502],[1683,2455],[1663,2472]],[[1849,2494],[1848,2502],[1862,2507],[1861,2497]],[[1947,2435],[1948,2444],[1949,2455],[1937,2452],[1930,2462],[1867,2463],[1854,2478],[1861,2497],[1867,2504],[1865,2495],[1885,2485],[1887,2473],[1893,2488],[1913,2476],[1914,2463],[1922,2472],[1968,2448],[1965,2439]],[[1259,2453],[1246,2457],[1259,2466],[1251,2459]],[[1176,2366],[1179,2380],[1191,2372]],[[1228,2321],[1229,2337],[1238,2338],[1233,2336],[1237,2323]],[[1313,2281],[1301,2282],[1308,2289]],[[108,2996],[99,2997],[104,3004]],[[1393,2459],[1391,2471],[1400,2474]],[[124,2989],[110,2995],[129,2999]],[[1468,2447],[1455,2470],[1479,2467],[1478,2448]],[[1511,2459],[1507,2464],[1520,2465]],[[2026,2448],[2023,2457],[2032,2462],[2038,2453]],[[1428,2442],[1401,2451],[1417,2452]],[[1970,2439],[1978,2448],[1983,2441]],[[2009,2422],[2012,2432],[1999,2434],[2026,2447],[2034,2433]],[[1552,2446],[1569,2438],[1546,2438]],[[1357,2433],[1353,2440],[1363,2438]],[[1463,2404],[1434,2438],[1477,2423],[1482,2407],[1472,2405]],[[1417,2364],[1388,2385],[1395,2400],[1377,2403],[1376,2415],[1368,2410],[1388,2437],[1405,2433],[1410,2422],[1400,2399],[1412,2375],[1428,2368]],[[1619,2414],[1573,2436],[1586,2437]],[[1775,2284],[1772,2308],[1755,2313],[1758,2298],[1749,2299],[1751,2318],[1733,2330],[1676,2335],[1659,2357],[1636,2361],[1634,2369],[1643,2367],[1623,2386],[1615,2384],[1616,2402],[1646,2385],[1647,2395],[1630,2408],[1640,2415],[1655,2389],[1663,2396],[1663,2388],[1671,2393],[1678,2386],[1670,2382],[1677,2368],[1687,2362],[1695,2369],[1686,2378],[1697,2381],[1697,2366],[1706,2374],[1730,2348],[1751,2342],[1753,2332],[1764,2337],[1779,2317],[1804,2307],[1807,2295],[1814,2298],[1809,2291],[1819,2285]],[[1334,2390],[1328,2398],[1354,2414],[1353,2403],[1365,2407]],[[1738,2405],[1733,2411],[1748,2413]],[[166,2979],[166,2987],[173,2980]],[[1847,1472],[1836,1482],[1818,1478],[1810,1496],[1801,1493],[1801,1503],[1785,1509],[1783,1523],[1765,1507],[1753,1516],[1744,1506],[1739,1524],[1730,1514],[1734,1531],[1723,1557],[1718,1564],[1700,1560],[1713,1605],[1722,1608],[1724,1636],[1686,1611],[1682,1618],[1673,1613],[1669,1633],[1657,1629],[1644,1620],[1643,1585],[1625,1572],[1621,1577],[1639,1594],[1615,1596],[1606,1583],[1607,1556],[1636,1536],[1617,1536],[1604,1552],[1616,1519],[1595,1491],[1590,1497],[1593,1484],[1585,1512],[1570,1512],[1574,1526],[1558,1521],[1561,1512],[1547,1524],[1550,1546],[1539,1545],[1556,1571],[1523,1568],[1551,1582],[1539,1589],[1526,1581],[1529,1590],[1515,1587],[1517,1606],[1507,1601],[1490,1613],[1498,1614],[1496,1625],[1503,1618],[1498,1634],[1505,1644],[1515,1636],[1505,1628],[1507,1612],[1530,1606],[1538,1614],[1534,1626],[1543,1608],[1538,1598],[1546,1592],[1547,1609],[1554,1600],[1552,1607],[1565,1604],[1566,1590],[1593,1576],[1589,1633],[1600,1642],[1621,1622],[1624,1640],[1644,1649],[1668,1640],[1685,1660],[1680,1673],[1685,1667],[1693,1675],[1670,1681],[1673,1695],[1654,1726],[1639,1714],[1638,1722],[1624,1716],[1635,1726],[1629,1741],[1616,1748],[1587,1740],[1590,1750],[1561,1766],[1564,1770],[1559,1782],[1567,1780],[1560,1801],[1576,1812],[1538,1801],[1545,1818],[1534,1807],[1526,1816],[1538,1823],[1536,1895],[1547,1914],[1540,1938],[1520,1949],[1524,1956],[1502,1977],[1521,1997],[1523,2012],[1557,2013],[1551,2023],[1563,2023],[1559,2032],[1537,2040],[1517,2018],[1511,2034],[1496,2032],[1505,1999],[1496,1990],[1483,1999],[1480,1983],[1463,1982],[1455,1989],[1458,1980],[1448,1976],[1443,1984],[1453,1991],[1422,2019],[1463,2000],[1469,2013],[1468,1996],[1489,2007],[1475,2002],[1476,2015],[1486,2018],[1468,2023],[1472,2010],[1454,2039],[1455,2071],[1467,2074],[1466,2083],[1455,2091],[1454,2107],[1443,2108],[1447,2116],[1460,2114],[1463,2138],[1449,2146],[1437,2141],[1431,2157],[1441,2162],[1462,2144],[1464,2157],[1457,2155],[1456,2167],[1440,2177],[1448,2186],[1454,2177],[1472,2181],[1467,2191],[1476,2201],[1483,2196],[1484,2223],[1470,2223],[1475,2238],[1453,2252],[1459,2280],[1438,2275],[1462,2307],[1471,2306],[1462,2322],[1488,2338],[1487,2350],[1467,2364],[1467,2355],[1452,2349],[1451,2329],[1436,2321],[1439,2352],[1443,2348],[1461,2367],[1488,2373],[1482,2379],[1492,2384],[1481,2380],[1480,2396],[1489,2390],[1489,2406],[1498,2387],[1500,2398],[1504,2376],[1557,2376],[1584,2351],[1577,2334],[1585,2343],[1629,2311],[1662,2306],[1665,2289],[1684,2284],[1680,2275],[1695,2263],[1672,2268],[1668,2256],[1659,2267],[1651,2253],[1649,2267],[1640,2262],[1638,2272],[1626,2274],[1629,2243],[1606,2246],[1609,2238],[1593,2226],[1595,2202],[1617,2159],[1615,2146],[1648,2142],[1661,2115],[1679,2109],[1659,2114],[1655,2103],[1647,2108],[1634,2096],[1635,2088],[1650,2091],[1636,2082],[1649,2082],[1639,2077],[1646,2074],[1670,2080],[1663,2064],[1674,2066],[1677,2049],[1668,2052],[1674,2045],[1666,2044],[1663,2027],[1701,1960],[1701,1939],[1721,1943],[1716,1918],[1732,1902],[1724,1880],[1751,1857],[1714,1850],[1721,1798],[1755,1750],[1762,1752],[1769,1731],[1762,1731],[1782,1714],[1788,1725],[1779,1730],[1811,1731],[1813,1710],[1821,1713],[1820,1700],[1832,1694],[1809,1704],[1804,1719],[1797,1703],[1818,1691],[1796,1660],[1783,1683],[1760,1683],[1770,1646],[1758,1643],[1771,1633],[1768,1616],[1776,1629],[1775,1615],[1799,1599],[1784,1615],[1795,1612],[1809,1595],[1805,1609],[1818,1611],[1847,1568],[1832,1576],[1823,1558],[1808,1556],[1801,1544],[1762,1549],[1806,1538],[1816,1515],[1836,1514],[1836,1491],[1845,1485],[1874,1489],[1873,1481],[1848,1480]],[[60,2977],[51,2979],[56,2986]],[[78,2969],[73,2978],[83,2977]],[[2062,2365],[2044,2387],[2038,2377],[2026,2378],[2027,2389],[2047,2399],[2061,2380],[2068,2383]],[[-29,2947],[-44,2951],[-30,2960]],[[173,2913],[155,2915],[132,2936]],[[223,2880],[193,2902],[186,2898],[173,2913],[192,2911],[233,2882]],[[1517,2382],[1505,2385],[1522,2396]],[[31,2841],[22,2844],[39,2857]],[[1790,2373],[1775,2390],[1797,2380]],[[664,2640],[660,2648],[668,2648]],[[669,2617],[641,2622],[641,2630],[651,2627],[674,2647],[691,2641]],[[343,2773],[332,2781],[332,2801],[297,2813],[301,2821],[263,2843],[267,2861],[234,2882],[244,2885],[264,2866],[273,2871],[269,2865],[281,2854],[374,2818],[360,2834],[363,2846],[363,2836],[387,2827],[382,2810],[379,2799],[363,2802],[347,2789]],[[1908,2365],[1900,2368],[1907,2373]],[[878,2692],[863,2706],[881,2708],[881,2699]],[[1383,2334],[1363,2338],[1370,2344],[1360,2343],[1366,2350],[1353,2359],[1374,2368],[1375,2354],[1388,2345]],[[1847,2350],[1819,2357],[1815,2366]],[[887,2694],[881,2699],[887,2703]],[[2106,2337],[2089,2340],[2099,2351]],[[2066,2343],[2068,2351],[2077,2348]],[[1917,2265],[1893,2285],[1907,2303],[1857,2344],[1881,2336],[1888,2343],[1893,2325],[1900,2328],[1913,2314],[1905,2312],[1913,2307],[1915,2293],[1908,2291]],[[287,2816],[287,2825],[294,2820]],[[7,2789],[-5,2804],[0,2810],[20,2804],[19,2790]],[[1336,2329],[1316,2334],[1339,2339]],[[34,2747],[23,2756],[29,2800],[53,2782],[43,2783],[43,2753]],[[1970,2314],[1953,2334],[1968,2334]],[[1665,2314],[1666,2324],[1675,2332],[1682,2317]],[[282,2757],[282,2770],[299,2782]],[[1275,2312],[1274,2322],[1285,2317]],[[1305,2301],[1296,2302],[1296,2311]],[[1476,1969],[1476,1978],[1486,1970]],[[381,2768],[389,2781],[400,2775]],[[366,2750],[352,2760],[367,2774],[378,2765]],[[465,2759],[466,2744],[458,2744]],[[442,2562],[424,2568],[432,2581],[423,2596],[419,2606],[402,2599],[400,2594],[381,2577],[366,2580],[385,2605],[397,2605],[390,2614],[397,2633],[391,2645],[379,2644],[356,2619],[346,2642],[352,2676],[368,2666],[370,2654],[395,2652],[406,2625],[436,2624],[425,2631],[437,2632],[406,2658],[422,2686],[395,2698],[412,2709],[411,2729],[397,2716],[382,2724],[394,2725],[401,2735],[390,2745],[405,2750],[447,2729],[455,2736],[475,2719],[457,2726],[464,2711],[482,2711],[481,2700],[476,2707],[464,2700],[458,2715],[439,2713],[437,2689],[424,2681],[428,2642],[444,2632],[441,2617],[419,2618],[447,2600],[461,2620],[476,2591],[462,2587],[461,2568]],[[1231,2286],[1222,2297],[1231,2297]],[[1212,2281],[1208,2292],[1215,2296]],[[1858,2251],[1831,2278],[1845,2284],[1841,2272],[1860,2265],[1866,2271],[1873,2258],[1867,2259]],[[1383,2256],[1369,2267],[1376,2280],[1402,2270]],[[1228,2256],[1193,2265],[1190,2278],[1237,2265]],[[263,2710],[250,2721],[252,2731],[234,2735],[252,2744],[266,2725]],[[163,2574],[159,2579],[158,2607],[146,2616],[120,2596],[101,2600],[144,2628],[137,2641],[113,2635],[116,2654],[88,2668],[88,2686],[101,2690],[117,2667],[128,2665],[120,2668],[130,2675],[127,2683],[113,2684],[113,2703],[128,2707],[135,2697],[139,2723],[128,2728],[127,2740],[150,2712],[167,2719],[181,2699],[138,2697],[150,2671],[133,2666],[152,2643],[146,2622],[164,2604]],[[832,2618],[827,2626],[822,2620],[815,2628],[825,2635],[829,2627],[824,2654],[807,2653],[822,2659],[818,2673],[827,2673],[851,2655],[851,2640],[842,2639]],[[348,2715],[345,2729],[354,2732]],[[504,2718],[487,2719],[495,2727]],[[188,2704],[181,2723],[187,2716],[186,2724],[200,2725],[198,2707],[195,2713]],[[802,2631],[802,2645],[814,2648]],[[86,2712],[81,2722],[90,2718]],[[883,2629],[886,2638],[893,2632]],[[312,2691],[314,2708],[323,2712],[328,2700]],[[230,2701],[227,2707],[239,2707]],[[857,2626],[848,2630],[855,2634]],[[206,2649],[208,2667],[219,2663],[223,2670],[217,2665],[212,2675],[221,2689],[209,2688],[211,2705],[232,2690],[233,2663],[246,2671],[231,2654],[214,2659]],[[296,2650],[279,2660],[285,2664],[277,2661],[253,2686],[279,2690],[288,2703],[288,2680],[306,2686],[313,2660]],[[15,2694],[19,2702],[27,2695]],[[236,2690],[229,2695],[249,2699]],[[204,2664],[196,2667],[199,2679],[191,2675],[191,2696],[209,2685],[208,2667],[206,2679]],[[1,2678],[2,2691],[12,2691]],[[1081,2608],[1060,2613],[1074,2619],[1070,2629]],[[604,2609],[569,2635],[570,2643],[569,2653],[545,2647],[542,2660],[527,2660],[525,2673],[511,2672],[521,2687],[532,2684],[536,2670],[570,2664],[591,2646],[605,2654],[623,2643],[627,2652],[642,2647],[641,2630],[619,2635],[621,2615]],[[871,2595],[878,2620],[879,2602]],[[460,2655],[452,2676],[463,2682],[472,2668]],[[488,2650],[491,2661],[478,2672],[486,2678],[494,2666]],[[22,2656],[13,2658],[18,2677]],[[925,2605],[916,2612],[931,2611]],[[958,2595],[952,2597],[948,2605]],[[164,2651],[166,2669],[176,2660]],[[879,2581],[874,2592],[886,2585]],[[515,2645],[507,2646],[513,2652],[506,2660],[515,2664]],[[943,2569],[935,2578],[942,2586]],[[960,2542],[936,2553],[934,2572],[937,2562],[962,2568]],[[520,2634],[510,2635],[518,2638]],[[18,2585],[-2,2635],[10,2637],[32,2607],[32,2593]],[[44,2624],[36,2636],[49,2633]],[[515,2618],[520,2634],[527,2624]],[[-23,2615],[-22,2633],[-16,2622]],[[22,2623],[24,2632],[31,2627]],[[977,2552],[971,2555],[979,2567],[991,2559]],[[489,2616],[482,2617],[487,2628]],[[702,2586],[689,2600],[700,2600],[701,2608],[690,2616],[691,2627],[711,2608],[702,2606],[705,2596]],[[921,2538],[903,2563],[910,2565]],[[66,2597],[48,2615],[60,2614]],[[527,2499],[500,2509],[510,2517],[504,2524],[516,2549],[501,2553],[515,2567],[507,2585],[535,2599],[525,2599],[527,2612],[551,2593],[554,2604],[553,2596],[568,2589],[579,2597],[588,2585],[560,2585],[561,2566],[540,2559],[524,2572],[536,2538],[532,2524],[516,2516]],[[179,2592],[183,2609],[197,2608],[204,2597],[186,2605]],[[-38,2596],[-43,2603],[-30,2609]],[[502,2598],[505,2606],[513,2603]],[[1002,2508],[1006,2526],[1031,2540],[1037,2555],[1032,2533],[1008,2522]],[[843,2524],[837,2529],[844,2532]],[[653,2577],[629,2603],[653,2593]],[[935,2510],[922,2522],[931,2522]],[[-43,2559],[-32,2585],[-38,2596],[-29,2590],[-31,2578],[-17,2572]],[[885,2509],[873,2520],[888,2517]],[[74,2538],[75,2590],[83,2588],[76,2570],[84,2553]],[[325,2573],[322,2587],[334,2587],[329,2580],[337,2575]],[[658,2563],[655,2576],[675,2581]],[[198,2523],[191,2543],[181,2535],[184,2580],[200,2569],[210,2543]],[[323,2570],[326,2551],[338,2554],[334,2549],[317,2549]],[[160,2570],[173,2556],[163,2556]],[[661,2535],[663,2544],[634,2557],[622,2546],[620,2554],[583,2555],[585,2564],[610,2557],[635,2563],[640,2556],[644,2566],[652,2556],[678,2552],[666,2542],[682,2540]],[[911,2503],[903,2504],[902,2519]],[[1038,2498],[1035,2514],[1050,2511],[1054,2503]],[[843,2475],[844,2475],[871,2480],[875,2472],[850,2472],[861,2469],[850,2451],[864,2435],[838,2427],[829,2423],[824,2427],[832,2429],[822,2432],[832,2430],[846,2457],[832,2454],[833,2472],[810,2473],[805,2503],[834,2473]],[[277,2516],[266,2518],[274,2544],[286,2552]],[[568,2542],[581,2551],[580,2543]],[[712,2487],[725,2523],[725,2550],[729,2540],[741,2542],[728,2529],[740,2517]],[[-29,2533],[-23,2538],[-34,2541],[-19,2547],[-13,2537]],[[551,2536],[536,2538],[540,2546]],[[1045,2467],[1023,2494],[1044,2494],[1045,2485],[1056,2498],[1077,2492],[1074,2480],[1055,2485],[1058,2469]],[[611,2536],[605,2540],[619,2544]],[[664,2530],[639,2531],[644,2539]],[[575,2509],[575,2517],[559,2520],[566,2522],[561,2531],[596,2516],[580,2517]],[[449,2511],[460,2526],[460,2517]],[[250,2499],[240,2516],[259,2525],[258,2503],[250,2509]],[[623,2514],[613,2518],[612,2525],[623,2523]],[[12,2467],[4,2484],[-4,2484],[-4,2471],[-11,2481],[4,2492],[-9,2517],[4,2513],[6,2501],[8,2519],[21,2513],[21,2484],[11,2483],[20,2476]],[[454,2448],[435,2461],[423,2491],[408,2502],[409,2516],[434,2511],[438,2500],[444,2505],[441,2465]],[[-56,2481],[-51,2513],[-42,2508]],[[614,2492],[618,2504],[641,2510],[654,2502],[639,2501],[641,2493],[630,2501]],[[572,2494],[576,2504],[585,2498]],[[547,2491],[541,2493],[549,2498]],[[693,2487],[701,2495],[704,2488]],[[507,2479],[509,2492],[514,2487]],[[1008,2475],[1003,2479],[1019,2488]],[[653,2355],[648,2368],[660,2404],[642,2440],[671,2464],[691,2467],[712,2487],[707,2469],[715,2454],[697,2469],[684,2450],[697,2434],[671,2448]],[[340,2459],[353,2487],[352,2466]],[[951,2474],[939,2478],[947,2487]],[[559,2476],[555,2481],[561,2485]],[[595,2469],[593,2482],[602,2481],[605,2474]],[[99,2337],[78,2346],[78,2359],[96,2367],[98,2378],[72,2389],[67,2377],[59,2382],[61,2404],[56,2396],[45,2408],[31,2389],[43,2407],[35,2414],[44,2419],[38,2427],[50,2430],[24,2481],[44,2472],[54,2437],[70,2433],[73,2414],[62,2411],[64,2404],[79,2401],[81,2410],[93,2399],[98,2408],[123,2400],[115,2367],[105,2364],[113,2345],[114,2338],[111,2344]],[[945,2467],[931,2472],[930,2481],[939,2478]],[[1074,2468],[1065,2472],[1074,2479]],[[196,2477],[188,2478],[210,2478]],[[802,2466],[794,2475],[800,2474]],[[619,2471],[613,2474],[626,2475]],[[109,2439],[122,2454],[149,2448],[154,2461],[194,2474],[197,2465],[185,2460],[195,2450]],[[631,2464],[630,2472],[639,2469]],[[969,2455],[957,2470],[982,2466],[972,2442],[965,2442]],[[422,2460],[417,2470],[430,2463]],[[313,2433],[294,2445],[311,2450],[323,2469],[335,2457],[331,2446]],[[397,2468],[414,2461],[394,2461]],[[1076,2453],[1081,2460],[1091,2462],[1103,2446],[1108,2451],[1110,2441],[1092,2441]],[[693,2444],[694,2453],[701,2450]],[[910,2434],[898,2440],[911,2450]],[[777,2436],[779,2450],[789,2446]],[[1073,2431],[1072,2449],[1082,2438]],[[377,2369],[384,2387],[371,2389],[382,2406],[371,2408],[367,2421],[398,2422],[418,2444],[448,2448],[424,2431],[437,2426],[431,2412],[450,2400],[396,2385],[396,2377],[387,2385],[392,2370]],[[1033,2408],[1056,2445],[1046,2418]],[[452,2414],[443,2415],[445,2428],[465,2443],[478,2436],[459,2432]],[[866,2356],[861,2368],[876,2374],[861,2400],[865,2409],[856,2411],[870,2440],[892,2395],[931,2386],[935,2399],[945,2398],[928,2379],[930,2369],[925,2379],[911,2372],[901,2384],[903,2377],[893,2375],[884,2379],[874,2365],[880,2354],[872,2349],[883,2340],[856,2340]],[[816,2424],[798,2425],[795,2434],[814,2438]],[[515,2428],[490,2430],[511,2437],[509,2431]],[[960,2422],[954,2425],[962,2436],[970,2423]],[[693,2428],[698,2433],[707,2431]],[[746,2417],[735,2418],[744,2424],[752,2420]],[[697,2403],[699,2413],[709,2408]],[[486,2386],[493,2410],[504,2392]],[[767,2399],[758,2401],[757,2407]],[[857,2395],[846,2403],[855,2404]],[[273,2359],[254,2376],[265,2380],[266,2394],[276,2394]],[[520,2362],[503,2360],[513,2394],[542,2370],[532,2371],[541,2366],[527,2347],[517,2347]],[[837,2379],[823,2382],[825,2394]],[[1051,2352],[1041,2362],[1060,2388],[1065,2380],[1061,2367],[1049,2364],[1057,2354]],[[950,2369],[949,2375],[993,2380]],[[844,2355],[841,2376],[859,2369]],[[561,2355],[544,2366],[545,2375],[561,2370]],[[317,2350],[311,2352],[319,2373],[342,2360]],[[1446,1848],[1436,1846],[1441,1861],[1451,1859],[1442,1871],[1437,1858],[1427,1866],[1424,1852],[1403,1846],[1401,1833],[1399,1841],[1367,1839],[1363,1825],[1363,1846],[1343,1842],[1348,1851],[1338,1864],[1350,1854],[1367,1863],[1371,1896],[1360,1904],[1368,1915],[1354,1925],[1344,1919],[1344,1939],[1331,1953],[1344,1962],[1338,1973],[1350,1988],[1358,1976],[1349,2007],[1360,2011],[1359,2020],[1334,2021],[1320,2010],[1324,2025],[1315,2015],[1288,2032],[1300,2080],[1267,2116],[1251,2118],[1253,2096],[1232,2097],[1231,2110],[1212,2115],[1199,2134],[1200,2152],[1182,2155],[1177,2146],[1146,2183],[1115,2179],[1058,2155],[1060,2149],[1034,2165],[1032,2154],[1032,2169],[994,2163],[994,2146],[1028,2135],[1032,2148],[1038,2124],[1051,2114],[1039,2096],[1042,2082],[1031,2085],[1050,2061],[1048,2045],[1009,2068],[1020,2106],[1014,2102],[1018,2112],[1008,2115],[1008,2125],[998,2121],[999,2093],[986,2077],[999,2074],[984,2062],[976,2030],[986,2020],[982,1991],[968,1996],[984,1962],[976,1960],[981,1927],[972,1931],[939,1909],[931,1878],[938,1869],[925,1874],[905,1864],[926,1881],[934,1913],[963,1933],[971,1951],[962,1977],[935,1986],[928,1999],[936,2016],[972,2040],[983,2091],[996,2103],[968,2132],[964,2153],[982,2175],[976,2199],[939,2240],[917,2231],[911,2238],[907,2230],[914,2249],[919,2242],[938,2248],[918,2272],[913,2266],[908,2304],[888,2315],[907,2326],[912,2320],[898,2314],[905,2309],[950,2313],[936,2265],[943,2247],[966,2268],[989,2315],[987,2329],[951,2356],[950,2368],[994,2332],[1001,2319],[949,2236],[977,2215],[993,2176],[995,2182],[1063,2165],[1086,2169],[1104,2197],[1127,2209],[1131,2196],[1153,2190],[1160,2176],[1170,2205],[1182,2210],[1161,2212],[1167,2241],[1144,2237],[1128,2256],[1140,2246],[1166,2245],[1174,2268],[1200,2257],[1206,2235],[1210,2249],[1211,2236],[1220,2242],[1217,2234],[1230,2239],[1242,2232],[1257,2253],[1251,2292],[1240,2301],[1298,2297],[1345,2309],[1343,2298],[1361,2299],[1350,2288],[1332,2300],[1325,2293],[1326,2302],[1300,2290],[1282,2265],[1272,2276],[1261,2271],[1267,2258],[1257,2233],[1270,2225],[1245,2214],[1247,2203],[1225,2195],[1225,2205],[1210,2194],[1196,2204],[1181,2192],[1186,2182],[1245,2189],[1252,2173],[1271,2207],[1279,2205],[1272,2217],[1284,2210],[1293,2216],[1297,2229],[1287,2236],[1311,2245],[1304,2250],[1318,2259],[1316,2270],[1339,2261],[1321,2258],[1329,2251],[1346,2257],[1363,2247],[1369,2219],[1352,2217],[1329,2243],[1337,2250],[1316,2249],[1315,2227],[1330,2228],[1274,2176],[1258,2147],[1263,2138],[1271,2143],[1266,2134],[1295,2096],[1307,2093],[1322,2105],[1321,2087],[1313,2085],[1361,2070],[1376,2090],[1388,2081],[1378,2070],[1383,2061],[1364,2068],[1346,2046],[1348,2063],[1335,2059],[1340,2039],[1370,2049],[1354,2033],[1393,1965],[1404,1962],[1410,1971],[1429,1953],[1442,1954],[1461,1929],[1415,1932],[1468,1896],[1464,1877],[1474,1849],[1479,1858],[1467,1832],[1455,1849]],[[789,2349],[785,2362],[797,2351]],[[492,2350],[479,2356],[492,2360]],[[458,2340],[451,2359],[472,2346]],[[305,2348],[300,2354],[310,2352]],[[1045,2342],[1035,2346],[1051,2352]],[[306,2331],[304,2342],[314,2343]],[[300,2319],[289,2342],[306,2331]],[[312,2285],[300,2298],[303,2310],[268,2309],[271,2289],[250,2290],[252,2307],[185,2307],[208,2311],[220,2338],[230,2341],[231,2320],[254,2308],[275,2325],[295,2314],[300,2319],[319,2297],[324,2309],[324,2293]],[[650,2319],[639,2341],[651,2332]],[[1053,2332],[1047,2337],[1066,2339]],[[390,2274],[376,2295],[379,2306],[398,2306],[403,2326],[417,2337],[414,2329],[434,2314],[420,2313],[432,2303],[424,2291],[382,2301],[400,2285]],[[1095,2311],[1057,2322],[1033,2313],[1053,2331],[1070,2327],[1072,2334],[1074,2322]],[[678,2318],[675,2334],[684,2329]],[[816,2297],[786,2303],[779,2330],[814,2310]],[[102,2318],[97,2328],[110,2321]],[[338,1903],[359,1912],[360,1905]],[[122,2307],[119,2316],[165,2326],[171,2312],[147,2310]],[[564,2305],[535,2308],[539,2323]],[[-8,2304],[-17,2318],[3,2323]],[[458,2287],[451,2295],[469,2304],[454,2310],[478,2319],[501,2301],[518,2302],[502,2290],[477,2300]],[[446,2303],[442,2312],[445,2318]],[[62,2294],[23,2298],[41,2301],[35,2311],[50,2316],[59,2298],[75,2316],[90,2304]],[[404,2052],[386,2050],[394,2018],[379,2012],[374,2026],[363,2018],[323,2024],[313,2001],[312,2014],[299,2021],[301,2035],[329,2049],[330,2060],[312,2068],[308,2112],[269,2107],[260,2098],[251,2104],[258,2144],[301,2130],[337,2106],[345,2038],[377,2030],[385,2049],[377,2062],[367,2061],[348,2109],[367,2102],[372,2079],[382,2083],[357,2120],[365,2156],[380,2130],[387,2085],[446,2078],[456,2088],[467,2070],[511,2097],[495,2105],[515,2119],[486,2112],[470,2122],[457,2107],[437,2115],[433,2137],[420,2142],[425,2161],[412,2165],[431,2177],[427,2158],[437,2139],[449,2131],[457,2148],[467,2139],[462,2132],[472,2134],[487,2146],[480,2170],[467,2171],[457,2149],[443,2144],[440,2157],[429,2160],[473,2175],[473,2201],[504,2179],[531,2187],[536,2169],[545,2167],[551,2145],[541,2081],[593,2081],[563,2080],[558,2071],[570,2052],[550,2042],[584,2048],[562,2029],[588,1995],[598,1986],[603,1997],[621,1998],[624,2007],[614,2016],[627,2023],[627,2036],[636,2011],[651,2009],[654,2033],[674,2039],[667,2076],[646,2060],[639,2080],[616,2082],[627,2091],[641,2115],[670,2117],[675,2139],[662,2144],[678,2154],[671,2157],[678,2170],[663,2173],[654,2154],[656,2179],[642,2199],[655,2206],[635,2218],[635,2225],[647,2222],[645,2233],[625,2235],[641,2240],[621,2254],[630,2256],[630,2267],[640,2253],[631,2284],[637,2290],[612,2283],[610,2292],[585,2301],[581,2314],[597,2314],[605,2296],[629,2291],[649,2313],[649,2299],[666,2287],[679,2287],[682,2306],[685,2290],[695,2297],[699,2289],[708,2303],[710,2287],[700,2288],[697,2277],[683,2286],[667,2281],[672,2263],[665,2271],[650,2249],[656,2232],[662,2251],[671,2246],[671,2229],[683,2246],[690,2238],[679,2222],[683,2206],[700,2221],[713,2212],[721,2224],[740,2225],[736,2214],[747,2206],[753,2216],[749,2198],[723,2189],[716,2161],[704,2164],[743,2123],[740,2116],[714,2135],[698,2165],[695,2140],[674,2129],[673,2114],[690,2111],[692,2090],[699,2099],[721,2096],[740,2112],[745,2093],[736,2087],[745,2085],[744,2074],[779,2049],[749,2032],[748,2020],[735,2021],[742,2027],[732,2032],[748,2037],[741,2055],[749,2059],[755,2050],[753,2062],[734,2065],[726,2015],[690,2017],[696,2028],[689,2022],[683,2029],[689,2038],[677,2023],[702,1977],[718,1983],[712,1971],[723,1965],[712,1959],[740,1949],[735,1941],[753,1929],[771,1889],[756,1897],[711,1865],[728,1847],[723,1841],[712,1858],[687,1848],[690,1859],[680,1866],[693,1879],[700,1909],[732,1924],[703,1927],[688,1941],[671,1931],[662,1941],[658,1933],[650,1949],[658,1911],[648,1912],[654,1904],[642,1886],[630,1885],[635,1905],[624,1931],[641,1954],[624,1960],[604,1941],[592,1946],[594,1959],[587,1945],[611,1923],[601,1927],[581,1910],[597,1908],[602,1887],[592,1878],[605,1878],[608,1867],[599,1864],[608,1846],[584,1848],[597,1828],[590,1822],[571,1830],[565,1822],[553,1837],[543,1804],[547,1772],[566,1793],[570,1734],[582,1731],[588,1736],[597,1717],[589,1689],[603,1703],[634,1700],[644,1735],[668,1723],[655,1711],[658,1676],[645,1675],[652,1683],[646,1692],[633,1676],[645,1668],[629,1652],[615,1678],[601,1671],[603,1657],[613,1650],[619,1656],[642,1622],[637,1610],[654,1612],[652,1593],[680,1591],[661,1573],[629,1566],[662,1550],[698,1555],[684,1571],[675,1568],[677,1579],[706,1577],[713,1566],[716,1576],[743,1576],[739,1557],[700,1555],[699,1548],[708,1546],[714,1526],[723,1525],[725,1540],[723,1517],[731,1519],[736,1506],[748,1516],[756,1500],[740,1490],[742,1476],[713,1474],[705,1454],[671,1433],[686,1429],[691,1388],[659,1387],[657,1372],[648,1392],[658,1402],[649,1415],[665,1421],[642,1438],[635,1430],[632,1449],[618,1455],[629,1455],[615,1460],[640,1457],[639,1483],[631,1484],[638,1497],[629,1511],[615,1504],[598,1519],[602,1524],[592,1523],[586,1507],[583,1518],[577,1511],[578,1529],[563,1525],[581,1547],[568,1561],[539,1530],[559,1565],[544,1565],[528,1580],[517,1569],[490,1591],[543,1594],[575,1611],[561,1620],[562,1671],[548,1691],[548,1700],[562,1704],[546,1717],[515,1708],[525,1715],[538,1758],[521,1753],[516,1741],[508,1745],[532,1785],[530,1799],[518,1796],[518,1809],[532,1803],[515,1815],[487,1821],[459,1807],[442,1782],[442,1780],[434,1758],[436,1771],[423,1780],[434,1804],[421,1817],[432,1816],[439,1828],[422,1831],[440,1830],[446,1846],[444,1828],[483,1822],[505,1845],[504,1861],[492,1868],[481,1861],[489,1870],[463,1886],[446,1892],[442,1885],[458,1866],[449,1855],[448,1858],[448,1855],[444,1861],[446,1865],[442,1881],[425,1875],[421,1890],[395,1898],[382,1881],[386,1867],[373,1859],[365,1901],[376,1908],[353,1938],[337,1933],[347,1923],[326,1927],[335,1900],[323,1924],[308,1932],[294,1927],[302,1902],[280,1904],[286,1912],[275,1914],[273,1928],[252,1905],[264,1900],[237,1898],[236,1889],[224,1900],[239,1900],[246,1919],[270,1932],[254,1954],[267,1948],[284,1972],[276,1977],[277,1965],[264,1968],[274,1983],[258,1995],[277,1993],[283,2004],[279,1986],[323,1941],[335,1947],[338,1959],[354,1957],[368,1986],[355,1957],[370,1959],[363,1971],[373,1971],[372,1959],[378,1960],[372,1952],[380,1930],[430,1897],[437,1920],[402,1925],[406,1941],[386,1969],[380,1962],[375,1982],[430,1953],[456,1964],[431,2010],[423,2003],[396,2018],[425,2031],[431,2011],[448,2019],[450,2008],[465,2004],[475,2010],[471,2023],[445,2036],[452,2038],[439,2058]],[[665,2291],[660,2306],[670,2311]],[[-37,2281],[-35,2309],[-20,2299],[-11,2306],[-12,2282]],[[569,2296],[564,2305],[578,2301]],[[822,2149],[803,2152],[806,2170],[793,2166],[794,2157],[787,2170],[775,2161],[765,2163],[759,2153],[766,2185],[760,2195],[771,2200],[774,2184],[819,2278],[819,2296],[833,2298],[846,2270],[830,2283],[839,2252],[832,2247],[862,2218],[842,2219],[842,2230],[837,2217],[826,2225],[818,2213],[793,2216],[793,2187],[811,2177],[811,2154]],[[1048,2286],[1034,2292],[1039,2297]],[[754,2281],[759,2290],[750,2294],[779,2292],[766,2283]],[[44,2265],[44,2292],[76,2281],[64,2268],[62,2279],[48,2276]],[[1091,2272],[1087,2287],[1095,2287]],[[1077,2231],[1073,2249],[1081,2257],[1072,2261],[1062,2248],[1068,2235],[1048,2238],[1044,2256],[1031,2248],[1022,2260],[1033,2273],[1044,2265],[1055,2287],[1054,2271],[1068,2268],[1070,2280],[1077,2262],[1087,2260],[1084,2236]],[[266,2266],[258,2268],[272,2287]],[[570,2234],[540,2243],[547,2252],[535,2263],[518,2258],[497,2280],[524,2275],[534,2281],[604,2256]],[[247,1895],[256,1885],[243,1885]],[[1115,2144],[1084,2160],[1096,2163]],[[79,2262],[81,2276],[88,2275]],[[1340,2005],[1330,2010],[1333,2018]],[[356,2252],[346,2273],[366,2257]],[[1762,2267],[1755,2272],[1764,2273]],[[1162,2109],[1152,2111],[1153,2124],[1166,2131]],[[1218,2095],[1185,2111],[1212,2113]],[[474,2250],[460,2255],[448,2270]],[[716,2249],[701,2256],[699,2267],[709,2269],[720,2256]],[[1065,2094],[1063,2107],[1071,2100]],[[1930,2165],[1928,2193],[1914,2194],[1911,2205],[1923,2199],[1915,2215],[1905,2197],[1888,2198],[1892,2212],[1874,2216],[1886,2216],[1892,2231],[1880,2231],[1868,2249],[1883,2268],[1892,2265],[1886,2244],[1893,2237],[1897,2258],[1909,2255],[1906,2237],[1916,2233],[1932,2213],[1945,2211],[1947,2193],[1938,2191],[1948,2190],[1931,2180],[1951,2172]],[[1139,2090],[1128,2094],[1143,2097]],[[1110,2252],[1123,2260],[1099,2259],[1121,2267],[1127,2257]],[[274,2254],[266,2266],[274,2265]],[[452,2205],[399,2216],[412,2224],[398,2236],[409,2261],[421,2258],[433,2237],[423,2239],[422,2219],[429,2226],[449,2219]],[[317,2172],[330,2202],[328,2228],[295,2239],[286,2260],[312,2241],[328,2243],[337,2222],[332,2191]],[[1088,2056],[1082,2064],[1099,2068],[1095,2079],[1105,2088],[1118,2080],[1103,2077],[1106,2066]],[[1077,2080],[1070,2084],[1080,2087]],[[374,2247],[366,2257],[378,2252]],[[1224,2016],[1227,2028],[1221,2018],[1207,2032],[1208,2042],[1222,2040],[1218,2050],[1218,2042],[1211,2044],[1217,2053],[1203,2065],[1216,2079],[1216,2067],[1227,2066],[1223,2033],[1238,2034],[1240,2024]],[[1132,2054],[1117,2072],[1136,2074],[1145,2062]],[[1409,2217],[1392,2235],[1397,2250],[1413,2241],[1418,2251],[1432,2231],[1440,2238],[1441,2225],[1422,2232]],[[1198,2044],[1199,2053],[1204,2047]],[[1139,2038],[1132,2042],[1138,2047]],[[1118,1997],[1110,2034],[1118,2038],[1138,1999]],[[466,2241],[457,2242],[476,2249]],[[2010,2218],[1976,2233],[1972,2247]],[[1089,2022],[1075,2027],[1093,2028]],[[1113,2208],[1122,2232],[1112,2246],[1124,2245],[1127,2217]],[[1029,2019],[1035,2023],[1037,2022]],[[1274,2013],[1286,2021],[1287,2014]],[[1770,2195],[1758,2205],[1770,2214],[1760,2240],[1769,2234],[1790,2206],[1774,2210]],[[1032,2001],[1043,2013],[1053,2009]],[[1140,1984],[1141,1996],[1155,1990]],[[468,2230],[457,2237],[476,2236]],[[616,2230],[615,2237],[622,2233]],[[67,2177],[27,2207],[17,2201],[34,2234],[49,2214],[95,2216],[82,2190],[68,2202]],[[1307,1969],[1296,1981],[1304,1991],[1313,1985]],[[1661,2207],[1657,2222],[1667,2226]],[[1015,1910],[983,1926],[1002,1926],[997,1922]],[[1131,1916],[1125,1917],[1132,1926]],[[1119,1917],[1103,1920],[1120,1923]],[[1454,2201],[1435,2212],[1443,2221],[1457,2216]],[[219,2202],[214,2219],[234,2220],[233,2204],[222,2209]],[[1030,1890],[1026,1907],[1040,1892]],[[1302,1566],[1301,1560],[1283,1588],[1254,1589],[1264,1618],[1257,1627],[1299,1642],[1292,1675],[1276,1677],[1281,1664],[1274,1663],[1260,1685],[1274,1700],[1285,1684],[1299,1690],[1291,1705],[1299,1712],[1288,1715],[1285,1729],[1254,1724],[1263,1735],[1276,1731],[1278,1739],[1264,1741],[1278,1751],[1262,1756],[1264,1768],[1253,1768],[1223,1799],[1201,1808],[1179,1800],[1153,1814],[1175,1818],[1167,1829],[1180,1836],[1189,1825],[1201,1837],[1196,1844],[1209,1847],[1210,1860],[1188,1872],[1186,1890],[1206,1906],[1204,1894],[1223,1889],[1216,1858],[1235,1864],[1244,1899],[1256,1900],[1250,1888],[1260,1874],[1241,1869],[1227,1840],[1237,1837],[1232,1831],[1244,1838],[1257,1831],[1256,1818],[1269,1828],[1282,1825],[1254,1804],[1280,1768],[1297,1776],[1306,1769],[1308,1776],[1337,1746],[1357,1749],[1365,1769],[1374,1765],[1373,1756],[1365,1758],[1404,1725],[1422,1735],[1415,1754],[1440,1746],[1420,1770],[1441,1770],[1438,1800],[1457,1789],[1475,1793],[1480,1781],[1468,1774],[1485,1779],[1486,1767],[1500,1783],[1513,1762],[1542,1765],[1531,1740],[1554,1717],[1548,1689],[1519,1717],[1520,1734],[1496,1767],[1476,1762],[1491,1696],[1518,1676],[1511,1676],[1522,1652],[1530,1654],[1533,1633],[1534,1641],[1544,1639],[1534,1627],[1504,1659],[1497,1687],[1480,1686],[1489,1697],[1475,1710],[1469,1700],[1457,1702],[1461,1709],[1449,1703],[1433,1731],[1399,1703],[1403,1694],[1384,1692],[1362,1703],[1362,1692],[1377,1685],[1374,1681],[1366,1670],[1354,1684],[1341,1678],[1343,1663],[1332,1668],[1327,1650],[1336,1655],[1342,1644],[1340,1640],[1328,1644],[1329,1635],[1346,1629],[1330,1617],[1341,1607],[1341,1591],[1318,1615],[1309,1602],[1307,1614],[1305,1601],[1298,1616],[1285,1601],[1303,1571]],[[1104,1888],[1094,1890],[1098,1904]],[[866,2203],[860,2213],[868,2213]],[[1378,2186],[1367,2194],[1385,2213]],[[1034,2199],[1016,2212],[1039,2212]],[[848,2123],[829,2128],[822,2142],[833,2156],[827,2172],[836,2163],[843,2169],[836,2182],[845,2170],[857,2174],[855,2195],[884,2195],[880,2212],[885,2196],[898,2194],[884,2180],[881,2159],[863,2149],[864,2158],[852,2158],[855,2148],[842,2141],[852,2132],[841,2137],[834,2130]],[[1068,2200],[1060,2211],[1072,2209]],[[362,2164],[359,2210],[368,2196],[362,2197]],[[972,1890],[954,1897],[986,1903],[990,1893]],[[689,1925],[688,1932],[699,1926]],[[1341,2207],[1355,2198],[1343,2198]],[[929,2178],[913,2190],[921,2202],[925,2191],[937,2198]],[[1150,1836],[1107,1845],[1104,1836],[1105,1847],[1083,1863],[1083,1887],[1046,1900],[1088,1887],[1094,1860],[1111,1845]],[[1261,1869],[1274,1860],[1263,1860]],[[1030,1672],[1020,1678],[1025,1685],[1009,1686],[1015,1681],[1004,1676],[1008,1687],[995,1683],[1004,1703],[1001,1736],[993,1733],[1006,1748],[996,1764],[1012,1762],[1027,1780],[1011,1790],[1019,1804],[1027,1790],[1032,1810],[1025,1817],[1030,1831],[1020,1837],[1042,1841],[1045,1847],[1032,1852],[1052,1858],[1040,1862],[1052,1868],[1059,1850],[1070,1847],[1070,1829],[1061,1825],[1072,1817],[1057,1815],[1054,1796],[1033,1788],[1051,1762],[1077,1756],[1068,1750],[1049,1757],[1035,1774],[1035,1763],[1014,1763],[1019,1742],[1006,1722],[1007,1702],[1017,1687],[1031,1691],[1035,1678]],[[1823,2146],[1788,2190],[1791,2198],[1820,2179]],[[616,1841],[608,1846],[617,1851]],[[1339,2098],[1325,2116],[1338,2135],[1343,2126],[1355,2130],[1359,2157],[1372,2155],[1366,2173],[1353,2176],[1351,2193],[1376,2172],[1392,2175],[1389,2189],[1408,2186],[1408,2162],[1400,2167],[1392,2153],[1372,2148],[1403,2135],[1381,2129],[1370,2140],[1371,2123],[1333,2114],[1345,2101]],[[161,2181],[152,2184],[155,2193]],[[627,1818],[617,1840],[625,1842],[626,1833],[641,1843],[649,1837],[627,1827]],[[507,1778],[495,1792],[502,1796],[510,1786],[516,1794],[519,1784]],[[484,1785],[477,1789],[483,1794]],[[454,1772],[447,1778],[453,1783],[442,1780],[460,1791]],[[481,1751],[471,1772],[485,1771],[493,1775],[504,1762],[490,1765]],[[502,1742],[496,1747],[488,1756],[496,1759]],[[210,2139],[207,2168],[216,2179]],[[1424,1700],[1413,1707],[1424,1709]],[[392,2136],[378,2147],[389,2152],[384,2172],[403,2176],[411,2158],[403,2163],[405,2142]],[[1456,1671],[1469,1699],[1471,1675]],[[323,2149],[310,2159],[316,2170]],[[1763,2155],[1742,2158],[1756,2168]],[[924,2152],[912,2168],[932,2156]],[[630,2160],[621,2166],[629,2168]],[[2142,2098],[2122,2110],[2114,2107],[2107,2154],[2116,2154],[2117,2145],[2122,2155],[2142,2149],[2152,2164],[2153,2155],[2184,2152],[2175,2140],[2182,2132]],[[107,2151],[108,2160],[128,2164]],[[-55,2140],[-60,2153],[-49,2163],[-47,2144]],[[1490,1668],[1487,1676],[1495,1678]],[[1936,2121],[1920,2125],[1921,2141],[1935,2148],[1931,2161],[1948,2159],[1972,2137]],[[1410,1664],[1395,1670],[1409,1672]],[[1362,1636],[1369,1649],[1371,1641],[1391,1639],[1383,1632],[1371,1634],[1366,1627],[1353,1634],[1356,1647]],[[1403,667],[1396,682],[1382,671],[1368,677],[1343,670],[1354,681],[1340,703],[1353,687],[1368,685],[1336,718],[1316,725],[1305,741],[1270,736],[1248,747],[1249,773],[1260,788],[1277,771],[1288,782],[1278,778],[1280,785],[1297,786],[1293,804],[1268,806],[1280,808],[1291,825],[1276,833],[1279,859],[1268,849],[1272,856],[1245,850],[1244,864],[1228,861],[1227,879],[1220,874],[1222,895],[1201,897],[1200,908],[1224,913],[1237,930],[1248,917],[1237,907],[1259,908],[1279,934],[1266,939],[1265,952],[1275,947],[1293,956],[1300,924],[1308,927],[1305,939],[1318,934],[1317,946],[1308,947],[1315,955],[1316,953],[1316,956],[1335,970],[1333,979],[1325,969],[1331,1002],[1320,1017],[1335,1013],[1346,1035],[1348,1009],[1358,1008],[1343,989],[1356,988],[1361,917],[1418,857],[1434,863],[1439,839],[1432,843],[1455,814],[1466,819],[1464,802],[1480,783],[1498,773],[1533,810],[1543,790],[1557,787],[1548,779],[1563,774],[1547,774],[1542,745],[1532,751],[1500,734],[1497,715],[1488,713],[1494,695],[1481,715],[1473,705],[1453,725],[1422,718],[1417,706],[1405,714],[1402,704],[1415,698],[1406,682],[1418,683],[1412,670],[1405,676]],[[2761,2314],[2757,2324],[2771,2325]],[[634,2129],[624,2148],[635,2138]],[[2757,2220],[2750,2227],[2760,2229]],[[2847,2203],[2849,2219],[2856,2209]],[[173,1974],[137,1993],[139,2004],[119,2025],[109,2060],[125,2077],[123,2081],[148,2086],[159,2073],[178,2078],[178,2105],[128,2117],[145,2141],[164,2117],[179,2116],[190,2081],[205,2086],[215,2054],[190,2068],[177,2054],[181,2033],[168,2045],[152,2030],[152,2029],[155,2013],[197,1999]],[[2288,2104],[2255,2118],[2260,2136],[2276,2141],[2283,2134]],[[2751,2209],[2752,2217],[2758,2210]],[[797,2133],[809,2133],[812,2124],[800,2124]],[[938,2101],[934,2121],[939,2126],[946,2118],[949,2131],[964,2131]],[[871,2120],[866,2126],[876,2128]],[[636,2119],[626,2123],[634,2128]],[[2637,2205],[2640,2214],[2645,2210]],[[1766,2107],[1746,2109],[1775,2126],[1791,2108]],[[2018,2107],[2007,2116],[2012,2125]],[[2083,2112],[2075,2118],[2087,2125]],[[761,2080],[752,2091],[759,2107],[748,2109],[775,2124],[764,2104],[777,2098],[775,2081]],[[114,2102],[97,2105],[97,2112],[123,2120]],[[2449,1651],[2439,1652],[2413,1686],[2405,1699],[2413,1705],[2402,1704],[2406,1717],[2398,1713],[2401,1727],[2384,1735],[2389,1752],[2360,1769],[2383,1763],[2391,1780],[2406,1769],[2425,1775],[2423,1755],[2439,1758],[2458,1730],[2440,1727],[2435,1716],[2443,1708],[2425,1706]],[[-8,2073],[-35,2076],[-28,2095],[-43,2103],[-28,2114],[-27,2097],[-19,2103],[-2,2082]],[[1401,2095],[1389,2108],[1406,2114]],[[2849,2195],[2862,2209],[2864,2202]],[[1733,2101],[1724,2110],[1731,2112]],[[2628,1718],[2628,1729],[2638,1735],[2650,1719]],[[581,2082],[574,2090],[563,2085],[584,2101],[582,2108],[592,2108],[592,2086],[584,2093]],[[2649,2131],[2667,2150],[2675,2132]],[[2335,2054],[2303,2062],[2305,2103],[2326,2068],[2343,2068]],[[2704,1612],[2704,1627],[2692,1624],[2698,1636],[2681,1636],[2686,1659],[2660,1659],[2665,1683],[2642,1675],[2632,1683],[2650,1719],[2660,1697],[2676,1692],[2678,1669],[2696,1662],[2718,1634],[2721,1625]],[[821,2059],[820,2076],[850,2085],[851,2100],[855,2090],[862,2095],[858,2064]],[[2875,2064],[2865,2065],[2872,2084],[2877,2077]],[[108,2078],[90,2080],[91,2096],[92,2090],[106,2098],[115,2086]],[[2880,2060],[2879,2075],[2886,2065]],[[2848,2057],[2842,2068],[2862,2073]],[[2144,2079],[2143,2093],[2158,2081]],[[787,2082],[796,2093],[799,2087]],[[3032,2062],[3028,2069],[3036,2065]],[[3023,2055],[3020,2062],[3032,2062]],[[2562,2018],[2553,2054],[2564,2041],[2572,2034]],[[3077,2035],[3066,2044],[3079,2045]],[[2970,2027],[2961,2036],[2969,2038]],[[598,2058],[596,2068],[616,2082]],[[2605,2014],[2597,2015],[2612,2017]],[[592,2057],[570,2062],[572,2079],[581,2080]],[[2187,2063],[2196,2067],[2211,2042],[2183,2036],[2193,2061]],[[2833,1950],[2834,1958],[2840,1953]],[[2652,1911],[2648,1917],[2656,1920]],[[906,2046],[899,2056],[916,2066]],[[2884,1882],[2874,1885],[2870,1890]],[[845,2039],[826,2049],[853,2057]],[[1390,2043],[1370,2049],[1377,2054]],[[596,2045],[584,2048],[596,2052]],[[2403,2006],[2393,2017],[2395,2030],[2386,2027],[2401,2051],[2420,2009]],[[2919,1764],[2916,1785],[2929,1782],[2934,1792],[2942,1778],[2947,1784],[2955,1777]],[[2918,1724],[2912,1730],[2913,1748],[2919,1739],[2934,1747],[2928,1732],[2919,1736]],[[2343,2032],[2347,2042],[2357,2033]],[[785,2030],[776,2031],[780,2041]],[[806,2014],[790,2023],[800,2040],[811,2023]],[[2899,1648],[2882,1663],[2879,1691]],[[2349,1655],[2338,1671],[2352,1667]],[[1992,2016],[1993,2034],[2003,2029],[1998,2017]],[[603,2018],[591,2021],[594,2028]],[[-16,2001],[-31,2008],[-40,2027]],[[832,2013],[829,2026],[843,2021]],[[201,2014],[191,2022],[197,2025]],[[1459,2013],[1451,2022],[1461,2022]],[[3005,1648],[3001,1661],[3015,1668]],[[1377,2017],[1382,2008],[1375,2008]],[[2462,1606],[2456,1641],[2487,1640],[2472,1635],[2472,1611]],[[1998,2015],[2022,2005],[2000,2005]],[[2529,1609],[2503,1630],[2525,1627]],[[211,2003],[203,2013],[221,2007]],[[1873,2002],[1866,2013],[1871,2009]],[[831,1988],[815,2009],[832,2012]],[[710,1995],[706,2007],[713,2010]],[[2601,1417],[2576,1437],[2577,1456],[2546,1484],[2545,1502],[2486,1572],[2491,1585],[2476,1601],[2499,1588],[2519,1543],[2532,1535],[2544,1544],[2533,1531],[2556,1517],[2595,1443],[2609,1438],[2599,1431]],[[2031,1984],[2027,1998],[2042,1991]],[[1942,1936],[1892,1972],[1874,1964],[1877,1987],[1926,1996],[1926,1971]],[[40,1984],[32,1992],[38,1996]],[[2719,1574],[2712,1582],[2723,1592],[2722,1583],[2734,1582]],[[2782,1471],[2798,1502],[2781,1492],[2771,1499],[2807,1528],[2787,1544],[2767,1531],[2754,1542],[2765,1552],[2763,1565],[2746,1566],[2745,1580],[2754,1583],[2739,1589],[2761,1587],[2805,1543],[2825,1538],[2828,1553],[2851,1564],[2846,1576],[2863,1575],[2872,1564],[2863,1541],[2873,1518],[2894,1503],[2892,1493],[2889,1502],[2872,1505],[2874,1515],[2851,1513],[2823,1475],[2820,1505],[2801,1506],[2808,1496]],[[403,1977],[405,1995],[411,1990]],[[2353,1985],[2346,1990],[2358,1994]],[[237,1941],[190,1961],[202,1969],[208,1958],[214,1966],[208,1979],[226,1970],[233,1993],[235,1970],[247,1960],[230,1965]],[[35,1943],[5,1980],[12,1988]],[[841,1971],[835,1985],[851,1988],[849,1974],[847,1980]],[[28,1977],[26,1988],[33,1985]],[[1665,1568],[1656,1582],[1665,1582]],[[1438,1965],[1415,1971],[1416,1979],[1422,1986],[1436,1979],[1430,1974]],[[2883,1538],[2884,1552],[2894,1544]],[[1696,1579],[1699,1572],[1690,1572]],[[1646,1539],[1640,1547],[1642,1560],[1653,1558],[1649,1566],[1662,1554]],[[1641,1489],[1632,1505],[1639,1528],[1647,1525],[1651,1499],[1647,1532],[1655,1530],[1655,1540],[1661,1529],[1669,1532],[1661,1538],[1668,1544],[1683,1522],[1676,1521],[1679,1498],[1675,1491],[1676,1501],[1651,1491],[1644,1496]],[[849,1960],[849,1974],[858,1973]],[[1630,1471],[1623,1476],[1632,1485]],[[1379,1096],[1374,1113],[1365,1115],[1378,1116]],[[1446,1971],[1457,1962],[1449,1962]],[[2466,1954],[2460,1966],[2480,1970],[2487,1958],[2463,1962]],[[76,1115],[88,1137],[92,1129]],[[1470,1957],[1460,1962],[1470,1965]],[[144,1924],[125,1942],[131,1948],[116,1955],[132,1964],[165,1957]],[[1858,1841],[1860,1851],[1847,1847],[1848,1874],[1829,1891],[1835,1895],[1807,1902],[1810,1921],[1792,1925],[1798,1939],[1783,1936],[1762,1948],[1724,1945],[1758,1961],[1834,1949],[1832,1932],[1848,1920],[1866,1948],[1853,1909],[1867,1899],[1885,1916],[1868,1892],[1874,1883],[1863,1882],[1879,1864],[1862,1868],[1868,1842]],[[118,1100],[117,1109],[103,1106],[105,1123],[109,1115],[125,1116]],[[1051,1045],[1044,1052],[1045,1071],[1070,1069],[1061,1062],[1067,1052]],[[835,1941],[825,1948],[833,1958],[848,1947]],[[2156,985],[2152,999],[2158,998]],[[924,944],[917,945],[920,961]],[[870,1935],[860,1940],[867,1954],[886,1944]],[[894,940],[890,946],[900,947]],[[13,719],[-23,737],[1,739],[14,761],[25,762],[29,742]],[[117,663],[98,681],[86,678],[78,695],[61,694],[58,734],[78,733],[63,707],[92,691],[106,693],[100,684]],[[41,1907],[37,1940],[59,1922]],[[936,1929],[910,1934],[924,1938]],[[836,1919],[834,1926],[820,1924],[835,1935]],[[2574,1904],[2570,1921],[2576,1915],[2576,1925],[2588,1929]],[[243,1913],[236,1917],[243,1929]],[[942,1921],[939,1928],[946,1928]],[[886,1921],[877,1927],[890,1926]],[[835,1857],[823,1869],[832,1871],[832,1887],[822,1896],[854,1888],[846,1905],[838,1899],[851,1922],[858,1899],[863,1905],[887,1894],[857,1890],[869,1862]],[[-14,713],[-10,708],[-22,708]],[[-8,700],[-10,708],[2,709]],[[192,1830],[184,1851],[198,1856],[195,1891],[217,1918],[225,1871],[211,1857],[220,1850],[197,1846],[200,1834]],[[1485,1911],[1483,1917],[1491,1915]],[[-26,688],[-30,696],[-15,689]],[[3195,483],[3199,493],[3212,488]],[[1529,1844],[1517,1850],[1505,1888],[1487,1889],[1480,1903],[1522,1903],[1535,1864]],[[913,1895],[905,1896],[902,1903]],[[3248,565],[3244,574],[3257,576]],[[3267,444],[3264,451],[3278,455]],[[893,1888],[887,1894],[898,1896]],[[337,1864],[324,1870],[337,1872],[337,1886],[346,1865]],[[741,215],[748,223],[743,236],[755,216]],[[291,1863],[303,1884],[317,1881],[324,1866],[310,1875]],[[243,1861],[237,1872],[248,1871]],[[2784,135],[2795,158],[2803,141]],[[1903,1829],[1879,1864],[1888,1862]],[[1012,1851],[1006,1859],[1014,1860]],[[3456,214],[3460,205],[3453,205]],[[872,1838],[860,1839],[889,1853]],[[422,1831],[336,1838],[320,1831],[320,1839],[304,1840],[373,1844],[384,1852],[408,1848]],[[991,1829],[1014,1847],[1014,1834]],[[289,1829],[282,1847],[299,1840],[288,1839]],[[1490,1839],[1488,1846],[1507,1847]],[[3463,168],[3457,175],[3464,178]],[[768,1839],[783,1846],[824,1840]],[[1498,1808],[1489,1809],[1485,1839],[1490,1839],[1499,1839],[1502,1821],[1515,1819]],[[889,1803],[882,1812],[893,1811],[898,1828],[917,1830],[913,1839],[938,1827],[926,1817],[900,1816]],[[3448,154],[3440,157],[3446,162]],[[736,1721],[725,1724],[726,1750],[711,1759],[714,1784],[678,1786],[671,1794],[683,1808],[676,1819],[632,1811],[673,1838],[685,1826],[686,1809],[745,1797],[744,1791],[748,1803],[734,1817],[736,1827],[759,1801],[748,1788],[716,1790],[719,1759],[737,1748],[729,1734]],[[1869,1820],[1859,1828],[1866,1837]],[[3479,124],[3470,130],[3478,132]],[[169,1820],[158,1830],[168,1827],[169,1835],[178,1829]],[[1321,1800],[1305,1824],[1315,1832],[1311,1821],[1327,1812]],[[3491,108],[3479,124],[3481,130]],[[1951,-13],[1943,-10],[1947,-3]],[[1912,1806],[1903,1829],[1913,1822]],[[4097,37],[4091,44],[4075,40],[4065,56],[4097,56]],[[2878,-44],[2862,-9],[2876,-14]],[[4108,32],[4102,45],[4124,40]],[[855,1810],[849,1823],[864,1814]],[[1473,1809],[1469,1823],[1479,1822]],[[155,1814],[169,1820],[159,1809],[176,1804],[160,1804]],[[1778,1775],[1741,1786],[1767,1819],[1772,1811],[1762,1791],[1777,1782]],[[4080,30],[4058,37],[4075,40]],[[4126,10],[4123,26],[4117,18],[4108,24],[4123,33]],[[257,1679],[262,1693],[255,1694],[254,1715],[271,1736],[258,1752],[283,1745],[280,1760],[305,1802],[305,1817],[318,1802],[344,1805],[336,1782],[323,1796],[317,1781],[312,1791],[301,1783],[303,1769],[288,1745],[306,1722],[284,1741],[277,1727],[286,1722],[269,1709],[296,1694],[284,1694],[282,1685],[267,1693]],[[987,1802],[985,1817],[994,1815]],[[1120,1804],[1114,1813],[1130,1815]],[[4151,-22],[4131,-1],[4133,8],[4151,-4]],[[2208,1801],[2200,1813],[2212,1806]],[[365,-60],[355,-50],[333,-58],[341,-44],[366,-53]],[[608,1797],[625,1806],[620,1810],[635,1805]],[[2950,371],[2948,412],[2905,469],[2897,468],[2898,488],[2915,502],[2906,532],[2895,536],[2871,585],[2880,591],[2857,618],[2864,621],[2856,627],[2859,640],[2843,639],[2845,650],[2836,653],[2846,674],[2836,673],[2829,687],[2813,681],[2809,688],[2820,696],[2813,703],[2789,693],[2784,725],[2801,731],[2791,730],[2795,741],[2778,756],[2772,785],[2743,834],[2746,852],[2731,860],[2736,871],[2727,869],[2727,883],[2705,903],[2675,966],[2677,980],[2659,1009],[2659,1028],[2668,1034],[2692,1012],[2692,1004],[2673,1006],[2678,980],[2686,980],[2682,992],[2695,1005],[2699,979],[2714,968],[2717,938],[2725,939],[2734,916],[2719,909],[2733,914],[2730,905],[2740,909],[2744,899],[2724,899],[2739,875],[2754,861],[2772,860],[2774,850],[2762,850],[2766,834],[2799,830],[2842,740],[2866,716],[2861,709],[2888,689],[2883,673],[2893,681],[2913,648],[2908,641],[2916,645],[2912,631],[2919,636],[2927,627],[2927,607],[2945,606],[2947,596],[2930,583],[2951,585],[2947,570],[2957,563],[2950,559],[2966,551],[2960,542],[2991,531],[2987,517],[3001,493],[2995,471],[3009,451],[2996,440],[2997,428],[2969,415],[2971,391]],[[853,1768],[847,1778],[858,1802],[878,1805],[856,1793]],[[1913,1792],[1914,1805],[1927,1803],[1920,1794]],[[1188,590],[1175,599],[1160,593],[1158,604],[1172,605],[1169,631],[1140,648],[1126,702],[1130,748],[1111,782],[1102,780],[1089,800],[1099,798],[1091,826],[1072,843],[1060,829],[1042,851],[1056,863],[1055,892],[1041,902],[1056,902],[1062,917],[1061,933],[1048,942],[1053,953],[1038,950],[1048,996],[1040,993],[1035,1004],[1021,989],[1009,994],[1027,1011],[1017,1011],[1016,1020],[1025,1022],[1020,1038],[1028,1047],[1012,1056],[997,1083],[990,1079],[997,1075],[996,1042],[987,1040],[993,1025],[981,1031],[987,1078],[979,1066],[972,1075],[984,1081],[986,1093],[978,1091],[986,1099],[977,1105],[973,1097],[968,1106],[964,1112],[960,1085],[946,1099],[946,1117],[921,1108],[930,1107],[929,1097],[918,1082],[939,1068],[946,1050],[939,1039],[929,1043],[934,1053],[923,1068],[903,1063],[907,1092],[879,1097],[896,1107],[904,1099],[899,1108],[920,1131],[918,1119],[940,1119],[960,1132],[969,1122],[980,1137],[988,1116],[999,1132],[992,1136],[999,1134],[1013,1161],[991,1186],[1002,1179],[1006,1185],[1001,1231],[988,1228],[996,1214],[986,1211],[979,1216],[987,1224],[977,1222],[986,1229],[973,1236],[967,1223],[959,1235],[946,1222],[935,1232],[940,1237],[928,1235],[934,1245],[956,1259],[955,1246],[963,1246],[960,1257],[973,1254],[974,1264],[985,1259],[989,1269],[999,1250],[1015,1249],[1012,1240],[1021,1254],[1018,1275],[1056,1250],[1058,1257],[1070,1244],[1058,1224],[1048,1233],[1017,1225],[1024,1212],[1014,1213],[1010,1202],[1019,1182],[1026,1192],[1052,1184],[1037,1212],[1058,1204],[1071,1215],[1063,1219],[1077,1217],[1075,1228],[1101,1225],[1098,1202],[1090,1207],[1097,1186],[1082,1168],[1083,1151],[1061,1142],[1040,1161],[1041,1144],[1034,1148],[1042,1116],[1054,1111],[1033,1086],[1060,1085],[1060,1101],[1087,1069],[1076,1061],[1092,1051],[1087,1019],[1078,1021],[1088,1050],[1071,1060],[1080,1069],[1064,1080],[1031,1082],[1029,1051],[1039,1037],[1077,1041],[1077,1034],[1052,1033],[1067,1005],[1069,961],[1080,980],[1103,992],[1135,963],[1103,965],[1120,950],[1109,940],[1131,929],[1150,936],[1129,919],[1148,918],[1143,910],[1151,904],[1164,904],[1174,916],[1170,899],[1155,895],[1137,907],[1124,896],[1117,899],[1125,910],[1116,911],[1124,919],[1117,925],[1101,922],[1103,929],[1089,929],[1091,938],[1071,918],[1083,902],[1101,898],[1088,893],[1104,890],[1104,868],[1075,904],[1066,902],[1063,882],[1071,856],[1081,851],[1104,858],[1142,851],[1152,867],[1166,868],[1147,846],[1084,847],[1104,831],[1103,820],[1122,818],[1136,802],[1148,807],[1150,798],[1132,800],[1113,789],[1136,754],[1134,706],[1151,678],[1149,652],[1176,635],[1175,614],[1188,608]],[[3146,-34],[3177,-19],[3113,105],[3090,83],[3055,112],[3050,133],[3041,132],[3042,149],[3058,128],[3076,119],[3073,111],[3085,108],[3098,139],[3029,234],[3015,278],[2973,337],[2961,341],[2966,347],[2950,371],[2966,364],[2987,321],[3001,331],[2989,359],[3011,366],[3025,345],[3012,327],[3037,328],[3050,312],[3057,316],[3051,305],[3068,305],[3055,280],[3074,300],[3083,269],[3069,242],[3087,237],[3088,225],[3108,231],[3110,220],[3127,222],[3133,201],[3148,191],[3145,183],[3159,168],[3133,153],[3143,134],[3155,131],[3149,121],[3167,116],[3182,134],[3201,94],[3193,88],[3203,89],[3203,72],[3211,73],[3202,57],[3215,59],[3219,49],[3208,32],[3224,19],[3212,13],[3214,-6],[3200,-1],[3178,29],[3177,52],[3169,53],[3163,73],[3150,76],[3151,97],[3137,100],[3116,147],[3104,153],[3077,220],[3057,218],[3168,26],[3188,-28]],[[150,1791],[148,1800],[160,1797]],[[2093,1027],[2107,1035],[2108,1042],[2098,1041],[2114,1062],[2101,1070],[2118,1075],[2128,1090],[2118,1102],[2128,1103],[2126,1132],[2108,1155],[2097,1139],[2081,1147],[2076,1135],[2068,1144],[2078,1158],[2079,1185],[2064,1196],[2070,1210],[2062,1222],[2055,1217],[2061,1211],[2046,1203],[2039,1222],[2026,1204],[2021,1222],[2009,1217],[2005,1228],[1993,1208],[1995,1223],[1986,1219],[1981,1231],[1951,1230],[1958,1249],[1944,1256],[1941,1245],[1919,1251],[1924,1261],[1911,1268],[1902,1296],[1914,1301],[1913,1312],[1933,1320],[1935,1311],[1950,1312],[1957,1325],[1971,1325],[1988,1301],[1992,1309],[1999,1299],[1993,1286],[2000,1291],[2001,1277],[2017,1289],[2021,1311],[2033,1274],[2023,1274],[2061,1269],[2049,1261],[2053,1253],[2076,1230],[2091,1228],[2100,1210],[2086,1185],[2091,1192],[2090,1182],[2090,1176],[2129,1172],[2129,1133],[2131,1151],[2138,1133],[2154,1128],[2152,1138],[2166,1136],[2155,1134],[2168,1128],[2156,1110],[2151,1121],[2141,1118],[2152,1092],[2181,1108],[2199,1104],[2150,1088],[2140,1058],[2144,1025],[2162,1018],[2164,1024],[2177,1007],[2188,1040],[2198,1041],[2207,1022],[2201,1010],[2215,1010],[2218,1027],[2223,1012],[2233,1019],[2238,1008],[2242,1029],[2255,1029],[2242,1016],[2251,1006],[2226,995],[2225,967],[2214,979],[2198,972],[2199,981],[2174,1006],[2160,992],[2166,1012],[2134,996],[2127,1007],[2138,1026],[2124,1014],[2132,1027],[2108,1024],[2096,1005]],[[930,1760],[927,1767],[925,1799],[932,1788],[932,1796],[947,1789],[936,1789],[937,1772]],[[133,1774],[124,1785],[110,1775],[120,1799]],[[1334,70],[1344,87],[1335,100],[1345,106],[1333,117],[1319,106],[1314,111],[1324,121],[1313,123],[1312,136],[1327,185],[1318,181],[1317,194],[1306,184],[1303,207],[1290,204],[1300,202],[1296,197],[1277,203],[1267,196],[1265,209],[1253,212],[1226,204],[1238,221],[1287,217],[1291,236],[1298,236],[1279,248],[1263,250],[1261,243],[1228,276],[1218,271],[1223,280],[1195,308],[1190,289],[1181,287],[1165,311],[1169,313],[1176,301],[1211,328],[1211,361],[1217,328],[1230,326],[1239,304],[1251,312],[1249,333],[1237,339],[1248,347],[1238,359],[1256,369],[1235,441],[1235,483],[1248,471],[1236,472],[1241,458],[1253,464],[1243,453],[1253,409],[1269,398],[1282,413],[1289,410],[1280,374],[1275,381],[1257,377],[1265,364],[1258,353],[1261,305],[1277,304],[1282,321],[1297,327],[1292,306],[1309,297],[1323,308],[1325,304],[1315,292],[1292,301],[1284,293],[1282,310],[1278,292],[1252,296],[1257,277],[1276,264],[1297,278],[1326,269],[1335,258],[1332,237],[1347,239],[1355,259],[1363,248],[1388,257],[1386,227],[1371,211],[1346,209],[1400,175],[1389,170],[1393,163],[1360,158],[1365,147],[1356,142],[1355,123],[1373,126],[1365,122],[1371,108],[1406,110],[1378,96],[1381,75]],[[2977,660],[2964,663],[2969,670],[2952,682],[2936,663],[2925,672],[2928,690],[2920,687],[2904,708],[2898,703],[2898,716],[2874,739],[2862,733],[2870,718],[2854,731],[2861,754],[2855,779],[2873,786],[2832,839],[2816,841],[2808,889],[2827,861],[2831,867],[2839,860],[2840,868],[2840,845],[2853,842],[2851,825],[2890,789],[2894,772],[2918,769],[2932,787],[2950,785],[2945,778],[2956,763],[2968,762],[2977,748],[2968,744],[2976,735],[2969,729],[2988,716],[2978,694],[2993,666],[2982,674]],[[167,1581],[153,1565],[163,1541],[156,1537],[159,1514],[144,1516],[144,1493],[153,1492],[147,1490],[154,1481],[144,1461],[145,1412],[134,1421],[128,1408],[118,1415],[123,1403],[103,1418],[111,1418],[109,1427],[95,1422],[118,1459],[98,1441],[90,1444],[91,1433],[58,1437],[78,1476],[122,1496],[118,1509],[109,1496],[94,1494],[96,1504],[110,1508],[109,1523],[143,1520],[142,1531],[128,1534],[130,1547],[116,1536],[106,1541],[142,1559],[122,1586],[131,1587],[122,1601],[138,1604],[160,1597],[165,1586],[172,1593],[206,1590],[202,1574],[176,1570],[202,1524],[202,1508],[190,1507],[198,1495],[169,1486],[168,1498],[183,1496],[187,1506],[166,1511],[170,1548],[161,1562],[172,1577]],[[1216,1764],[1212,1773],[1165,1776],[1169,1789],[1214,1776],[1211,1784],[1229,1790],[1233,1769]],[[2839,146],[2814,168],[2814,157],[2795,158],[2794,165],[2781,161],[2786,147],[2772,146],[2774,158],[2761,161],[2753,189],[2765,198],[2763,214],[2755,215],[2762,230],[2752,226],[2750,197],[2733,188],[2728,215],[2736,218],[2723,223],[2715,248],[2718,273],[2725,269],[2720,297],[2729,305],[2716,313],[2746,314],[2758,271],[2786,296],[2784,282],[2761,268],[2780,251],[2796,203],[2831,187],[2829,175],[2845,163]],[[2227,672],[2220,697],[2210,690],[2188,696],[2222,701],[2201,731],[2192,723],[2182,743],[2172,742],[2175,750],[2184,745],[2182,753],[2163,756],[2187,765],[2188,759],[2196,773],[2194,756],[2224,761],[2234,783],[2220,802],[2224,817],[2232,822],[2258,837],[2274,817],[2259,818],[2259,830],[2232,802],[2240,807],[2245,780],[2238,756],[2247,749],[2265,757],[2274,766],[2263,779],[2270,795],[2288,795],[2299,781],[2307,728],[2331,712],[2286,696],[2274,720],[2242,709],[2234,717],[2221,708],[2230,689],[2244,683]],[[2255,1729],[2260,1740],[2235,1762],[2242,1773],[2231,1783],[2261,1768],[2260,1761],[2265,1734]],[[311,574],[321,593],[296,589],[291,604],[306,616],[285,620],[237,643],[230,666],[280,646],[278,655],[296,656],[305,651],[300,634],[329,627],[417,674],[429,660],[427,631],[436,634],[414,620],[400,631],[391,608],[369,616],[367,604],[391,586],[368,590],[368,580],[341,585]],[[1782,1764],[1777,1782],[1786,1776]],[[26,274],[48,274],[42,291],[54,277],[88,310],[75,326],[52,327],[49,318],[50,328],[37,324],[25,337],[75,336],[90,311],[113,325],[126,299],[104,305],[77,276],[84,259],[93,262],[99,253],[87,229],[69,217],[88,209],[116,231],[122,183],[123,164],[138,156],[119,158],[128,129],[95,122],[87,133],[106,147],[101,164],[65,176],[58,190],[63,211],[48,214],[69,241],[67,271],[42,254],[38,234],[45,226],[20,240],[33,267]],[[1731,568],[1712,595],[1700,587],[1701,598],[1715,598],[1725,627],[1705,640],[1678,631],[1692,579],[1665,597],[1666,630],[1658,617],[1637,617],[1656,619],[1656,639],[1668,653],[1649,643],[1649,672],[1619,693],[1605,676],[1585,686],[1577,699],[1587,718],[1546,743],[1576,734],[1582,742],[1624,741],[1629,718],[1641,716],[1644,701],[1659,691],[1649,685],[1682,675],[1692,658],[1708,668],[1694,655],[1722,634],[1728,640]],[[2565,638],[2545,677],[2518,697],[2521,710],[2503,714],[2489,751],[2481,744],[2462,775],[2447,778],[2483,781],[2494,760],[2515,761],[2524,777],[2540,773],[2547,807],[2558,806],[2550,800],[2551,761],[2565,753],[2574,757],[2566,759],[2570,767],[2605,757],[2565,744],[2561,727],[2571,695],[2578,689],[2556,678],[2584,651],[2566,655],[2572,646]],[[405,1614],[405,1626],[385,1630],[379,1661],[352,1663],[354,1643],[316,1628],[310,1634],[303,1618],[297,1624],[307,1635],[297,1641],[297,1663],[305,1659],[313,1669],[328,1653],[340,1657],[341,1669],[330,1670],[335,1681],[355,1672],[354,1696],[391,1702],[397,1712],[425,1685],[433,1744],[436,1700],[459,1704],[455,1694],[429,1684],[441,1668],[439,1650],[436,1656],[423,1633],[427,1626]],[[1112,1755],[1126,1770],[1138,1763]],[[996,247],[984,256],[992,288],[1012,305],[989,320],[957,316],[956,324],[969,323],[972,341],[1011,323],[1021,328],[1022,345],[1006,359],[998,355],[1002,369],[995,371],[1049,390],[1049,426],[1032,436],[1041,440],[1034,451],[1046,448],[1041,436],[1050,428],[1064,433],[1066,398],[1082,396],[1088,407],[1095,400],[1083,387],[1060,387],[1038,352],[1024,351],[1043,348],[1051,313],[1039,289],[1019,275],[1019,254]],[[1755,1761],[1751,1767],[1771,1769]],[[687,1736],[666,1747],[657,1739],[645,1759],[659,1767],[686,1748]],[[641,457],[647,443],[641,441],[632,446],[627,471],[592,475],[574,453],[576,442],[560,433],[567,428],[560,429],[559,406],[574,373],[559,393],[554,370],[533,390],[524,387],[517,395],[527,415],[493,447],[500,413],[484,424],[482,445],[451,452],[450,465],[438,462],[412,482],[427,472],[433,479],[435,468],[455,468],[478,451],[490,457],[510,448],[521,467],[542,444],[566,449],[593,481],[625,479],[629,498],[609,500],[598,517],[623,519],[631,500],[643,504],[699,481],[676,472],[669,483],[649,487],[631,478],[638,463],[654,461]],[[843,1382],[830,1389],[833,1395],[787,1395],[773,1418],[751,1418],[783,1444],[789,1460],[778,1464],[797,1473],[836,1438],[858,1441],[881,1472],[876,1484],[884,1485],[889,1503],[896,1493],[890,1471],[913,1474],[913,1467],[878,1453],[877,1442],[860,1438],[856,1429],[865,1432],[862,1422],[856,1428],[853,1422],[836,1429],[850,1415],[877,1408],[865,1400],[855,1405],[860,1396],[853,1402]],[[1234,1694],[1231,1738],[1200,1740],[1206,1749],[1215,1744],[1219,1758],[1242,1740],[1255,1750],[1257,1736],[1247,1729],[1255,1711]],[[1098,1743],[1097,1752],[1112,1755],[1111,1746]],[[537,1211],[536,1221],[507,1233],[510,1268],[516,1256],[560,1255],[564,1285],[595,1274],[608,1320],[623,1326],[632,1309],[644,1313],[671,1340],[674,1362],[691,1370],[696,1389],[694,1369],[676,1359],[674,1340],[648,1312],[662,1304],[665,1289],[671,1323],[693,1350],[697,1313],[722,1299],[698,1268],[699,1282],[687,1280],[673,1271],[680,1258],[670,1265],[659,1252],[664,1279],[656,1300],[622,1300],[605,1279],[606,1267],[580,1263],[588,1267],[575,1273],[578,1263],[571,1264],[568,1273],[565,1253],[537,1229],[538,1218]],[[2986,186],[2977,205],[2984,218],[2968,222],[2952,246],[2941,242],[2940,258],[2949,249],[2955,262],[2933,281],[2915,274],[2912,255],[2901,310],[2915,323],[2929,312],[2928,333],[2935,337],[2956,317],[2973,285],[2967,259],[2988,260],[2985,248],[2998,237],[3016,191]],[[1272,1141],[1238,1246],[1242,1256],[1230,1260],[1222,1243],[1227,1230],[1219,1240],[1211,1235],[1210,1213],[1199,1232],[1212,1278],[1205,1299],[1220,1285],[1222,1264],[1241,1296],[1225,1313],[1233,1327],[1213,1334],[1233,1352],[1237,1373],[1256,1305],[1244,1258],[1265,1255],[1274,1264],[1269,1225],[1273,1218],[1273,1223],[1280,1218],[1274,1216],[1283,1201],[1274,1169],[1282,1145]],[[2318,831],[2303,844],[2319,855],[2309,859],[2314,866],[2299,869],[2304,882],[2317,882],[2302,906],[2285,911],[2265,882],[2255,883],[2259,891],[2249,895],[2259,906],[2246,911],[2263,925],[2257,933],[2264,942],[2252,947],[2244,938],[2259,975],[2269,975],[2264,950],[2294,948],[2295,942],[2271,945],[2274,934],[2307,926],[2322,917],[2325,901],[2346,894],[2328,860],[2342,864],[2363,852],[2359,845],[2350,854],[2350,840],[2324,846]],[[1153,988],[1135,1001],[1158,1017],[1142,1018],[1144,1043],[1136,1050],[1125,1045],[1121,1009],[1104,1009],[1095,1019],[1108,1024],[1101,1057],[1110,1055],[1115,1083],[1129,1064],[1141,1070],[1140,1079],[1154,1078],[1157,1089],[1173,1085],[1186,1068],[1161,1064],[1158,1074],[1156,1055],[1142,1050],[1150,1046],[1148,1032],[1199,1041],[1187,1024],[1194,1018],[1204,1028],[1203,1012],[1194,1010],[1204,1008]],[[1071,1731],[1071,1748],[1081,1735]],[[603,1735],[591,1738],[602,1746]],[[388,1705],[383,1715],[362,1715],[371,1725],[359,1733],[347,1722],[332,1725],[352,1735],[353,1744],[365,1737],[367,1745],[390,1746],[402,1726],[386,1725]],[[1125,1738],[1126,1745],[1132,1740]],[[3110,430],[3099,467],[3083,477],[3084,492],[3040,552],[3045,563],[3037,560],[3040,566],[3032,564],[3020,586],[3009,588],[3005,611],[2989,627],[2998,627],[3013,605],[3014,618],[3028,618],[3015,604],[3025,595],[3013,603],[3021,588],[3040,574],[3039,585],[3051,581],[3043,570],[3068,550],[3071,535],[3083,539],[3095,505],[3152,433],[3129,439]],[[1077,191],[1034,219],[1079,221],[1078,248],[1086,244],[1102,280],[1107,258],[1132,240],[1163,262],[1180,260],[1164,253],[1179,238],[1188,208],[1200,212],[1188,201],[1124,224],[1110,240],[1100,224],[1081,221]],[[1196,1616],[1189,1648],[1182,1648],[1198,1669],[1188,1680],[1169,1673],[1174,1687],[1166,1692],[1179,1695],[1173,1737],[1188,1743],[1196,1711],[1216,1702],[1222,1713],[1222,1690],[1204,1685],[1201,1669],[1229,1668],[1239,1658],[1249,1669],[1236,1639],[1220,1640]],[[923,30],[897,57],[880,47],[883,61],[913,78],[893,102],[886,77],[868,83],[871,97],[856,135],[846,143],[827,133],[826,159],[843,154],[853,161],[853,148],[879,146],[878,129],[892,114],[902,133],[919,100],[951,82],[942,71],[920,76],[903,63],[925,40]],[[2506,461],[2480,548],[2474,543],[2479,555],[2471,573],[2462,574],[2468,583],[2451,633],[2471,612],[2463,611],[2464,601],[2476,606],[2472,584],[2484,543],[2500,538],[2498,528],[2489,531],[2502,519],[2502,503],[2519,504],[2517,521],[2568,524],[2574,539],[2599,534],[2605,547],[2619,548],[2606,531],[2659,501],[2673,481],[2678,473],[2671,471],[2660,494],[2595,522],[2523,506],[2534,482],[2511,488]],[[346,1550],[368,1562],[368,1573],[354,1578],[348,1583],[364,1583],[365,1599],[387,1568],[437,1601],[447,1621],[441,1645],[468,1635],[474,1642],[473,1634],[489,1630],[490,1641],[495,1628],[510,1635],[507,1624],[468,1611],[442,1560],[404,1575],[374,1552]],[[990,1717],[956,1726],[924,1722],[933,1733],[947,1726],[951,1734],[991,1732]],[[421,133],[403,137],[392,157],[398,163],[382,167],[378,182],[390,243],[418,218],[405,202],[435,185],[432,167],[445,145],[429,144]],[[872,940],[861,971],[843,961],[843,971],[828,973],[848,1009],[843,1021],[812,1034],[806,1026],[788,1044],[843,1026],[860,1004],[877,1013],[884,1003],[896,1004],[910,990],[901,986],[912,968],[942,971],[954,1023],[970,1015],[955,1006],[947,972],[958,971],[973,994],[985,989],[961,969],[968,959],[991,960],[983,955],[992,945],[978,954],[962,950],[944,964],[912,961],[914,952],[901,949],[899,959],[899,960],[910,964],[899,968],[890,997],[861,1001],[862,990],[871,962],[886,956],[875,953]],[[1583,1720],[1581,1727],[1589,1724]],[[790,1686],[764,1687],[780,1693],[781,1704],[739,1720],[776,1723],[790,1704]],[[1171,1708],[1157,1719],[1170,1720]],[[842,1665],[836,1690],[854,1681],[854,1672],[869,1701],[866,1716],[893,1718],[877,1705],[880,1684],[855,1669]],[[189,1709],[178,1714],[186,1717]],[[2172,571],[2171,581],[2159,577],[2181,589],[2161,601],[2174,627],[2166,631],[2172,633],[2160,669],[2196,673],[2192,668],[2204,666],[2211,652],[2239,664],[2228,635],[2213,633],[2216,624],[2195,615],[2195,607],[2200,600],[2184,598],[2200,577],[2190,584]],[[2249,13],[2249,41],[2220,23],[2230,38],[2226,67],[2247,59],[2260,77],[2229,89],[2224,95],[2233,102],[2229,94],[2239,90],[2269,93],[2290,109],[2265,106],[2249,114],[2261,118],[2265,109],[2292,116],[2317,75],[2327,74],[2325,67],[2269,61],[2256,47],[2261,33]],[[265,1518],[265,1536],[284,1545],[269,1543],[282,1570],[266,1551],[265,1578],[250,1572],[248,1555],[240,1559],[236,1547],[232,1555],[222,1536],[218,1544],[210,1529],[200,1537],[257,1579],[241,1582],[243,1600],[247,1606],[226,1620],[233,1625],[253,1615],[260,1629],[271,1587],[309,1582],[299,1600],[305,1603],[332,1588],[314,1567],[298,1573],[283,1532],[272,1533]],[[3244,1077],[3196,1127],[3191,1111],[3184,1126],[3163,1125],[3168,1139],[3158,1138],[3160,1157],[3123,1158],[3121,1173],[3113,1168],[3108,1176],[3130,1172],[3135,1183],[3142,1177],[3140,1203],[3162,1203],[3189,1144],[3217,1139],[3208,1121],[3231,1107]],[[313,1688],[303,1705],[313,1712]],[[948,1649],[951,1665],[923,1664],[915,1687],[934,1683],[955,1710],[966,1704],[956,1691],[959,1684],[971,1688],[962,1672],[976,1651]],[[499,1697],[503,1710],[513,1707]],[[46,1691],[49,1706],[55,1694]],[[2461,986],[2453,997],[2436,990],[2425,1007],[2408,1010],[2391,994],[2378,998],[2376,989],[2356,1004],[2348,995],[2350,1010],[2333,1015],[2361,1022],[2362,1011],[2353,1012],[2361,1005],[2372,1015],[2369,1026],[2391,1017],[2379,1028],[2385,1033],[2410,1019],[2417,1028],[2405,1046],[2410,1055],[2420,1048],[2418,1083],[2438,1078],[2421,1073],[2431,1050],[2425,1045],[2432,1031],[2451,1035],[2471,1026],[2449,1022]],[[1643,1696],[1646,1704],[1653,1700]],[[-29,90],[-35,97],[-5,116],[-24,153],[-10,150],[-11,141],[1,156],[10,153],[9,161],[18,156],[18,171],[32,180],[26,184],[45,175],[36,161],[41,151],[16,132],[18,93],[3,63],[-9,87],[-22,88],[-20,79]],[[104,1663],[109,1686],[132,1702],[139,1702],[134,1694],[151,1699],[157,1686],[131,1679],[140,1689],[113,1677]],[[1602,1691],[1600,1699],[1616,1702]],[[1044,1691],[1037,1699],[1046,1701]],[[2230,452],[2222,456],[2221,504],[2205,509],[2194,499],[2188,509],[2155,507],[2131,489],[2143,468],[2132,459],[2122,474],[2113,468],[2121,490],[2089,468],[2056,482],[2069,487],[2072,499],[2070,485],[2095,490],[2104,519],[2119,492],[2140,497],[2150,510],[2146,521],[2163,538],[2215,508],[2223,529],[2232,514],[2225,517]],[[795,379],[779,388],[764,415],[751,405],[743,410],[749,388],[724,395],[732,400],[725,406],[746,418],[712,431],[729,430],[723,459],[730,462],[706,480],[704,471],[703,481],[718,491],[720,479],[734,475],[732,462],[772,449],[785,432],[806,433],[795,428],[829,403],[805,408],[780,432],[766,417]],[[313,1670],[317,1685],[332,1699],[341,1694],[325,1691],[324,1676]],[[1242,2351],[1258,2349],[1258,2338],[1248,2344],[1240,2340],[1234,2349],[1210,2341],[1185,2345],[1201,2347],[1208,2361],[1212,2356],[1212,2410],[1206,2421],[1198,2419],[1198,2431],[1244,2456],[1251,2443],[1246,2449],[1244,2438],[1225,2434],[1217,2421],[1245,2420],[1245,2413],[1261,2423],[1259,2404],[1246,2404],[1240,2391],[1266,2378],[1248,2366],[1243,2384],[1219,2375],[1218,2349],[1227,2358]],[[2841,1275],[2823,1294],[2823,1311],[2810,1311],[2780,1335],[2758,1332],[2771,1335],[2758,1338],[2765,1359],[2767,1342],[2774,1350],[2782,1342],[2777,1336],[2787,1343],[2776,1354],[2777,1368],[2765,1369],[2769,1385],[2755,1378],[2743,1384],[2750,1395],[2772,1388],[2805,1342],[2813,1342],[2821,1361],[2832,1361],[2827,1341],[2845,1305]],[[2084,1590],[2065,1593],[2063,1608],[2049,1625],[2048,1616],[2027,1629],[2029,1638],[1992,1638],[1980,1655],[2001,1646],[1978,1657],[1959,1682],[1974,1689],[1976,1676],[1991,1674],[1983,1663],[1998,1652],[2027,1645],[2028,1651],[2069,1604],[2095,1601]],[[1561,1659],[1545,1678],[1548,1689],[1563,1670]],[[2568,825],[2553,828],[2545,841],[2533,839],[2515,863],[2519,855],[2509,854],[2498,864],[2508,843],[2491,863],[2481,867],[2477,858],[2468,873],[2466,893],[2478,883],[2489,898],[2465,936],[2473,937],[2462,959],[2470,960],[2477,946],[2485,952],[2486,938],[2502,941],[2485,918],[2502,905],[2497,894],[2509,894],[2507,883],[2527,873],[2536,855],[2545,858],[2546,847],[2559,855],[2552,842]],[[1184,1491],[1173,1496],[1169,1535],[1152,1557],[1162,1562],[1160,1577],[1146,1587],[1122,1586],[1134,1594],[1127,1606],[1142,1592],[1155,1599],[1162,1587],[1196,1615],[1201,1604],[1218,1603],[1176,1566],[1191,1539],[1184,1524],[1196,1522],[1203,1535],[1206,1520],[1183,1517],[1196,1502]],[[699,1597],[705,1617],[723,1634],[736,1677],[751,1682],[737,1672],[727,1634]],[[1481,180],[1458,191],[1430,188],[1441,220],[1425,233],[1400,233],[1413,242],[1409,258],[1424,235],[1449,244],[1447,263],[1437,268],[1464,269],[1464,288],[1487,283],[1465,249],[1466,230],[1489,217],[1476,220],[1479,203],[1476,216],[1466,203],[1482,192]],[[1918,1671],[1892,1674],[1905,1681]],[[1942,1654],[1923,1666],[1941,1664],[1948,1676]],[[1956,1325],[1938,1331],[1944,1351],[1937,1361],[1954,1367],[1937,1385],[1931,1381],[1925,1338],[1913,1361],[1915,1379],[1909,1352],[1900,1396],[1889,1396],[1886,1408],[1895,1409],[1889,1415],[1908,1407],[1917,1431],[1935,1441],[1922,1409],[1940,1417],[1951,1406],[1939,1407],[1947,1396],[1941,1395],[1965,1372],[1946,1341]],[[267,176],[244,183],[234,197],[207,190],[210,202],[198,212],[208,208],[216,221],[193,216],[196,234],[164,236],[158,222],[150,231],[176,242],[168,248],[174,253],[189,236],[224,253],[229,232],[254,253],[265,237],[247,222],[248,194],[261,182],[271,187]],[[2501,1385],[2492,1399],[2500,1402],[2490,1402],[2464,1444],[2448,1447],[2443,1468],[2404,1480],[2398,1498],[2414,1486],[2428,1497],[2439,1493],[2466,1446],[2483,1454],[2518,1427],[2517,1415],[2527,1412]],[[1820,1649],[1809,1669],[1819,1665]],[[783,213],[740,250],[734,249],[743,236],[733,248],[723,234],[685,237],[679,246],[692,244],[693,257],[708,261],[698,279],[706,288],[695,298],[708,312],[719,315],[706,293],[721,276],[740,293],[740,278],[722,275],[738,255],[760,260],[762,252],[752,250],[764,236],[783,233],[787,241],[775,239],[777,246],[791,241]],[[395,265],[380,267],[374,291],[398,349],[408,351],[406,354],[432,363],[427,343],[421,348],[413,336],[424,335],[417,311],[443,314],[440,296],[395,297],[393,281],[382,278]],[[1113,1647],[1115,1662],[1121,1648]],[[1972,1604],[1950,1635],[1948,1657]],[[1802,1645],[1794,1653],[1804,1656]],[[2657,6],[2656,17],[2650,9],[2643,16],[2683,49],[2616,148],[2611,171],[2628,158],[2627,145],[2695,52],[2690,44],[2704,17]],[[1981,214],[1969,253],[1982,318],[2004,341],[2003,328],[1981,304],[2008,251],[2031,232],[2010,222],[1991,225]],[[1056,1619],[1029,1639],[1051,1639],[1048,1652],[1060,1649],[1055,1634],[1063,1626]],[[3784,13],[3784,30],[3772,31],[3780,40],[3769,45],[3790,77],[3774,82],[3775,93],[3781,94],[3778,84],[3792,88],[3809,104],[3796,99],[3793,108],[3757,114],[3763,120],[3753,126],[3734,119],[3719,140],[3738,142],[3817,103],[3804,94],[3792,55],[3809,26],[3793,22]],[[74,1632],[74,1650],[79,1638],[84,1637]],[[1580,1631],[1569,1649],[1580,1649]],[[896,319],[886,330],[879,326],[880,340],[863,346],[875,374],[844,385],[836,397],[868,397],[876,385],[895,391],[885,394],[898,404],[896,381],[918,383],[931,373],[932,358],[958,352],[944,345],[903,374],[883,376],[892,365],[883,353],[896,323],[909,346],[905,321]],[[1808,1631],[1820,1649],[1826,1634]],[[1141,1638],[1137,1647],[1148,1642]],[[510,1635],[514,1647],[521,1641]],[[2794,975],[2769,992],[2751,1038],[2741,1038],[2750,1041],[2737,1058],[2743,1069],[2734,1069],[2741,1075],[2734,1084],[2724,1078],[2729,1085],[2715,1088],[2717,1095],[2711,1089],[2702,1119],[2659,1169],[2665,1177],[2717,1122],[2741,1126],[2719,1106],[2739,1088],[2752,1047],[2765,1035],[2771,995]],[[2328,1017],[2313,1042],[2319,1040],[2326,1066],[2308,1102],[2331,1096],[2343,1074],[2353,1087],[2363,1059],[2372,1062],[2387,1040],[2363,1035],[2340,1058],[2327,1034],[2348,1043],[2329,1029]],[[2949,1116],[2877,1194],[2875,1225],[2868,1223],[2854,1252],[2865,1236],[2878,1239],[2895,1228],[2889,1203],[2906,1197],[2908,1193],[2916,1197],[2922,1185],[2914,1180],[2929,1145],[2952,1130]],[[2021,960],[2006,962],[2006,985],[2017,979],[2049,1021],[2070,1015],[2086,980],[2049,983],[2050,974],[2043,979]],[[1087,483],[1075,493],[1062,487],[1062,508],[1078,513],[1077,540],[1095,533],[1101,577],[1116,579],[1091,610],[1105,619],[1130,590],[1103,562],[1105,519],[1092,517]],[[829,1622],[804,1634],[817,1638],[833,1626],[865,1639],[853,1623]],[[1624,-30],[1611,-1],[1634,14],[1637,46],[1625,50],[1615,18],[1605,15],[1615,35],[1606,38],[1609,59],[1627,57],[1620,76],[1630,54],[1666,40],[1658,31],[1677,13],[1667,10],[1652,36],[1641,36],[1650,23],[1638,-19]],[[-26,1614],[-41,1625],[-24,1638]],[[96,1624],[86,1637],[112,1634],[97,1632]],[[957,1616],[939,1626],[942,1633],[957,1637]],[[2604,1085],[2586,1104],[2579,1099],[2586,1107],[2560,1153],[2550,1156],[2549,1138],[2537,1156],[2547,1171],[2505,1208],[2508,1218],[2478,1254],[2466,1298],[2520,1204],[2580,1150],[2580,1132]],[[1227,1617],[1235,1635],[1237,1623]],[[894,1612],[866,1627],[870,1634]],[[1793,1620],[1781,1629],[1796,1632]],[[2412,1075],[2403,1077],[2404,1109],[2385,1117],[2381,1142],[2346,1168],[2333,1199],[2296,1221],[2303,1236],[2344,1205],[2340,1196],[2347,1197],[2360,1162],[2377,1158],[2396,1124],[2409,1118],[2417,1096]],[[2198,1251],[2174,1264],[2143,1259],[2155,1279],[2144,1309],[2104,1314],[2138,1337],[2145,1312],[2153,1319],[2166,1305],[2153,1299],[2161,1299],[2157,1288],[2167,1290],[2180,1275],[2191,1286],[2198,1277],[2191,1264],[2203,1268]],[[1461,1457],[1454,1473],[1414,1494],[1442,1505],[1438,1488],[1454,1489],[1457,1502],[1466,1492],[1470,1514],[1460,1523],[1470,1524],[1485,1484],[1491,1507],[1497,1486],[1515,1476],[1497,1471],[1484,1479],[1475,1464]],[[931,1602],[930,1614],[939,1626],[938,1607],[953,1608]],[[2748,1406],[2711,1439],[2693,1441],[2733,1450],[2775,1464],[2763,1448],[2780,1444],[2783,1434],[2747,1419],[2754,1420]],[[488,656],[475,666],[470,686],[484,705],[480,720],[467,726],[474,738],[490,736],[490,720],[532,709],[510,697],[505,681],[489,684]],[[41,1605],[27,1610],[34,1612],[28,1625],[40,1609],[46,1614]],[[1389,1610],[1382,1614],[1390,1622]],[[1081,1575],[1072,1588],[1073,1599],[1065,1594],[1068,1616],[1072,1605],[1080,1611],[1086,1599],[1079,1592],[1091,1582]],[[2844,350],[2820,391],[2852,405],[2872,376],[2901,371]],[[223,344],[217,336],[206,345],[229,358],[239,397],[230,401],[233,410],[246,407],[254,418],[270,405],[273,416],[274,402],[259,400],[261,388],[251,384],[250,355],[235,346],[252,334],[225,334]],[[1463,108],[1438,149],[1401,140],[1408,170],[1419,164],[1430,177],[1446,177],[1462,135],[1480,140],[1477,124],[1460,131]],[[871,1281],[863,1295],[813,1311],[815,1303],[803,1296],[783,1340],[820,1323],[837,1358],[839,1319],[865,1296],[887,1293],[886,1286],[876,1289]],[[2375,736],[2384,748],[2375,771],[2358,778],[2363,787],[2349,794],[2382,796],[2383,814],[2394,807],[2416,825],[2412,811],[2421,809],[2399,801],[2406,787],[2386,754],[2391,742]],[[1228,1411],[1207,1418],[1210,1429],[1196,1437],[1152,1434],[1152,1444],[1187,1440],[1190,1470],[1200,1437],[1214,1467],[1214,1455],[1239,1432],[1265,1441],[1252,1425],[1262,1421],[1245,1416],[1231,1429]],[[3471,22],[3462,41],[3445,47],[3429,76],[3437,81],[3433,89],[3416,92],[3420,105],[3430,95],[3447,98],[3448,107],[3459,95],[3452,90],[3459,65],[3488,23]],[[1482,1352],[1472,1366],[1480,1378],[1450,1384],[1447,1410],[1436,1415],[1446,1421],[1459,1394],[1475,1396],[1471,1411],[1485,1400],[1476,1397],[1501,1388],[1566,1410],[1495,1375],[1496,1361]],[[566,909],[537,916],[530,927],[537,941],[554,939],[568,965],[580,968],[582,931]],[[155,52],[152,61],[147,52],[127,71],[137,93],[153,89],[149,101],[156,101],[164,70],[179,58],[182,98],[166,93],[179,100],[176,113],[189,97],[186,77],[194,77],[197,90],[204,78],[185,65],[186,53],[177,55],[163,62]],[[784,1515],[787,1531],[778,1556],[786,1596],[767,1603],[782,1605],[790,1591],[782,1555],[792,1527]],[[775,1345],[737,1359],[736,1351],[715,1366],[719,1374],[696,1355],[702,1373],[709,1371],[694,1404],[706,1410],[700,1401],[716,1404],[724,1393],[724,1405],[735,1409],[741,1399],[728,1393],[735,1373]],[[2009,1522],[1977,1578],[1972,1604]],[[926,-4],[931,19],[923,30],[944,28],[958,47],[979,35],[970,9],[955,-2]],[[2458,844],[2423,852],[2416,862],[2426,893],[2414,920],[2407,918],[2411,924],[2431,922],[2429,903],[2443,908],[2433,891],[2447,867],[2468,873],[2451,858],[2460,859]],[[37,1372],[19,1380],[29,1400],[42,1392],[33,1412],[38,1423],[41,1412],[43,1437],[65,1434],[70,1411]],[[1097,1584],[1104,1595],[1119,1586]],[[1036,1455],[975,1460],[1003,1464],[991,1479],[976,1475],[981,1483],[963,1500],[993,1511],[1005,1505],[1010,1485],[1003,1470],[1020,1470]],[[1203,1535],[1207,1551],[1253,1588],[1236,1565],[1238,1553],[1213,1551]],[[2096,1577],[2097,1584],[2103,1580]],[[37,1561],[49,1581],[53,1576]],[[1473,1567],[1462,1576],[1467,1581]],[[1818,1431],[1811,1447],[1791,1442],[1773,1450],[1791,1467],[1788,1482],[1799,1484],[1798,1475],[1840,1458],[1821,1448],[1835,1434]],[[1144,150],[1135,158],[1111,151],[1108,176],[1122,187],[1125,170],[1138,179],[1152,168],[1151,188],[1170,197],[1178,187],[1167,170],[1154,169]],[[906,1556],[897,1573],[908,1573]],[[1065,1568],[1059,1573],[1073,1570]],[[1391,1554],[1386,1563],[1397,1571],[1406,1571],[1408,1555],[1397,1563]],[[1237,498],[1217,521],[1224,536],[1209,552],[1207,572],[1237,545],[1268,543],[1249,538],[1258,522],[1243,527],[1248,512],[1235,510]],[[2142,1556],[2132,1563],[2145,1564]],[[1304,1549],[1301,1560],[1309,1555]],[[-8,1507],[-26,1536],[-21,1552],[-2,1559],[5,1527],[-10,1500],[-18,1500]],[[889,1507],[873,1516],[893,1521],[887,1537],[906,1556],[905,1533],[936,1557],[921,1518],[900,1521]],[[1290,1288],[1274,1332],[1278,1311],[1251,1332],[1259,1342],[1245,1365],[1246,1388],[1260,1349],[1281,1348],[1278,1336],[1303,1304],[1301,1289],[1299,1295]],[[1094,1546],[1086,1548],[1076,1555]],[[748,1516],[747,1550],[764,1530]],[[-2,1504],[29,1549],[28,1535]],[[1228,1536],[1231,1546],[1244,1540]],[[1358,1080],[1350,1083],[1349,1107],[1329,1107],[1335,1114],[1310,1103],[1324,1130],[1350,1129],[1359,1138],[1367,1129],[1388,1133],[1389,1121],[1407,1131],[1409,1113],[1420,1106],[1396,1110],[1392,1119],[1381,1118],[1385,1124],[1355,1129],[1350,1102]],[[2901,1515],[2888,1518],[2902,1539],[2919,1527]],[[2452,1526],[2437,1537],[2452,1534]],[[479,460],[467,486],[435,491],[445,505],[488,505],[502,522],[516,501],[469,487],[485,469]],[[455,1490],[468,1498],[506,1496],[530,1530],[539,1530],[513,1491]],[[980,1514],[966,1519],[961,1530]],[[2273,1505],[2256,1521],[2265,1529]],[[67,1478],[63,1490],[90,1518],[88,1528],[103,1520],[86,1499],[77,1501]],[[3038,1243],[3022,1259],[3026,1265],[3001,1281],[3000,1296],[2965,1340],[2979,1336],[2988,1345],[3023,1277]],[[2715,622],[2709,632],[2733,685],[2744,669],[2779,704],[2783,694],[2769,688],[2772,681],[2757,679],[2771,661],[2756,660],[2752,669],[2724,644],[2723,623]],[[2080,55],[2081,75],[2067,72],[2048,91],[2059,92],[2076,123],[2085,119],[2082,107],[2094,104],[2082,78],[2090,79],[2091,69]],[[261,1494],[252,1504],[265,1518]],[[2199,1499],[2189,1517],[2199,1512]],[[2844,958],[2825,964],[2827,991],[2815,997],[2816,1019],[2809,1013],[2804,1040],[2796,1037],[2797,1058],[2821,1020],[2833,1024],[2827,1017],[2843,1006],[2832,986]],[[863,1510],[858,1514],[871,1516]],[[1377,1502],[1378,1511],[1364,1515],[1383,1511]],[[1352,1423],[1332,1427],[1334,1463],[1327,1472],[1323,1467],[1317,1500],[1334,1494],[1354,1501],[1357,1491],[1355,1481],[1347,1491],[1321,1493],[1332,1475],[1345,1475]],[[1380,1486],[1399,1511],[1407,1496]],[[2923,1446],[2916,1466],[2890,1476],[2912,1486],[2908,1502],[2917,1509],[2930,1492],[2928,1463],[2939,1459]],[[1874,1491],[1868,1502],[1880,1509]],[[752,1436],[772,1449],[769,1481],[783,1508],[772,1478],[773,1445]],[[406,354],[385,388],[372,388],[382,400],[379,453],[399,443],[403,431],[385,416],[386,404],[403,393]],[[1419,602],[1420,616],[1411,609],[1406,615],[1411,627],[1398,618],[1394,632],[1436,665],[1431,644],[1440,641],[1426,629],[1433,625]],[[104,356],[100,374],[70,375],[68,387],[95,382],[114,394],[140,377],[132,379],[134,361],[119,357],[117,372]],[[1294,964],[1277,988],[1269,1022],[1282,993],[1292,1008],[1300,1002],[1307,1011],[1306,1004],[1320,1008],[1325,999],[1316,998],[1317,976],[1304,983]],[[2090,529],[2076,530],[2080,550],[2108,582],[2115,578],[2106,542],[2111,549],[2116,540]],[[319,1411],[290,1429],[294,1441],[302,1431],[302,1443],[315,1440],[315,1455],[304,1456],[321,1474],[332,1470]],[[1548,1280],[1560,1281],[1562,1304],[1549,1303],[1582,1325],[1575,1317],[1590,1313],[1583,1311],[1601,1286],[1596,1275],[1590,1294],[1589,1279],[1576,1294],[1576,1281],[1566,1286],[1572,1275],[1554,1275]],[[1384,545],[1350,561],[1379,567],[1365,588],[1382,583],[1381,571],[1404,578],[1415,564],[1398,550],[1386,559]],[[3326,358],[3314,372],[3293,372],[3280,389],[3293,396],[3291,410],[3287,421],[3335,365]],[[1299,1462],[1281,1478],[1288,1486],[1281,1497],[1297,1496]],[[616,1492],[629,1496],[625,1480],[616,1480]],[[3021,1447],[3006,1461],[2999,1495],[3017,1493],[3009,1491],[3010,1475],[3024,1456]],[[939,1486],[932,1489],[940,1495]],[[3152,736],[3133,755],[3117,796],[3137,789],[3154,768],[3146,765],[3158,764],[3162,739],[3149,751]],[[2718,1462],[2707,1475],[2709,1489],[2726,1478]],[[459,1466],[453,1470],[467,1489],[479,1486],[482,1470],[470,1475]],[[220,1449],[207,1460],[196,1453],[202,1478],[218,1488],[235,1473],[227,1478],[218,1470]],[[434,1418],[421,1430],[424,1458],[400,1469],[423,1468],[431,1488],[432,1428],[446,1423]],[[2247,601],[2256,624],[2245,621],[2249,630],[2239,630],[2249,639],[2237,640],[2239,655],[2262,646],[2278,627],[2270,606],[2264,611]],[[503,1460],[492,1464],[492,1484],[511,1466]],[[444,1466],[434,1468],[443,1476],[437,1481],[450,1484],[452,1471]],[[1224,1483],[1227,1476],[1218,1476]],[[1413,1462],[1411,1471],[1428,1476]],[[598,517],[572,536],[594,571],[611,539]],[[2004,342],[2011,366],[2037,392],[2049,396],[2050,378],[2060,385],[2067,377],[2072,387],[2078,374],[2049,367],[2034,375]],[[1770,1457],[1765,1466],[1752,1462],[1753,1474],[1777,1468]],[[2922,1036],[2915,1051],[2892,1047],[2901,1058],[2893,1058],[2887,1088],[2875,1089],[2888,1100],[2926,1046],[2942,1042]],[[952,1456],[941,1471],[967,1461]],[[1901,1459],[1885,1468],[1897,1464],[1900,1471]],[[3169,705],[3159,714],[3160,731],[3181,739],[3184,754],[3194,749],[3202,715],[3183,723],[3189,729],[3176,729],[3182,713]],[[497,28],[474,38],[477,81],[501,69],[490,57],[503,50]],[[172,764],[159,773],[170,782],[160,787],[163,806],[180,815],[174,830],[189,816],[190,794],[170,776]],[[1432,553],[1415,564],[1429,612],[1449,635],[1468,636],[1457,610],[1445,618],[1435,611],[1424,569]],[[1858,1454],[1851,1467],[1867,1465]],[[1530,1465],[1531,1454],[1522,1454]],[[450,1454],[436,1457],[445,1465]],[[2288,11],[2277,23],[2299,52],[2316,52],[2306,18]],[[1167,1451],[1162,1460],[1169,1462]],[[476,1444],[470,1452],[493,1461],[495,1453]],[[3136,1210],[3123,1234],[3131,1250],[3142,1252],[3141,1236],[3151,1229],[3144,1225],[3153,1223],[3147,1221],[3170,1225],[3173,1216]],[[2635,1437],[2617,1438],[2619,1456]],[[1566,1454],[1572,1456],[1578,1455]],[[2805,1437],[2800,1441],[2812,1455]],[[2006,135],[2000,171],[1989,182],[2028,198]],[[1674,1445],[1667,1452],[1682,1454],[1671,1451]],[[2666,1424],[2663,1434],[2638,1437],[2665,1452],[2689,1441],[2682,1436],[2690,1426]],[[3023,1444],[3037,1452],[3046,1436],[3038,1425],[3051,1417],[3049,1400],[3040,1400]],[[1693,1440],[1681,1442],[1691,1451]],[[-21,1438],[-25,1451],[-17,1449]],[[1772,624],[1765,631],[1753,625],[1729,645],[1731,674],[1718,670],[1730,687],[1742,678],[1737,664],[1748,649],[1746,634],[1771,640]],[[600,205],[592,211],[605,243],[583,265],[571,261],[584,271],[600,261],[606,269],[615,255],[608,241],[618,236]],[[1009,1431],[1001,1441],[1012,1443]],[[884,1434],[880,1441],[892,1441]],[[1082,51],[1046,55],[1053,88],[1064,87],[1071,71],[1085,77],[1075,71]],[[1177,939],[1161,944],[1164,953],[1152,954],[1145,968],[1182,969],[1188,944]],[[2095,-25],[2136,48],[2137,24],[2123,8],[2136,-8],[2131,-3]],[[1721,1424],[1718,1435],[1726,1440]],[[273,1421],[259,1433],[278,1439]],[[-19,1406],[-21,1438],[-13,1411]],[[1688,174],[1679,186],[1701,208],[1698,226],[1710,234],[1717,229],[1708,222],[1704,178]],[[2822,1409],[2805,1437],[2827,1424]],[[1739,1429],[1734,1435],[1748,1433]],[[884,1434],[888,1429],[880,1429]],[[38,1423],[27,1425],[38,1432]],[[2638,1025],[2615,1074],[2634,1079],[2645,1064],[2645,1042],[2635,1041]],[[1484,1416],[1484,1428],[1507,1427]],[[1526,1409],[1543,1426],[1548,1410]],[[650,254],[636,291],[619,289],[616,314],[661,272],[666,255]],[[1712,17],[1691,47],[1696,69],[1722,42],[1713,31],[1722,25]],[[1227,1135],[1225,1153],[1208,1146],[1211,1158],[1189,1138],[1192,1155],[1175,1166],[1195,1159],[1212,1169],[1226,1158],[1229,1166],[1246,1151],[1230,1149]],[[2687,1410],[2697,1420],[2696,1413]],[[92,1413],[82,1415],[89,1420]],[[943,126],[942,141],[973,169],[982,151],[967,143],[973,131],[951,135]],[[1772,260],[1742,273],[1741,272],[1727,287],[1723,311],[1731,287],[1765,290]],[[1494,1407],[1499,1414],[1522,1409]],[[965,478],[972,468],[967,450],[979,460],[979,442],[988,441],[988,425],[964,446],[964,459],[945,460],[958,481]],[[1,289],[-9,303],[-11,296],[-14,309],[-4,312],[-16,321],[-2,332],[-6,349],[5,335],[4,303],[21,294]],[[2670,119],[2668,128],[2667,136],[2676,135],[2669,159],[2698,146],[2701,127],[2675,127]],[[314,1389],[292,1391],[297,1398],[287,1399],[292,1410],[318,1396]],[[2830,1391],[2825,1404],[2832,1410],[2838,1395]],[[3547,126],[3507,218],[3519,222],[3526,179],[3540,177]],[[163,1392],[157,1402],[172,1405]],[[3237,1031],[3245,1076],[3274,1057],[3276,1038],[3270,1049],[3243,1053],[3253,1039]],[[1577,1386],[1584,1404],[1594,1390]],[[645,1396],[643,1402],[651,1399]],[[-38,1397],[-27,1392],[-21,1401],[-21,1388],[-35,1392],[-35,1382],[-44,1382]],[[1424,322],[1425,348],[1415,349],[1444,355],[1450,387],[1463,389],[1453,385],[1458,372],[1441,347],[1443,331]],[[3067,1362],[3039,1397],[3057,1400],[3063,1375],[3073,1373]],[[1828,1372],[1818,1380],[1819,1394],[1829,1399]],[[1860,1388],[1849,1389],[1855,1398]],[[1094,40],[1084,50],[1110,79],[1120,49]],[[2797,1058],[2780,1066],[2774,1100],[2785,1102],[2780,1089],[2792,1093],[2805,1079],[2795,1073],[2802,1066]],[[2857,1370],[2845,1386],[2851,1393],[2860,1377]],[[1049,128],[1035,135],[1079,170],[1072,140]],[[1958,302],[1966,315],[1963,338],[1933,390],[1959,375],[1955,367],[1978,310]],[[1002,1375],[995,1380],[1006,1387]],[[59,1375],[53,1384],[67,1378]],[[2551,1371],[2547,1378],[2556,1383],[2565,1375]],[[991,1339],[986,1351],[976,1351],[974,1381],[990,1372]],[[2591,1360],[2565,1375],[2590,1379],[2584,1369]],[[835,1363],[842,1378],[846,1368]],[[163,1327],[163,1376],[174,1362],[175,1334]],[[2524,1351],[2515,1374],[2525,1376]],[[1835,1352],[1828,1364],[1837,1362],[1837,1375],[1845,1359]],[[769,1358],[767,1374],[781,1366]],[[2899,70],[2876,87],[2877,96],[2862,89],[2872,110],[2849,121],[2857,132],[2849,127],[2850,147]],[[55,111],[30,130],[50,142],[68,128],[65,114]],[[2497,1347],[2487,1353],[2503,1373],[2510,1358]],[[597,1350],[605,1372],[613,1359]],[[1354,1360],[1347,1362],[1352,1372]],[[1806,1369],[1808,1358],[1801,1358]],[[54,1345],[41,1362],[52,1364]],[[1590,-1],[1575,10],[1583,32],[1605,15],[1608,1]],[[625,1357],[614,1359],[625,1364]],[[224,1327],[240,1362],[250,1338],[240,1320],[225,1320]],[[2664,1183],[2647,1213],[2663,1223],[2658,1246],[2684,1238],[2656,1212],[2670,1191]],[[210,1209],[216,1238],[233,1259],[231,1218]],[[1357,458],[1323,470],[1322,478],[1351,475],[1355,486],[1367,488]],[[3086,1314],[3065,1358],[3085,1347]],[[1461,1338],[1451,1354],[1482,1351],[1479,1342]],[[2452,1324],[2441,1339],[2420,1333],[2440,1346],[2437,1354]],[[1862,1337],[1849,1353],[1860,1354]],[[714,1341],[712,1350],[725,1353]],[[353,1327],[342,1352],[350,1349]],[[1877,1339],[1880,1351],[1889,1344]],[[1841,1345],[1835,1348],[1844,1351]],[[709,337],[702,349],[717,373],[710,376],[725,386],[731,359],[720,358],[716,346]],[[1159,266],[1139,286],[1128,288],[1129,274],[1113,289],[1109,308],[1120,309],[1117,292],[1139,297],[1148,283],[1152,292],[1151,280],[1158,284]],[[1539,1329],[1534,1340],[1570,1350],[1567,1340]],[[591,1337],[578,1348],[594,1344]],[[254,1318],[256,1347],[264,1342]],[[2548,1336],[2541,1346],[2557,1337]],[[911,434],[908,451],[893,441],[910,465],[877,483],[875,508],[883,482],[915,481]],[[1058,284],[1047,302],[1054,308],[1067,321],[1076,290]],[[2173,-8],[2171,23],[2179,35],[2196,9],[2183,-1]],[[974,1332],[966,1333],[974,1339]],[[156,697],[143,704],[150,714],[142,717],[170,731],[172,711]],[[989,1314],[992,1337],[1003,1325],[998,1319]],[[1986,1326],[2020,1333],[1998,1327]],[[1425,1302],[1402,1307],[1400,1315],[1428,1331],[1442,1329],[1415,1315]],[[1885,1313],[1880,1329],[1897,1318]],[[636,1321],[633,1327],[645,1328]],[[434,1318],[430,1327],[437,1324]],[[2276,1151],[2259,1165],[2223,1157],[2242,1169],[2239,1184],[2249,1179],[2267,1190],[2256,1173],[2262,1178]],[[733,1317],[714,1318],[714,1326]],[[1527,1029],[1520,1043],[1503,1069],[1505,1081],[1541,1034]],[[658,-29],[652,-27],[668,-13],[669,8],[685,6],[689,28],[691,-14],[670,-13]],[[2339,1304],[2334,1324],[2341,1310]],[[2446,362],[2429,372],[2450,376],[2459,394],[2463,389],[2471,398],[2465,367]],[[1371,1298],[1363,1311],[1372,1320],[1399,1314]],[[447,1162],[451,1173],[439,1186],[444,1201],[457,1200],[456,1189],[477,1178],[472,1171],[491,1168],[466,1165],[457,1186],[444,1187],[455,1170]],[[1838,1306],[1838,1317],[1847,1311]],[[2450,1308],[2457,1316],[2458,1312]],[[891,1310],[875,1314],[895,1315]],[[2153,95],[2170,103],[2179,120],[2211,116],[2188,100]],[[1368,631],[1360,643],[1348,643],[1340,661],[1365,660],[1376,647]],[[1127,544],[1136,570],[1154,575],[1166,563]],[[1205,368],[1189,380],[1171,377],[1169,385],[1187,394],[1185,397],[1208,413],[1204,391],[1193,396],[1192,386]],[[3131,1252],[3093,1306],[3136,1272]],[[1134,27],[1132,55],[1120,66],[1126,79],[1145,44],[1169,54],[1167,45],[1148,43]],[[124,572],[113,574],[125,596],[141,594],[149,579]],[[742,1281],[744,1295],[756,1299],[760,1292]],[[2384,-55],[2369,-44],[2362,-7],[2372,-18],[2373,-9],[2389,-14],[2374,-25],[2385,-38],[2379,-37]],[[764,1286],[763,1292],[776,1297]],[[1528,1288],[1519,1290],[1528,1297]],[[-33,247],[-42,271],[-12,271],[7,252],[-14,262]],[[35,575],[11,592],[41,615]],[[804,1275],[802,1292],[811,1278]],[[1507,1095],[1507,1106],[1488,1116],[1495,1118],[1450,1120],[1466,1136],[1476,1123],[1516,1116]],[[3148,247],[3149,265],[3140,264],[3147,273],[3134,275],[3137,289],[3130,290],[3135,297],[3115,306],[3144,298],[3155,260]],[[367,1113],[359,1121],[345,1117],[346,1128],[361,1125],[357,1140],[370,1148],[376,1143],[365,1133],[378,1134],[374,1115],[367,1128]],[[290,97],[286,114],[275,118],[275,139],[254,143],[267,148],[268,173],[271,145],[289,153],[276,140],[292,118]],[[856,1259],[836,1275],[828,1272],[829,1285],[860,1266]],[[233,1262],[224,1282],[249,1285]],[[1717,1251],[1716,1263],[1733,1268],[1716,1279],[1729,1280],[1737,1263]],[[746,1270],[745,1278],[755,1280]],[[1152,1279],[1161,1272],[1149,1272]],[[1864,1259],[1856,1262],[1863,1278]],[[1902,1256],[1887,1257],[1890,1276]],[[2112,847],[2133,861],[2141,911],[2149,870],[2137,861],[2142,857]],[[1606,1267],[1609,1275],[1622,1271]],[[792,1269],[778,1270],[794,1275]],[[818,815],[805,828],[811,833],[792,836],[791,845],[809,840],[815,854],[828,847],[824,837],[817,845]],[[871,1248],[871,1260],[874,1269],[880,1265]],[[2580,-62],[2570,-59],[2564,-30],[2572,-22],[2586,-53]],[[625,348],[616,382],[608,368],[600,381],[621,387],[633,375],[625,360],[636,357]],[[829,1254],[812,1260],[822,1268]],[[1600,1240],[1586,1263],[1578,1260],[1589,1267]],[[862,1251],[856,1259],[869,1266]],[[1527,1256],[1521,1264],[1533,1264]],[[455,232],[428,233],[427,258],[451,252],[444,241]],[[1865,1135],[1877,1164],[1891,1174],[1897,1165],[1890,1158],[1898,1160],[1903,1145],[1879,1154]],[[795,1257],[787,1259],[783,1264]],[[1135,1243],[1166,1251],[1171,1262],[1174,1246],[1166,1249],[1165,1236],[1155,1236]],[[-5,1244],[-21,1248],[-23,1260],[-9,1251],[-13,1262]],[[1691,1251],[1683,1255],[1687,1262]],[[1188,60],[1177,63],[1173,78],[1175,87],[1184,86],[1178,100],[1189,94],[1197,118],[1199,103],[1185,84]],[[809,1254],[803,1259],[812,1260]],[[2814,79],[2800,95],[2810,104],[2802,101],[2789,119],[2801,117],[2820,100]],[[2618,-18],[2615,-3],[2637,15],[2635,-17]],[[3112,816],[3105,825],[3111,833],[3103,831],[3092,845],[3094,859],[3085,861],[3094,865],[3106,848],[3116,828]],[[1007,649],[990,655],[999,661],[992,680],[1017,674]],[[457,1231],[475,1257],[479,1246]],[[-1,1237],[5,1254],[7,1239]],[[-59,1253],[-3,1234],[-41,1234]],[[1220,818],[1194,823],[1204,844],[1225,829]],[[655,59],[619,62],[629,66],[628,84],[636,81],[649,81],[644,75]],[[917,1200],[923,1214],[909,1214],[931,1215],[924,1232],[946,1222],[944,1219],[949,1206],[936,1214],[938,1203],[934,1212],[932,1202]],[[879,1212],[867,1222],[855,1226],[855,1246]],[[896,1238],[887,1242],[888,1245]],[[2379,441],[2383,465],[2367,447],[2363,452],[2369,471],[2394,468],[2389,459],[2399,457],[2398,450],[2385,457]],[[509,243],[483,257],[480,267],[492,280]],[[768,1218],[765,1236],[774,1223]],[[1716,1232],[1710,1235],[1722,1236]],[[2604,564],[2582,594],[2555,586],[2581,604],[2564,615],[2566,629],[2588,606],[2582,598]],[[2764,1221],[2765,1232],[2772,1227]],[[737,862],[700,880],[712,879],[724,894],[738,886],[728,871]],[[1594,817],[1580,825],[1629,832],[1624,819]],[[2168,244],[2159,247],[2158,278],[2165,273],[2166,286],[2184,256],[2176,263],[2164,256]],[[1221,1092],[1240,1097],[1244,1081],[1237,1087],[1229,1066],[1221,1066]],[[2289,1199],[2286,1214],[2296,1221]],[[1967,927],[1970,972],[1977,973],[1982,943]],[[2773,1210],[2767,1216],[2777,1219]],[[969,1187],[956,1190],[964,1201],[956,1214],[970,1201]],[[2785,1184],[2787,1213],[2791,1188]],[[431,1091],[429,1101],[436,1113],[422,1125],[434,1142],[430,1121],[436,1115],[445,1128],[450,1112],[442,1116],[441,1096]],[[816,1195],[818,1209],[820,1201],[829,1206],[830,1197]],[[1217,1192],[1211,1202],[1218,1207],[1242,1208]],[[1193,943],[1195,963],[1186,968],[1204,976],[1206,966],[1213,976],[1215,964]],[[1958,1188],[1959,1196],[1979,1205]],[[2806,1188],[2796,1199],[2803,1205]],[[2550,1084],[2536,1095],[2528,1087],[2530,1115],[2545,1112]],[[521,467],[512,492],[523,483],[548,502],[544,479],[527,480]],[[985,1194],[978,1197],[984,1202]],[[3068,988],[3056,989],[3023,1023],[3039,1023],[3033,1018],[3053,1000],[3068,1005]],[[1116,1184],[1112,1191],[1129,1200],[1130,1190],[1121,1194]],[[926,1188],[933,1199],[942,1196]],[[717,140],[692,143],[705,166],[716,158]],[[3885,3],[3898,25],[3892,42],[3902,41],[3916,17],[3896,10],[3899,23]],[[1305,1189],[1301,1196],[1320,1194]],[[2313,1182],[2306,1194],[2318,1186]],[[1526,1184],[1530,1193],[1535,1187]],[[1208,787],[1205,794],[1196,789],[1188,806],[1195,817],[1200,810],[1209,815]],[[1124,408],[1095,426],[1102,439],[1129,413]],[[1179,1179],[1177,1191],[1194,1192]],[[1074,-47],[1080,-27],[1116,-35]],[[558,1138],[559,1153],[532,1191],[564,1150]],[[540,1083],[533,1097],[540,1121],[547,1100],[579,1103],[564,1095],[538,1100],[546,1090]],[[693,815],[689,835],[724,846]],[[1070,92],[1074,117],[1098,116],[1087,110],[1084,93]],[[3116,1177],[3104,1185],[3116,1185]],[[2867,1093],[2850,1099],[2858,1101],[2854,1116],[2870,1108],[2863,1122],[2869,1126],[2872,1108],[2880,1110]],[[1341,272],[1341,291],[1362,291],[1387,310],[1386,328],[1394,321],[1391,308],[1373,295],[1359,282],[1344,289]],[[2814,1156],[2793,1165],[2794,1182],[2806,1179]],[[154,1154],[129,1168],[137,1168],[131,1180]],[[921,1170],[921,1180],[929,1178]],[[1150,815],[1143,825],[1137,815],[1124,826],[1139,828],[1135,839],[1163,826],[1154,818],[1148,827]],[[3247,59],[3240,94],[3250,96],[3258,76]],[[2843,927],[2840,936],[2844,955],[2849,948],[2855,957],[2862,943],[2853,943],[2853,928]],[[2060,1155],[2051,1160],[2063,1165],[2058,1170],[2075,1176],[2074,1156]],[[980,1169],[976,1176],[991,1173]],[[412,482],[382,511],[360,510],[381,536],[387,531],[379,516]],[[2089,812],[2084,820],[2102,851],[2100,865],[2108,846]],[[3165,299],[3149,301],[3155,314],[3183,317]],[[160,1146],[159,1163],[168,1169],[178,1153]],[[904,818],[900,843],[919,848],[928,836],[918,840]],[[1447,1015],[1449,1047],[1434,1049],[1449,1053],[1441,1059],[1452,1063],[1458,1042]],[[892,550],[877,557],[873,576],[889,579],[883,566],[895,559]],[[383,1156],[388,1166],[396,1158]],[[2510,785],[2499,801],[2513,801],[2516,810],[2528,794]],[[475,1142],[459,1143],[466,1161],[475,1159],[476,1149],[467,1147]],[[294,398],[321,408],[322,390],[304,390]],[[2480,789],[2466,826],[2484,809],[2490,791]],[[3222,1139],[3215,1143],[3229,1154]],[[3018,796],[3001,808],[3013,825],[3022,810]],[[1123,1141],[1108,1143],[1110,1151]],[[2285,1137],[2276,1151],[2288,1145]],[[405,1125],[400,1149],[419,1143],[412,1138],[417,1129]],[[1621,109],[1607,128],[1617,127],[1619,136],[1627,134],[1629,116]],[[2882,1134],[2874,1143],[2881,1147]],[[-30,481],[-30,508],[-20,514],[-18,486]],[[2367,1125],[2349,1140],[2358,1142]],[[3611,-7],[3584,15],[3582,29],[3599,26],[3599,14],[3590,17],[3606,1]],[[127,956],[122,981],[138,984],[140,970],[128,964],[137,962]],[[1280,1128],[1288,1138],[1292,1133]],[[762,824],[773,836],[776,803],[766,803]],[[897,1121],[888,1126],[891,1137]],[[38,454],[27,466],[36,466],[38,481],[54,479]],[[3218,416],[3195,443],[3213,439],[3224,426]],[[788,1044],[756,1055],[753,1079],[758,1061],[781,1058]],[[528,191],[518,195],[527,212],[538,210],[539,199]],[[251,572],[220,580],[215,599]],[[2836,1114],[2833,1132],[2843,1121]],[[1541,543],[1532,559],[1514,566],[1533,570],[1545,558]],[[1804,333],[1777,335],[1808,353]],[[419,1076],[414,1086],[401,1086],[405,1095],[428,1089],[430,1080]],[[2336,1118],[2349,1130],[2354,1119]],[[1261,1122],[1256,1128],[1267,1129]],[[-49,301],[-55,328],[-40,314],[-41,323],[-27,324]],[[1691,233],[1666,240],[1668,251],[1695,240]],[[3648,-61],[3636,-56],[3628,-31],[3644,-42]],[[155,872],[136,884],[157,893],[171,884],[150,882]],[[1274,1126],[1282,1113],[1269,1113]],[[643,361],[633,375],[664,383]],[[1421,1088],[1427,1101],[1419,1112],[1450,1120],[1430,1110],[1429,1091]],[[1408,296],[1398,317],[1406,311],[1424,322],[1417,316],[1423,306],[1416,310],[1417,297]],[[1025,30],[1010,34],[1014,50],[1028,47]],[[1243,1098],[1233,1109],[1222,1098],[1222,1107],[1232,1113],[1252,1101]],[[2763,1098],[2762,1107],[2764,1113],[2773,1101]],[[609,1095],[591,1108],[598,1113]],[[824,1106],[811,1109],[823,1113]],[[1296,1095],[1286,1112],[1301,1112],[1308,1099]],[[2314,671],[2318,681],[2338,686],[2340,674]],[[2352,1090],[2348,1109],[2358,1102]],[[665,249],[673,277],[682,267],[675,250]],[[132,219],[116,234],[121,256],[129,228],[136,233]],[[2023,1094],[2013,1107],[2024,1105]],[[1262,1095],[1257,1101],[1263,1105]],[[-40,277],[-57,290],[-49,300],[-36,291]],[[614,1091],[634,1103],[631,1092]],[[1519,360],[1501,372],[1503,384],[1511,368],[1542,376]],[[1374,1681],[1382,1681],[1387,1662],[1373,1657]],[[1536,595],[1533,608],[1542,618],[1551,599]],[[1115,1089],[1098,1099],[1110,1101]],[[780,533],[765,534],[758,545],[739,541],[762,553],[766,537],[788,542]],[[2976,1091],[2970,1098],[2979,1100]],[[184,157],[167,166],[168,175],[193,166]],[[350,391],[352,414],[370,393]],[[2777,925],[2762,927],[2763,950],[2756,953],[2765,952]],[[885,1074],[887,1093],[894,1080]],[[220,46],[214,53],[208,73],[229,56]],[[2165,1078],[2166,1087],[2185,1089],[2173,1078]],[[2013,1080],[2004,1083],[2012,1089]],[[1201,448],[1187,468],[1205,473]],[[97,1075],[89,1084],[103,1082]],[[2961,623],[2979,632],[2973,635],[2987,641],[2985,649],[2997,642],[2997,629],[2989,635]],[[169,14],[177,53],[181,19]],[[1710,367],[1717,396],[1728,394],[1720,383],[1735,377],[1721,379]],[[516,101],[509,121],[515,127],[526,104]],[[954,300],[937,314],[943,320],[962,307]],[[1502,483],[1494,503],[1506,504],[1512,494]],[[1242,1059],[1237,1075],[1244,1079]],[[156,549],[161,570],[179,564]],[[2209,1071],[2204,1076],[2215,1078]],[[2948,645],[2940,659],[2960,660],[2959,649]],[[869,1062],[875,1075],[884,1073]],[[103,1061],[98,1065],[112,1071]],[[2171,1064],[2165,1070],[2180,1071]],[[1377,1052],[1369,1061],[1380,1070]],[[867,1051],[855,1067],[869,1062]],[[837,1039],[831,1064],[838,1051]],[[577,52],[569,61],[587,69],[594,63]],[[1269,1035],[1251,1063],[1268,1049]],[[2187,1042],[2173,1062],[2192,1063],[2180,1058]],[[2066,1044],[2063,1054],[2054,1050],[2056,1063],[2074,1051]],[[2187,2063],[2168,2050],[2160,2056],[2162,2065],[2173,2058],[2181,2076],[2179,2063]],[[1228,1052],[1224,1061],[1235,1062]],[[1207,1048],[1204,1059],[1213,1057]],[[1588,407],[1587,430],[1603,454]],[[3099,918],[3079,933],[3067,931],[3082,938],[3083,948]],[[1172,1041],[1167,1049],[1188,1056]],[[667,206],[686,234],[681,217],[687,207]],[[3005,1048],[3002,1054],[3010,1054]],[[607,1036],[600,1045],[607,1047]],[[3027,408],[3018,437],[3040,409]],[[2659,1028],[2649,1039],[2663,1044]],[[278,1036],[275,1043],[302,1039]],[[1384,933],[1369,946],[1395,949]],[[2854,1026],[2832,1041],[2812,1040],[2833,1042]],[[904,-53],[924,-33],[938,-38]],[[1888,160],[1881,192],[1897,173]],[[2054,529],[2037,531],[2060,542],[2067,533]],[[242,131],[227,150],[252,143]],[[2679,732],[2677,753],[2685,758],[2690,748]],[[194,326],[194,339],[182,343],[195,351],[199,342],[206,345]],[[1014,382],[1016,399],[1004,392],[1001,403],[1016,402],[1023,387]],[[1585,599],[1572,620],[1591,617]],[[3682,-62],[3689,-53],[3709,-52],[3706,-60]],[[2719,687],[2730,713],[2742,704],[2732,707],[2730,690]],[[876,1018],[873,1027],[880,1027]],[[2600,185],[2592,187],[2593,213],[2601,200]],[[1731,505],[1736,485],[1719,485]],[[1830,190],[1831,208],[1849,193]],[[1792,153],[1788,172],[1801,169],[1799,154]],[[2811,905],[2797,933],[2822,907]],[[1446,1848],[1453,1837],[1432,1822]],[[283,185],[282,196],[304,205],[302,192],[294,197]],[[2511,421],[2498,426],[2507,448]],[[2398,414],[2381,423],[2378,433],[2396,419],[2419,424]],[[606,1009],[610,1021],[615,1016]],[[3580,33],[3574,49],[3595,48]],[[1211,1019],[1231,1017],[1224,1009],[1209,1009]],[[783,918],[764,928],[759,918],[756,932],[780,928]],[[1260,568],[1238,573],[1254,584]],[[2085,1003],[2080,1013],[2092,1012]],[[912,1005],[906,1008],[912,1013]],[[2282,559],[2275,571],[2261,568],[2285,582]],[[616,711],[652,733],[660,729]],[[3115,745],[3103,776],[3115,776],[3108,775],[3110,764],[3119,766]],[[1509,584],[1508,597],[1519,605],[1519,589]],[[614,33],[612,54],[595,63],[621,56]],[[2136,92],[2137,118],[2148,97]],[[2650,988],[2644,998],[2633,994],[2643,1002]],[[1086,991],[1085,998],[1092,992]],[[3111,309],[3104,338],[3121,311]],[[1390,642],[1375,657],[1404,648]],[[2705,979],[2699,986],[2708,986]],[[3619,118],[3624,147],[3613,171],[3631,135]],[[2193,-19],[2185,-3],[2209,-14]],[[2670,948],[2658,980],[2671,964]],[[3091,967],[3094,978],[3104,973]],[[2817,954],[2803,969],[2808,977],[2808,967],[2823,963]],[[2809,941],[2792,953],[2808,959]],[[3134,851],[3116,877],[3130,873]],[[2132,520],[2120,529],[2143,536]],[[3083,948],[3071,963],[3076,974]],[[3068,708],[3053,710],[3054,729]],[[2942,964],[2932,965],[2926,970]],[[2911,212],[2901,222],[2908,238],[2906,220],[2916,227],[2922,218],[2916,223]],[[3268,721],[3241,753],[3270,729]],[[1084,435],[1083,444],[1091,442],[1093,426],[1084,426]],[[1231,952],[1234,964],[1241,959]],[[418,415],[409,426],[425,437]],[[857,56],[852,75],[861,81],[869,70],[856,69]],[[1046,466],[1040,483],[1054,489]],[[3827,-6],[3818,-5],[3825,1],[3810,25],[3817,17],[3830,6]],[[158,243],[145,245],[147,257],[155,257]],[[3890,48],[3880,84],[3889,82],[3895,92],[3895,79],[3884,73]],[[970,351],[963,371],[977,369]],[[339,222],[337,244],[350,234]],[[47,937],[26,950],[59,942]],[[1836,468],[1809,473],[1807,483]],[[658,388],[654,406],[658,399],[671,410],[681,401],[666,404]],[[2405,936],[2394,940],[2398,950]],[[1669,300],[1668,310],[1648,319],[1685,307]],[[1558,-57],[1555,-49],[1564,-43],[1573,-50]],[[3125,932],[3111,948],[3124,943]],[[1633,633],[1617,641],[1633,649]],[[216,-49],[194,-47],[212,-37]],[[2814,924],[2809,941],[2820,929]],[[2868,931],[2859,938],[2865,941]],[[3055,926],[3057,940],[3067,931]],[[350,519],[333,536],[364,520]],[[2385,141],[2393,162],[2407,167]],[[129,729],[129,744],[140,744],[140,736]],[[750,903],[743,905],[745,935]],[[87,920],[70,935],[88,930]],[[183,920],[176,922],[182,935]],[[634,887],[631,898],[630,919],[639,896]],[[1193,917],[1180,933],[1199,923]],[[461,386],[458,402],[465,403],[470,391]],[[3142,919],[3125,928],[3138,931]],[[2042,285],[2028,295],[2043,302],[2039,293],[2047,291]],[[931,920],[929,930],[939,921]],[[2857,918],[2853,928],[2862,927]],[[1466,920],[1468,928],[1478,921]],[[3157,796],[3142,808],[3145,822]],[[1720,247],[1722,261],[1741,272]],[[3110,891],[3100,899],[3099,917]],[[3045,909],[3040,916],[3048,917]],[[1260,789],[1243,793],[1244,807]],[[3099,360],[3085,367],[3090,373],[3102,369]],[[100,905],[97,912],[106,911]],[[662,294],[646,300],[666,307]],[[11,896],[6,911],[16,901]],[[139,896],[130,898],[148,910]],[[2688,899],[2679,909],[2688,909]],[[1269,315],[1264,348],[1271,348]],[[756,165],[745,169],[753,183],[761,178],[753,174]],[[3655,84],[3644,93],[3651,98],[3653,95],[3662,94]],[[215,599],[193,627],[213,612]],[[1311,35],[1305,67],[1312,68]],[[3110,891],[3115,878],[3106,878]],[[1704,881],[1697,884],[1705,890]],[[851,409],[842,421],[855,429]],[[3057,874],[3046,875],[3048,886],[3060,880]],[[1196,869],[1194,875],[1199,885]],[[959,415],[974,432],[975,418]],[[695,858],[690,877],[701,868]],[[3123,-23],[3106,-18],[3114,-7]],[[161,749],[137,758],[146,764]],[[3094,865],[3089,872],[3099,872]],[[3057,864],[3046,871],[3057,872]],[[1254,811],[1242,818],[1262,825]],[[1030,251],[1023,272],[1038,259]],[[893,853],[888,868],[903,855]],[[763,636],[765,645],[753,649],[761,654],[772,645]],[[3063,850],[3061,866],[3074,857]],[[972,492],[959,495],[957,512]],[[775,302],[770,313],[789,314]],[[654,233],[667,230],[663,223],[652,223]],[[596,690],[580,696],[592,695],[590,705],[602,696]],[[730,852],[719,855],[727,861]],[[2363,344],[2358,354],[2365,360],[2371,352]],[[607,850],[600,854],[596,859]],[[2444,400],[2439,415],[2446,413],[2453,401]],[[-44,334],[-57,346],[-46,352]],[[808,843],[799,847],[811,858]],[[847,837],[838,849],[848,857]],[[1375,36],[1375,51],[1389,59]],[[3565,-24],[3565,-16],[3569,-1],[3573,-22]],[[1630,-54],[1627,-40],[1642,-41]],[[903,618],[896,627],[904,646]],[[1222,604],[1196,609],[1205,615]],[[2302,834],[2289,835],[2302,844]],[[831,417],[824,420],[835,431],[839,423]],[[63,531],[55,550],[70,539]],[[1158,831],[1153,841],[1163,835]],[[2036,152],[2026,164],[2039,168]],[[2232,822],[2231,838],[2238,836]],[[2220,542],[2212,545],[2218,567]],[[850,1],[844,18],[855,19]],[[525,820],[527,833],[532,821]],[[2163,756],[2151,759],[2163,772]],[[2521,819],[2511,826],[2513,831]],[[2726,79],[2719,90],[2737,89]],[[2507,565],[2505,575],[2523,580]],[[2570,812],[2569,825],[2580,826],[2582,819],[2570,823]],[[2393,162],[2369,165],[2384,171]],[[1723,311],[1711,319],[1727,324]],[[48,522],[35,525],[41,538]],[[929,810],[922,824],[938,817]],[[258,88],[258,105],[269,90]],[[945,797],[930,798],[932,808],[941,803]],[[3792,303],[3783,314],[3822,309],[3794,310]],[[1667,469],[1662,485],[1677,474]],[[3117,806],[3113,815],[3122,812]],[[645,640],[643,646],[650,656],[655,648]],[[1710,320],[1697,333],[1702,342]],[[3862,76],[3871,92],[3879,86]],[[264,46],[244,64],[263,56]],[[2699,56],[2705,79],[2710,68]],[[1496,194],[1489,217],[1501,203]],[[3027,171],[3042,149],[3034,149]],[[1599,631],[1597,643],[1612,640]],[[2619,796],[2611,805],[2625,800]],[[199,130],[213,140],[222,134]],[[660,663],[652,673],[666,677]],[[919,562],[907,567],[915,578]],[[3205,292],[3199,312],[3213,294]],[[908,158],[925,170],[928,162]],[[757,26],[734,29],[753,34]],[[26,274],[16,271],[12,287]],[[1492,786],[1487,791],[1497,792]],[[447,557],[429,567],[455,562]],[[1037,528],[1034,544],[1045,542]],[[622,416],[614,422],[621,429],[627,423]],[[661,99],[659,117],[670,103]],[[633,612],[625,619],[641,626]],[[779,504],[781,520],[790,508]],[[1603,454],[1603,468],[1615,466]],[[621,183],[615,190],[625,201],[620,192],[630,188]],[[643,545],[640,565],[651,547]],[[443,756],[439,766],[448,766]],[[3843,-5],[3835,2],[3846,13]],[[4101,-55],[4080,-52],[4086,-45]],[[2172,553],[2172,571],[2181,560]],[[2089,755],[2095,764],[2099,758]],[[946,749],[936,758],[923,755],[941,761]],[[2063,109],[2046,118],[2047,127]],[[2863,215],[2872,226],[2885,224]],[[3460,0],[3452,19],[3463,13]],[[3090,82],[3102,62],[3094,62]],[[434,-50],[418,-44],[423,-36]],[[1297,531],[1291,536],[1302,553]],[[155,628],[141,641],[152,632],[189,629]],[[3106,42],[3106,55],[3118,48]],[[940,731],[927,734],[928,742]],[[1696,276],[1696,298],[1703,282]],[[1175,11],[1186,28],[1186,14]],[[2269,503],[2262,507],[2272,523]],[[1269,157],[1274,138],[1266,138]],[[2413,711],[2408,718],[2415,721]],[[2459,707],[2455,714],[2464,711]],[[618,577],[624,589],[632,580]],[[2720,-50],[2713,-31],[2722,-34]],[[676,697],[669,698],[684,705]],[[923,-27],[914,-14],[922,-9]],[[718,36],[707,42],[717,50]],[[1434,295],[1427,302],[1443,307]],[[2995,687],[2984,696],[2989,702]],[[2389,688],[2375,695],[2380,701]],[[538,688],[545,698],[549,697]],[[2427,413],[2422,431],[2434,417]],[[274,365],[268,377],[283,371]],[[691,677],[687,678],[687,692]],[[291,78],[281,84],[290,93]],[[183,4],[183,22],[191,5]],[[645,678],[627,681],[641,686]],[[843,2475],[833,2483],[836,2495]],[[1570,569],[1557,582],[1568,582]],[[-59,492],[-58,505],[-47,505]],[[1815,602],[1836,624],[1838,612],[1834,617]],[[841,570],[830,575],[834,586]],[[5,490],[-15,502],[-10,506]],[[708,663],[706,675],[716,675]],[[1016,481],[1030,495],[1028,483]],[[644,327],[631,328],[640,338]],[[741,660],[734,665],[740,670]],[[2981,376],[2978,389],[2990,383]],[[831,308],[829,330],[837,311]],[[220,75],[216,80],[222,91],[225,83]],[[1290,-15],[1278,-14],[1284,-3]],[[2725,607],[2721,619],[2735,611]],[[455,374],[452,381],[461,383],[465,378]],[[628,650],[614,651],[625,659]],[[2484,643],[2479,656],[2487,659]],[[2233,102],[2229,109],[2246,113]],[[966,97],[962,82],[953,82]],[[882,412],[869,417],[893,418]],[[2803,364],[2792,379],[2800,380]],[[158,393],[156,408],[166,398]],[[-60,648],[-64,654],[-56,654]],[[2293,483],[2297,500],[2301,485]],[[2679,643],[2662,650],[2680,652],[2673,649]],[[714,651],[704,646],[696,646]],[[207,-38],[201,-28],[212,-25]],[[3046,-15],[3037,-5],[3047,-2]],[[943,481],[933,489],[946,491]],[[2963,637],[2961,646],[2969,638]],[[3531,467],[3521,469],[3518,482]],[[120,257],[114,264],[130,266]],[[2948,632],[2954,642],[2963,637]],[[1503,297],[1506,316],[1512,313]],[[623,519],[618,531],[629,529]],[[927,467],[923,476],[937,475]],[[308,330],[294,333],[302,340]],[[1611,507],[1603,510],[1606,524]],[[285,564],[299,571],[304,565]],[[134,110],[145,103],[128,103]],[[671,623],[669,632],[676,631]],[[2890,40],[2898,53],[2904,48]],[[273,466],[274,478],[284,481]],[[1474,152],[1465,170],[1473,167]],[[1295,89],[1286,101],[1298,98]],[[2254,484],[2252,498],[2261,493]],[[657,87],[662,96],[671,89]],[[-14,348],[-25,353],[-24,363]],[[826,264],[828,271],[843,266]],[[1761,608],[1756,617],[1763,619]],[[3620,-26],[3611,-12],[3623,-18]],[[301,231],[299,242],[310,238]],[[652,610],[648,618],[661,614]],[[1553,38],[1544,43],[1561,46]],[[1285,418],[1290,429],[1296,420]],[[1023,599],[1017,601],[1022,608]],[[3096,344],[3090,353],[3099,358]],[[2122,590],[2114,599],[2128,597]],[[543,286],[543,297],[553,299]],[[1410,266],[1407,279],[1418,267]],[[749,-21],[742,-16],[749,-6]],[[732,584],[726,588],[733,593]],[[2255,586],[2243,590],[2255,590]],[[2093,1027],[2086,1020],[2078,1027]],[[1180,406],[1177,423],[1184,418]],[[2370,381],[2379,405],[2392,397],[2380,401]],[[1648,-30],[1641,-20],[1654,-24]],[[660,119],[662,134],[667,121]],[[252,491],[243,499],[251,503]],[[247,-10],[246,1],[255,2]],[[1105,473],[1112,462],[1103,462]],[[1564,511],[1572,524],[1574,515]],[[2389,368],[2379,372],[2391,377]],[[2165,1078],[2158,1064],[2158,1078]],[[1075,440],[1064,441],[1073,449]],[[811,302],[799,309],[806,313]],[[626,95],[619,97],[622,110]],[[1577,554],[1568,556],[1571,566]],[[939,436],[939,444],[951,446]],[[601,21],[597,29],[610,27]],[[2868,411],[2857,412],[2862,420]],[[223,156],[212,162],[220,166]],[[3555,22],[3553,37],[3561,23]],[[491,287],[484,294],[490,301]],[[243,21],[233,22],[234,31]],[[222,449],[212,459],[225,455]],[[1329,364],[1320,374],[1329,374]],[[508,180],[514,192],[518,185]],[[75,555],[69,560],[80,559]],[[2263,543],[2259,550],[2269,554]],[[1015,216],[1010,228],[1017,229]],[[2039,-15],[2030,-14],[2036,-5]],[[1871,541],[1870,551],[1877,542]],[[780,343],[771,348],[781,352]],[[660,316],[662,324],[671,317]],[[803,213],[807,220],[817,216]],[[2187,29],[2179,35],[2176,48]],[[243,305],[236,313],[244,316]],[[857,39],[859,46],[869,40]],[[3029,-22],[3021,-11],[3027,-9]],[[808,-51],[807,-40],[815,-46]],[[365,341],[372,332],[363,332]],[[1068,321],[1077,330],[1080,324]],[[364,313],[364,323],[372,323]],[[1034,219],[1026,220],[1034,229]],[[726,157],[722,168],[730,166]],[[3739,-50],[3729,-45],[3733,-39]],[[310,518],[300,526],[311,525]],[[414,238],[417,247],[424,242]],[[2090,1182],[2097,1187],[2100,1178]],[[161,172],[162,161],[155,161]],[[35,82],[28,91],[35,93]],[[566,319],[560,327],[568,329]],[[994,19],[997,30],[1002,23]],[[1008,442],[999,448],[1010,449]],[[-56,512],[-63,518],[-56,522]],[[246,262],[247,274],[253,272]],[[1724,45],[1719,54],[1727,54]],[[3073,-63],[3069,-54],[3077,-54]],[[2999,394],[2994,402],[3006,397]],[[3374,-52],[3372,-41],[3379,-44]],[[540,230],[532,233],[542,238]],[[2874,122],[2873,132],[2880,132]],[[1302,1566],[1315,1568],[1310,1562]],[[523,294],[517,301],[524,304]],[[502,269],[500,279],[507,277]],[[1268,55],[1273,64],[1277,58]],[[744,324],[747,334],[752,329]],[[607,417],[604,424],[614,422]],[[989,362],[984,370],[992,370]],[[1516,271],[1518,278],[1526,274]],[[788,202],[784,210],[793,208]],[[2383,494],[2381,501],[2389,496]],[[595,163],[592,173],[599,171]],[[1576,30],[1574,41],[1581,34]],[[1285,102],[1278,106],[1283,112]],[[1784,493],[1777,498],[1792,496]],[[213,12],[214,23],[219,17]],[[1311,453],[1308,460],[1317,459]],[[2772,311],[2767,316],[2776,319]],[[237,76],[234,82],[244,82]],[[3738,314],[3730,316],[3743,320]],[[575,413],[578,405],[571,405]],[[678,320],[672,325],[688,321]],[[3651,151],[3645,157],[3658,153]],[[3672,44],[3669,51],[3678,48]],[[122,327],[115,330],[121,335]],[[1697,470],[1691,474],[1699,477]],[[295,214],[291,220],[300,219]],[[3711,-50],[3709,-43],[3717,-47]],[[896,189],[891,195],[898,196]],[[1621,229],[1625,236],[1628,230]],[[520,242],[515,246],[528,244]],[[667,171],[662,175],[670,177]],[[2191,411],[2186,417],[2183,427]],[[1304,337],[1296,340],[1292,345]],[[3232,450],[3227,454],[3223,462]]] \ No newline at end of file diff --git a/test/test.js b/test/test.js index 98d1773..5df2555 100644 --- a/test/test.js +++ b/test/test.js @@ -3,17 +3,17 @@ import test from 'node:test'; import assert from 'node:assert/strict'; import earcut, {flatten, deviation} from '../src/earcut.js'; import fs from 'fs'; - -const expected = JSON.parse(fs.readFileSync(new URL('expected.json', import.meta.url))); +import expected from './expected.json' with {type: 'json'}; +import {readTilesFixture} from '../bench/tiles-fixture.js'; test('indices-2d', () => { const indices = earcut([10, 0, 0, 50, 60, 60, 70, 10]); - assert.deepEqual(indices, [1, 0, 3, 3, 2, 1]); + assert.deepEqual(indices, [1, 0, 3, 1, 3, 2]); }); test('indices-3d', () => { const indices = earcut([10, 0, 0, 0, 50, 0, 60, 60, 0, 70, 10, 0], null, 3); - assert.deepEqual(indices, [1, 0, 3, 3, 2, 1]); + assert.deepEqual(indices, [1, 0, 3, 1, 3, 2]); }); test('empty', () => { @@ -60,3 +60,62 @@ for (const id of Object.keys(expected.triangles)) { test('infinite-loop', () => { earcut([1, 2, 2, 2, 1, 2, 1, 1, 1, 2, 4, 1, 5, 1, 3, 2, 4, 2, 4, 1], [5], 2); }); + +test('mvt fixture has zero deviation', () => { + const polys = readTilesFixture(); + let nonzero = 0; + let firstIndex = -1; + let firstDev = 0; + let worstIndex = -1; + let worstDev = 0; + let sumDev = 0; + + for (let i = 0; i < polys.length; i++) { + const data = polys[i]; + const triangles = earcut(data.vertices, data.holes, data.dimensions); + const dev = deviation(data.vertices, data.holes, data.dimensions, triangles); + if (dev !== 0) { + if (firstIndex < 0) { + firstIndex = i; + firstDev = dev; + } + nonzero++; + sumDev += dev; + if (dev > worstDev) { + worstIndex = i; + worstDev = dev; + } + } + } + + assert.equal(polys.length, 119680); + assert.equal(nonzero, 0, + `${nonzero} polygons with nonzero deviation; first ${firstIndex}: ${firstDev}, ` + + `worst ${worstIndex}: ${worstDev}, sum ${sumDev}`); +}); + +// Regression for the hole-bridge block index (issue #183): a collinear-rich outer ring +// (integer grid, like MVT data) plus multiple holes used to drop a hole when filterPoints +// healed a collinear run across a block boundary, leaving the surviving edge outside its +// block's stale bbox so the leftward-ray scan false-skipped it. Assert full coverage. +test('block-index-collinear', () => { + const N = 30; + const outer = []; + for (let x = 0; x <= N; x++) outer.push([x, 0]); + for (let y = 1; y <= N; y++) outer.push([N, y]); + for (let x = N - 1; x >= 0; x--) outer.push([x, N]); + for (let y = N - 1; y >= 1; y--) outer.push([0, y]); + const rect = (x0, y0, w, h) => [[x0, y0], [x0, y0 + h], [x0 + w, y0 + h], [x0 + w, y0]]; + const rings = [outer, rect(5, 5, 2, 4), rect(2, 23, 1, 1)]; + + for (const rotation of [0, 90, 180, 270]) { + const theta = rotation * Math.PI / 180; + const xx = Math.round(Math.cos(theta)), xy = Math.round(-Math.sin(theta)); + const yx = Math.round(Math.sin(theta)), yy = Math.round(Math.cos(theta)); + const rotated = rings.map(ring => ring.map(([x, y]) => [xx * x + xy * y, yx * x + yy * y])); + const data = flatten(rotated); + const indices = earcut(data.vertices, data.holes, data.dimensions); + const err = deviation(data.vertices, data.holes, data.dimensions, indices); + assert.ok(err < 1e-9, `rotation ${rotation}: deviation ${err} (hole dropped?)`); + } +});