@motionscript/geo 0.1.0-alpha.0 → 0.1.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/fsum.js", "../../../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/merge.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/math.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/noop.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/stream.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/area.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/cartesian.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/bounds.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/compose.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/rotation.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/circle.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/buffer.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/pointEqual.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/rejoin.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/polygonContains.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/index.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/antimeridian.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/circle.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/line.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/rectangle.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/identity.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/area.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/bounds.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/centroid.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/context.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/measure.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/string.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/index.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/transform.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/fit.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/resample.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/index.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/conic.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/cylindricalEqualArea.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/conicEqualArea.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/azimuthal.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/mercator.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/equirectangular.js", "../../../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/orthographic.js", "../../src/border/format.ts", "../../src/border/geo-border.ts", "../../src/border/geometry.ts", "../../src/border/simplify.ts", "../../src/border/registry.ts", "../../src/border/loader.ts", "../../src/border/selection.ts", "../../src/globe/atmosphere.ts", "../../src/globe/data/ne-110m.ts", "../../src/globe/world.ts", "../../src/globe/borders.ts", "../../src/globe/globe.ts", "../../src/globe/globe-places.ts", "../../src/globe/places.ts", "../../src/globe/projection.ts", "../../src/globe/world-map.ts", "../../src/nodes.ts"],
4
- "sourcesContent": ["// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423\nexport class Adder {\n constructor() {\n this._partials = new Float64Array(32);\n this._n = 0;\n }\n add(x) {\n const p = this._partials;\n let i = 0;\n for (let j = 0; j < this._n && j < 32; j++) {\n const y = p[j],\n hi = x + y,\n lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x);\n if (lo) p[i++] = lo;\n x = hi;\n }\n p[i] = x;\n this._n = i + 1;\n return this;\n }\n valueOf() {\n const p = this._partials;\n let n = this._n, x, y, lo, hi = 0;\n if (n > 0) {\n hi = p[--n];\n while (n > 0) {\n x = hi;\n y = p[--n];\n hi = x + y;\n lo = y - (hi - x);\n if (lo) break;\n }\n if (n > 0 && ((lo < 0 && p[n - 1] < 0) || (lo > 0 && p[n - 1] > 0))) {\n y = lo * 2;\n x = hi + y;\n if (y == x - hi) hi = x;\n }\n }\n return hi;\n }\n}\n\nexport function fsum(values, valueof) {\n const adder = new Adder();\n if (valueof === undefined) {\n for (let value of values) {\n if (value = +value) {\n adder.add(value);\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if (value = +valueof(value, ++index, values)) {\n adder.add(value);\n }\n }\n }\n return +adder;\n}\n\nexport function fcumsum(values, valueof) {\n const adder = new Adder();\n let index = -1;\n return Float64Array.from(values, valueof === undefined\n ? v => adder.add(+v || 0)\n : v => adder.add(+valueof(v, ++index, values) || 0)\n );\n}\n", "function* flatten(arrays) {\n for (const array of arrays) {\n yield* array;\n }\n}\n\nexport default function merge(arrays) {\n return Array.from(flatten(arrays));\n}\n", "export var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var quarterPi = pi / 4;\nexport var tau = pi * 2;\n\nexport var degrees = 180 / pi;\nexport var radians = pi / 180;\n\nexport var abs = Math.abs;\nexport var atan = Math.atan;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var ceil = Math.ceil;\nexport var exp = Math.exp;\nexport var floor = Math.floor;\nexport var hypot = Math.hypot;\nexport var log = Math.log;\nexport var pow = Math.pow;\nexport var sin = Math.sin;\nexport var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };\nexport var sqrt = Math.sqrt;\nexport var tan = Math.tan;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\n\nexport function haversin(x) {\n return (x = sin(x / 2)) * x;\n}\n", "export default function noop() {}\n", "function streamGeometry(geometry, stream) {\n if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\n streamGeometryType[geometry.type](geometry, stream);\n }\n}\n\nvar streamObjectType = {\n Feature: function(object, stream) {\n streamGeometry(object.geometry, stream);\n },\n FeatureCollection: function(object, stream) {\n var features = object.features, i = -1, n = features.length;\n while (++i < n) streamGeometry(features[i].geometry, stream);\n }\n};\n\nvar streamGeometryType = {\n Sphere: function(object, stream) {\n stream.sphere();\n },\n Point: function(object, stream) {\n object = object.coordinates;\n stream.point(object[0], object[1], object[2]);\n },\n MultiPoint: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);\n },\n LineString: function(object, stream) {\n streamLine(object.coordinates, stream, 0);\n },\n MultiLineString: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) streamLine(coordinates[i], stream, 0);\n },\n Polygon: function(object, stream) {\n streamPolygon(object.coordinates, stream);\n },\n MultiPolygon: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) streamPolygon(coordinates[i], stream);\n },\n GeometryCollection: function(object, stream) {\n var geometries = object.geometries, i = -1, n = geometries.length;\n while (++i < n) streamGeometry(geometries[i], stream);\n }\n};\n\nfunction streamLine(coordinates, stream, closed) {\n var i = -1, n = coordinates.length - closed, coordinate;\n stream.lineStart();\n while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);\n stream.lineEnd();\n}\n\nfunction streamPolygon(coordinates, stream) {\n var i = -1, n = coordinates.length;\n stream.polygonStart();\n while (++i < n) streamLine(coordinates[i], stream, 1);\n stream.polygonEnd();\n}\n\nexport default function(object, stream) {\n if (object && streamObjectType.hasOwnProperty(object.type)) {\n streamObjectType[object.type](object, stream);\n } else {\n streamGeometry(object, stream);\n }\n}\n", "import {Adder} from \"d3-array\";\nimport {atan2, cos, quarterPi, radians, sin, tau} from \"./math.js\";\nimport noop from \"./noop.js\";\nimport stream from \"./stream.js\";\n\nexport var areaRingSum = new Adder();\n\n// hello?\n\nvar areaSum = new Adder(),\n lambda00,\n phi00,\n lambda0,\n cosPhi0,\n sinPhi0;\n\nexport var areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaRingSum = new Adder();\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n var areaRing = +areaRingSum;\n areaSum.add(areaRing < 0 ? tau + areaRing : areaRing);\n this.lineStart = this.lineEnd = this.point = noop;\n },\n sphere: function() {\n areaSum.add(tau);\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaRingEnd() {\n areaPoint(lambda00, phi00);\n}\n\nfunction areaPointFirst(lambda, phi) {\n areaStream.point = areaPoint;\n lambda00 = lambda, phi00 = phi;\n lambda *= radians, phi *= radians;\n lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi);\n}\n\nfunction areaPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n phi = phi / 2 + quarterPi; // half the angular distance from south pole\n\n // Spherical excess E for a spherical triangle with vertices: south pole,\n // previous point, current point. Uses a formula derived from Cagnoli\u2019s\n // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).\n var dLambda = lambda - lambda0,\n sdLambda = dLambda >= 0 ? 1 : -1,\n adLambda = sdLambda * dLambda,\n cosPhi = cos(phi),\n sinPhi = sin(phi),\n k = sinPhi0 * sinPhi,\n u = cosPhi0 * cosPhi + k * cos(adLambda),\n v = k * sdLambda * sin(adLambda);\n areaRingSum.add(atan2(v, u));\n\n // Advance the previous points.\n lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n}\n\nexport default function(object) {\n areaSum = new Adder();\n stream(object, areaStream);\n return areaSum * 2;\n}\n", "import {asin, atan2, cos, sin, sqrt} from \"./math.js\";\n\nexport function spherical(cartesian) {\n return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];\n}\n\nexport function cartesian(spherical) {\n var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi);\n return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];\n}\n\nexport function cartesianDot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nexport function cartesianCross(a, b) {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n// TODO return a\nexport function cartesianAddInPlace(a, b) {\n a[0] += b[0], a[1] += b[1], a[2] += b[2];\n}\n\nexport function cartesianScale(vector, k) {\n return [vector[0] * k, vector[1] * k, vector[2] * k];\n}\n\n// TODO return d\nexport function cartesianNormalizeInPlace(d) {\n var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n d[0] /= l, d[1] /= l, d[2] /= l;\n}\n", "import {Adder} from \"d3-array\";\nimport {areaStream, areaRingSum} from \"./area.js\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace, spherical} from \"./cartesian.js\";\nimport {abs, degrees, epsilon, radians} from \"./math.js\";\nimport stream from \"./stream.js\";\n\nvar lambda0, phi0, lambda1, phi1, // bounds\n lambda2, // previous lambda-coordinate\n lambda00, phi00, // first point\n p0, // previous 3D point\n deltaSum,\n ranges,\n range;\n\nvar boundsStream = {\n point: boundsPoint,\n lineStart: boundsLineStart,\n lineEnd: boundsLineEnd,\n polygonStart: function() {\n boundsStream.point = boundsRingPoint;\n boundsStream.lineStart = boundsRingStart;\n boundsStream.lineEnd = boundsRingEnd;\n deltaSum = new Adder();\n areaStream.polygonStart();\n },\n polygonEnd: function() {\n areaStream.polygonEnd();\n boundsStream.point = boundsPoint;\n boundsStream.lineStart = boundsLineStart;\n boundsStream.lineEnd = boundsLineEnd;\n if (areaRingSum < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n else if (deltaSum > epsilon) phi1 = 90;\n else if (deltaSum < -epsilon) phi0 = -90;\n range[0] = lambda0, range[1] = lambda1;\n },\n sphere: function() {\n lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n }\n};\n\nfunction boundsPoint(lambda, phi) {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n}\n\nfunction linePoint(lambda, phi) {\n var p = cartesian([lambda * radians, phi * radians]);\n if (p0) {\n var normal = cartesianCross(p0, p),\n equatorial = [normal[1], -normal[0], 0],\n inflection = cartesianCross(equatorial, normal);\n cartesianNormalizeInPlace(inflection);\n inflection = spherical(inflection);\n var delta = lambda - lambda2,\n sign = delta > 0 ? 1 : -1,\n lambdai = inflection[0] * degrees * sign,\n phii,\n antimeridian = abs(delta) > 180;\n if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = inflection[1] * degrees;\n if (phii > phi1) phi1 = phii;\n } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = -inflection[1] * degrees;\n if (phii < phi0) phi0 = phii;\n } else {\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n }\n if (antimeridian) {\n if (lambda < lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n } else {\n if (lambda1 >= lambda0) {\n if (lambda < lambda0) lambda0 = lambda;\n if (lambda > lambda1) lambda1 = lambda;\n } else {\n if (lambda > lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n }\n }\n } else {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n }\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n p0 = p, lambda2 = lambda;\n}\n\nfunction boundsLineStart() {\n boundsStream.point = linePoint;\n}\n\nfunction boundsLineEnd() {\n range[0] = lambda0, range[1] = lambda1;\n boundsStream.point = boundsPoint;\n p0 = null;\n}\n\nfunction boundsRingPoint(lambda, phi) {\n if (p0) {\n var delta = lambda - lambda2;\n deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n } else {\n lambda00 = lambda, phi00 = phi;\n }\n areaStream.point(lambda, phi);\n linePoint(lambda, phi);\n}\n\nfunction boundsRingStart() {\n areaStream.lineStart();\n}\n\nfunction boundsRingEnd() {\n boundsRingPoint(lambda00, phi00);\n areaStream.lineEnd();\n if (abs(deltaSum) > epsilon) lambda0 = -(lambda1 = 180);\n range[0] = lambda0, range[1] = lambda1;\n p0 = null;\n}\n\n// Finds the left-right distance between two longitudes.\n// This is almost the same as (lambda1 - lambda0 + 360\u00B0) % 360\u00B0, except that we want\n// the distance between \u00B1180\u00B0 to be 360\u00B0.\nfunction angle(lambda0, lambda1) {\n return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;\n}\n\nfunction rangeCompare(a, b) {\n return a[0] - b[0];\n}\n\nfunction rangeContains(range, x) {\n return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n}\n\nexport default function(feature) {\n var i, n, a, b, merged, deltaMax, delta;\n\n phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n ranges = [];\n stream(feature, boundsStream);\n\n // First, sort ranges by their minimum longitudes.\n if (n = ranges.length) {\n ranges.sort(rangeCompare);\n\n // Then, merge any ranges that overlap.\n for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {\n b = ranges[i];\n if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {\n if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n } else {\n merged.push(a = b);\n }\n }\n\n // Finally, find the largest gap between the merged ranges.\n // The final bounding box will be the inverse of this gap.\n for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {\n b = merged[i];\n if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0 = b[0], lambda1 = a[1];\n }\n }\n\n ranges = range = null;\n\n return lambda0 === Infinity || phi0 === Infinity\n ? [[NaN, NaN], [NaN, NaN]]\n : [[lambda0, phi0], [lambda1, phi1]];\n}\n", "export default function(a, b) {\n\n function compose(x, y) {\n return x = a(x, y), b(x[0], x[1]);\n }\n\n if (a.invert && b.invert) compose.invert = function(x, y) {\n return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n };\n\n return compose;\n}\n", "import compose from \"./compose.js\";\nimport {abs, asin, atan2, cos, degrees, pi, radians, sin, tau} from \"./math.js\";\n\nfunction rotationIdentity(lambda, phi) {\n if (abs(lambda) > pi) lambda -= Math.round(lambda / tau) * tau;\n return [lambda, phi];\n}\n\nrotationIdentity.invert = rotationIdentity;\n\nexport function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))\n : rotationLambda(deltaLambda))\n : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)\n : rotationIdentity);\n}\n\nfunction forwardRotationLambda(deltaLambda) {\n return function(lambda, phi) {\n lambda += deltaLambda;\n if (abs(lambda) > pi) lambda -= Math.round(lambda / tau) * tau;\n return [lambda, phi];\n };\n}\n\nfunction rotationLambda(deltaLambda) {\n var rotation = forwardRotationLambda(deltaLambda);\n rotation.invert = forwardRotationLambda(-deltaLambda);\n return rotation;\n}\n\nfunction rotationPhiGamma(deltaPhi, deltaGamma) {\n var cosDeltaPhi = cos(deltaPhi),\n sinDeltaPhi = sin(deltaPhi),\n cosDeltaGamma = cos(deltaGamma),\n sinDeltaGamma = sin(deltaGamma);\n\n function rotation(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaPhi + x * sinDeltaPhi;\n return [\n atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),\n asin(k * cosDeltaGamma + y * sinDeltaGamma)\n ];\n }\n\n rotation.invert = function(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaGamma - y * sinDeltaGamma;\n return [\n atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),\n asin(k * cosDeltaPhi - x * sinDeltaPhi)\n ];\n };\n\n return rotation;\n}\n\nexport default function(rotate) {\n rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);\n\n function forward(coordinates) {\n coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n }\n\n forward.invert = function(coordinates) {\n coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n };\n\n return forward;\n}\n", "import {cartesian, cartesianNormalizeInPlace, spherical} from \"./cartesian.js\";\nimport constant from \"./constant.js\";\nimport {acos, cos, degrees, epsilon, radians, sin, tau} from \"./math.js\";\nimport {rotateRadians} from \"./rotation.js\";\n\n// Generates a circle centered at [0\u00B0, 0\u00B0], with a given radius and precision.\nexport function circleStream(stream, radius, delta, direction, t0, t1) {\n if (!delta) return;\n var cosRadius = cos(radius),\n sinRadius = sin(radius),\n step = direction * delta;\n if (t0 == null) {\n t0 = radius + direction * tau;\n t1 = radius - step / 2;\n } else {\n t0 = circleRadius(cosRadius, t0);\n t1 = circleRadius(cosRadius, t1);\n if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau;\n }\n for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {\n point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);\n stream.point(point[0], point[1]);\n }\n}\n\n// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].\nfunction circleRadius(cosRadius, point) {\n point = cartesian(point), point[0] -= cosRadius;\n cartesianNormalizeInPlace(point);\n var radius = acos(-point[1]);\n return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau;\n}\n\nexport default function() {\n var center = constant([0, 0]),\n radius = constant(90),\n precision = constant(2),\n ring,\n rotate,\n stream = {point: point};\n\n function point(x, y) {\n ring.push(x = rotate(x, y));\n x[0] *= degrees, x[1] *= degrees;\n }\n\n function circle() {\n var c = center.apply(this, arguments),\n r = radius.apply(this, arguments) * radians,\n p = precision.apply(this, arguments) * radians;\n ring = [];\n rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;\n circleStream(stream, r, p, 1);\n c = {type: \"Polygon\", coordinates: [ring]};\n ring = rotate = null;\n return c;\n }\n\n circle.center = function(_) {\n return arguments.length ? (center = typeof _ === \"function\" ? _ : constant([+_[0], +_[1]]), circle) : center;\n };\n\n circle.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), circle) : radius;\n };\n\n circle.precision = function(_) {\n return arguments.length ? (precision = typeof _ === \"function\" ? _ : constant(+_), circle) : precision;\n };\n\n return circle;\n}\n", "import noop from \"../noop.js\";\n\nexport default function() {\n var lines = [],\n line;\n return {\n point: function(x, y, m) {\n line.push([x, y, m]);\n },\n lineStart: function() {\n lines.push(line = []);\n },\n lineEnd: noop,\n rejoin: function() {\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n },\n result: function() {\n var result = lines;\n lines = [];\n line = null;\n return result;\n }\n };\n}\n", "import {abs, epsilon} from \"./math.js\";\n\nexport default function(a, b) {\n return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon;\n}\n", "import pointEqual from \"../pointEqual.js\";\nimport {epsilon} from \"../math.js\";\n\nfunction Intersection(point, points, other, entry) {\n this.x = point;\n this.z = points;\n this.o = other; // another intersection\n this.e = entry; // is an entry?\n this.v = false; // visited\n this.n = this.p = null; // next & previous\n}\n\n// A generalized polygon clipping algorithm: given a polygon that has been cut\n// into its visible line segments, and rejoins the segments by interpolating\n// along the clip edge.\nexport default function(segments, compareIntersection, startInside, interpolate, stream) {\n var subject = [],\n clip = [],\n i,\n n;\n\n segments.forEach(function(segment) {\n if ((n = segment.length - 1) <= 0) return;\n var n, p0 = segment[0], p1 = segment[n], x;\n\n if (pointEqual(p0, p1)) {\n if (!p0[2] && !p1[2]) {\n stream.lineStart();\n for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);\n stream.lineEnd();\n return;\n }\n // handle degenerate cases by moving the point\n p1[0] += 2 * epsilon;\n }\n\n subject.push(x = new Intersection(p0, segment, null, true));\n clip.push(x.o = new Intersection(p0, null, x, false));\n subject.push(x = new Intersection(p1, segment, null, false));\n clip.push(x.o = new Intersection(p1, null, x, true));\n });\n\n if (!subject.length) return;\n\n clip.sort(compareIntersection);\n link(subject);\n link(clip);\n\n for (i = 0, n = clip.length; i < n; ++i) {\n clip[i].e = startInside = !startInside;\n }\n\n var start = subject[0],\n points,\n point;\n\n while (1) {\n // Find first unvisited intersection.\n var current = start,\n isSubject = true;\n while (current.v) if ((current = current.n) === start) return;\n points = current.z;\n stream.lineStart();\n do {\n current.v = current.o.v = true;\n if (current.e) {\n if (isSubject) {\n for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.n.x, 1, stream);\n }\n current = current.n;\n } else {\n if (isSubject) {\n points = current.p.z;\n for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.p.x, -1, stream);\n }\n current = current.p;\n }\n current = current.o;\n points = current.z;\n isSubject = !isSubject;\n } while (!current.v);\n stream.lineEnd();\n }\n}\n\nfunction link(array) {\n if (!(n = array.length)) return;\n var n,\n i = 0,\n a = array[0],\n b;\n while (++i < n) {\n a.n = b = array[i];\n b.p = a;\n a = b;\n }\n a.n = b = array[0];\n b.p = a;\n}\n", "import {Adder} from \"d3-array\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace} from \"./cartesian.js\";\nimport {abs, asin, atan2, cos, epsilon, epsilon2, halfPi, pi, quarterPi, sign, sin, tau} from \"./math.js\";\n\nfunction longitude(point) {\n return abs(point[0]) <= pi ? point[0] : sign(point[0]) * ((abs(point[0]) + pi) % tau - pi);\n}\n\nexport default function(polygon, point) {\n var lambda = longitude(point),\n phi = point[1],\n sinPhi = sin(phi),\n normal = [sin(lambda), -cos(lambda), 0],\n angle = 0,\n winding = 0;\n\n var sum = new Adder();\n\n if (sinPhi === 1) phi = halfPi + epsilon;\n else if (sinPhi === -1) phi = -halfPi - epsilon;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n if (!(m = (ring = polygon[i]).length)) continue;\n var ring,\n m,\n point0 = ring[m - 1],\n lambda0 = longitude(point0),\n phi0 = point0[1] / 2 + quarterPi,\n sinPhi0 = sin(phi0),\n cosPhi0 = cos(phi0);\n\n for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {\n var point1 = ring[j],\n lambda1 = longitude(point1),\n phi1 = point1[1] / 2 + quarterPi,\n sinPhi1 = sin(phi1),\n cosPhi1 = cos(phi1),\n delta = lambda1 - lambda0,\n sign = delta >= 0 ? 1 : -1,\n absDelta = sign * delta,\n antimeridian = absDelta > pi,\n k = sinPhi0 * sinPhi1;\n\n sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta)));\n angle += antimeridian ? delta + sign * tau : delta;\n\n // Are the longitudes either side of the point\u2019s meridian (lambda),\n // and are the latitudes smaller than the parallel (phi)?\n if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {\n var arc = cartesianCross(cartesian(point0), cartesian(point1));\n cartesianNormalizeInPlace(arc);\n var intersection = cartesianCross(normal, arc);\n cartesianNormalizeInPlace(intersection);\n var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);\n if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {\n winding += antimeridian ^ delta >= 0 ? 1 : -1;\n }\n }\n }\n }\n\n // First, determine whether the South pole is inside or outside:\n //\n // It is inside if:\n // * the polygon winds around it in a clockwise direction.\n // * the polygon does not (cumulatively) wind around it, but has a negative\n // (counter-clockwise) area.\n //\n // Second, count the (signed) number of times a segment crosses a lambda\n // from the point to the South pole. If it is zero, then the point is the\n // same side as the South pole.\n\n return (angle < -epsilon || angle < epsilon && sum < -epsilon2) ^ (winding & 1);\n}\n", "import clipBuffer from \"./buffer.js\";\nimport clipRejoin from \"./rejoin.js\";\nimport {epsilon, halfPi} from \"../math.js\";\nimport polygonContains from \"../polygonContains.js\";\nimport {merge} from \"d3-array\";\n\nexport default function(pointVisible, clipLine, interpolate, start) {\n return function(sink) {\n var line = clipLine(sink),\n ringBuffer = clipBuffer(),\n ringSink = clipLine(ringBuffer),\n polygonStarted = false,\n polygon,\n segments,\n ring;\n\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n clip.point = pointRing;\n clip.lineStart = ringStart;\n clip.lineEnd = ringEnd;\n segments = [];\n polygon = [];\n },\n polygonEnd: function() {\n clip.point = point;\n clip.lineStart = lineStart;\n clip.lineEnd = lineEnd;\n segments = merge(segments);\n var startInside = polygonContains(polygon, start);\n if (segments.length) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n clipRejoin(segments, compareIntersection, startInside, interpolate, sink);\n } else if (startInside) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n }\n if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n segments = polygon = null;\n },\n sphere: function() {\n sink.polygonStart();\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n sink.polygonEnd();\n }\n };\n\n function point(lambda, phi) {\n if (pointVisible(lambda, phi)) sink.point(lambda, phi);\n }\n\n function pointLine(lambda, phi) {\n line.point(lambda, phi);\n }\n\n function lineStart() {\n clip.point = pointLine;\n line.lineStart();\n }\n\n function lineEnd() {\n clip.point = point;\n line.lineEnd();\n }\n\n function pointRing(lambda, phi) {\n ring.push([lambda, phi]);\n ringSink.point(lambda, phi);\n }\n\n function ringStart() {\n ringSink.lineStart();\n ring = [];\n }\n\n function ringEnd() {\n pointRing(ring[0][0], ring[0][1]);\n ringSink.lineEnd();\n\n var clean = ringSink.clean(),\n ringSegments = ringBuffer.result(),\n i, n = ringSegments.length, m,\n segment,\n point;\n\n ring.pop();\n polygon.push(ring);\n ring = null;\n\n if (!n) return;\n\n // No intersections.\n if (clean & 1) {\n segment = ringSegments[0];\n if ((m = segment.length - 1) > 0) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);\n sink.lineEnd();\n }\n return;\n }\n\n // Rejoin connected segments.\n // TODO reuse ringBuffer.rejoin()?\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n\n segments.push(ringSegments.filter(validSegment));\n }\n\n return clip;\n };\n}\n\nfunction validSegment(segment) {\n return segment.length > 1;\n}\n\n// Intersections are sorted along the clip edge. For both antimeridian cutting\n// and circle clipping, the same comparison is used.\nfunction compareIntersection(a, b) {\n return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1])\n - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]);\n}\n", "import clip from \"./index.js\";\nimport {abs, atan, cos, epsilon, halfPi, pi, sin} from \"../math.js\";\n\nexport default clip(\n function() { return true; },\n clipAntimeridianLine,\n clipAntimeridianInterpolate,\n [-pi, -halfPi]\n);\n\n// Takes a line and cuts into visible segments. Return values: 0 - there were\n// intersections or the line was empty; 1 - no intersections; 2 - there were\n// intersections, and the first and last segments should be rejoined.\nfunction clipAntimeridianLine(stream) {\n var lambda0 = NaN,\n phi0 = NaN,\n sign0 = NaN,\n clean; // no intersections\n\n return {\n lineStart: function() {\n stream.lineStart();\n clean = 1;\n },\n point: function(lambda1, phi1) {\n var sign1 = lambda1 > 0 ? pi : -pi,\n delta = abs(lambda1 - lambda0);\n if (abs(delta - pi) < epsilon) { // line crosses a pole\n stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n stream.point(lambda1, phi0);\n clean = 0;\n } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian\n if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies\n if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon;\n phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n clean = 0;\n }\n stream.point(lambda0 = lambda1, phi0 = phi1);\n sign0 = sign1;\n },\n lineEnd: function() {\n stream.lineEnd();\n lambda0 = phi0 = NaN;\n },\n clean: function() {\n return 2 - clean; // if intersections, rejoin first and last segments\n }\n };\n}\n\nfunction clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {\n var cosPhi0,\n cosPhi1,\n sinLambda0Lambda1 = sin(lambda0 - lambda1);\n return abs(sinLambda0Lambda1) > epsilon\n ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1)\n - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0))\n / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))\n : (phi0 + phi1) / 2;\n}\n\nfunction clipAntimeridianInterpolate(from, to, direction, stream) {\n var phi;\n if (from == null) {\n phi = direction * halfPi;\n stream.point(-pi, phi);\n stream.point(0, phi);\n stream.point(pi, phi);\n stream.point(pi, 0);\n stream.point(pi, -phi);\n stream.point(0, -phi);\n stream.point(-pi, -phi);\n stream.point(-pi, 0);\n stream.point(-pi, phi);\n } else if (abs(from[0] - to[0]) > epsilon) {\n var lambda = from[0] < to[0] ? pi : -pi;\n phi = direction * lambda / 2;\n stream.point(-lambda, phi);\n stream.point(0, phi);\n stream.point(lambda, phi);\n } else {\n stream.point(to[0], to[1]);\n }\n}\n", "import {cartesian, cartesianAddInPlace, cartesianCross, cartesianDot, cartesianScale, spherical} from \"../cartesian.js\";\nimport {circleStream} from \"../circle.js\";\nimport {abs, cos, epsilon, pi, radians, sqrt} from \"../math.js\";\nimport pointEqual from \"../pointEqual.js\";\nimport clip from \"./index.js\";\n\nexport default function(radius) {\n var cr = cos(radius),\n delta = 2 * radians,\n smallRadius = cr > 0,\n notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case\n\n function interpolate(from, to, direction, stream) {\n circleStream(stream, radius, delta, direction, from, to);\n }\n\n function visible(lambda, phi) {\n return cos(lambda) * cos(phi) > cr;\n }\n\n // Takes a line and cuts into visible segments. Return values used for polygon\n // clipping: 0 - there were intersections or the line was empty; 1 - no\n // intersections 2 - there were intersections, and the first and last segments\n // should be rejoined.\n function clipLine(stream) {\n var point0, // previous point\n c0, // code for previous point\n v0, // visibility of previous point\n v00, // visibility of first point\n clean; // no intersections\n return {\n lineStart: function() {\n v00 = v0 = false;\n clean = 1;\n },\n point: function(lambda, phi) {\n var point1 = [lambda, phi],\n point2,\n v = visible(lambda, phi),\n c = smallRadius\n ? v ? 0 : code(lambda, phi)\n : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0;\n if (!point0 && (v00 = v0 = v)) stream.lineStart();\n if (v !== v0) {\n point2 = intersect(point0, point1);\n if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2))\n point1[2] = 1;\n }\n if (v !== v0) {\n clean = 0;\n if (v) {\n // outside going in\n stream.lineStart();\n point2 = intersect(point1, point0);\n stream.point(point2[0], point2[1]);\n } else {\n // inside going out\n point2 = intersect(point0, point1);\n stream.point(point2[0], point2[1], 2);\n stream.lineEnd();\n }\n point0 = point2;\n } else if (notHemisphere && point0 && smallRadius ^ v) {\n var t;\n // If the codes for two points are different, or are both zero,\n // and there this segment intersects with the small circle.\n if (!(c & c0) && (t = intersect(point1, point0, true))) {\n clean = 0;\n if (smallRadius) {\n stream.lineStart();\n stream.point(t[0][0], t[0][1]);\n stream.point(t[1][0], t[1][1]);\n stream.lineEnd();\n } else {\n stream.point(t[1][0], t[1][1]);\n stream.lineEnd();\n stream.lineStart();\n stream.point(t[0][0], t[0][1], 3);\n }\n }\n }\n if (v && (!point0 || !pointEqual(point0, point1))) {\n stream.point(point1[0], point1[1]);\n }\n point0 = point1, v0 = v, c0 = c;\n },\n lineEnd: function() {\n if (v0) stream.lineEnd();\n point0 = null;\n },\n // Rejoin first and last segments if there were intersections and the first\n // and last points were visible.\n clean: function() {\n return clean | ((v00 && v0) << 1);\n }\n };\n }\n\n // Intersects the great circle between a and b with the clip circle.\n function intersect(a, b, two) {\n var pa = cartesian(a),\n pb = cartesian(b);\n\n // We have two planes, n1.p = d1 and n2.p = d2.\n // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 \u2A2F n2).\n var n1 = [1, 0, 0], // normal\n n2 = cartesianCross(pa, pb),\n n2n2 = cartesianDot(n2, n2),\n n1n2 = n2[0], // cartesianDot(n1, n2),\n determinant = n2n2 - n1n2 * n1n2;\n\n // Two polar points.\n if (!determinant) return !two && a;\n\n var c1 = cr * n2n2 / determinant,\n c2 = -cr * n1n2 / determinant,\n n1xn2 = cartesianCross(n1, n2),\n A = cartesianScale(n1, c1),\n B = cartesianScale(n2, c2);\n cartesianAddInPlace(A, B);\n\n // Solve |p(t)|^2 = 1.\n var u = n1xn2,\n w = cartesianDot(A, u),\n uu = cartesianDot(u, u),\n t2 = w * w - uu * (cartesianDot(A, A) - 1);\n\n if (t2 < 0) return;\n\n var t = sqrt(t2),\n q = cartesianScale(u, (-w - t) / uu);\n cartesianAddInPlace(q, A);\n q = spherical(q);\n\n if (!two) return q;\n\n // Two intersection points.\n var lambda0 = a[0],\n lambda1 = b[0],\n phi0 = a[1],\n phi1 = b[1],\n z;\n\n if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;\n\n var delta = lambda1 - lambda0,\n polar = abs(delta - pi) < epsilon,\n meridian = polar || delta < epsilon;\n\n if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;\n\n // Check that the first point is between a and b.\n if (meridian\n ? polar\n ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1)\n : phi0 <= q[1] && q[1] <= phi1\n : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) {\n var q1 = cartesianScale(u, (-w + t) / uu);\n cartesianAddInPlace(q1, A);\n return [q, spherical(q1)];\n }\n }\n\n // Generates a 4-bit vector representing the location of a point relative to\n // the small circle's bounding box.\n function code(lambda, phi) {\n var r = smallRadius ? radius : pi - radius,\n code = 0;\n if (lambda < -r) code |= 1; // left\n else if (lambda > r) code |= 2; // right\n if (phi < -r) code |= 4; // below\n else if (phi > r) code |= 8; // above\n return code;\n }\n\n return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]);\n}\n", "export default function(a, b, x0, y0, x1, y1) {\n var ax = a[0],\n ay = a[1],\n bx = b[0],\n by = b[1],\n t0 = 0,\n t1 = 1,\n dx = bx - ax,\n dy = by - ay,\n r;\n\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;\n if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;\n return true;\n}\n", "import {abs, epsilon} from \"../math.js\";\nimport clipBuffer from \"./buffer.js\";\nimport clipLine from \"./line.js\";\nimport clipRejoin from \"./rejoin.js\";\nimport {merge} from \"d3-array\";\n\nvar clipMax = 1e9, clipMin = -clipMax;\n\n// TODO Use d3-polygon\u2019s polygonContains here for the ring check?\n// TODO Eliminate duplicate buffering in clipBuffer and polygon.push?\n\nexport default function clipRectangle(x0, y0, x1, y1) {\n\n function visible(x, y) {\n return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n }\n\n function interpolate(from, to, direction, stream) {\n var a = 0, a1 = 0;\n if (from == null\n || (a = corner(from, direction)) !== (a1 = corner(to, direction))\n || comparePoint(from, to) < 0 ^ direction > 0) {\n do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n while ((a = (a + direction + 4) % 4) !== a1);\n } else {\n stream.point(to[0], to[1]);\n }\n }\n\n function corner(p, direction) {\n return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3\n : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1\n : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0\n : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon\n }\n\n function compareIntersection(a, b) {\n return comparePoint(a.x, b.x);\n }\n\n function comparePoint(a, b) {\n var ca = corner(a, 1),\n cb = corner(b, 1);\n return ca !== cb ? ca - cb\n : ca === 0 ? b[1] - a[1]\n : ca === 1 ? a[0] - b[0]\n : ca === 2 ? a[1] - b[1]\n : b[0] - a[0];\n }\n\n return function(stream) {\n var activeStream = stream,\n bufferStream = clipBuffer(),\n segments,\n polygon,\n ring,\n x__, y__, v__, // first point\n x_, y_, v_, // previous point\n first,\n clean;\n\n var clipStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: polygonStart,\n polygonEnd: polygonEnd\n };\n\n function point(x, y) {\n if (visible(x, y)) activeStream.point(x, y);\n }\n\n function polygonInside() {\n var winding = 0;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {\n a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];\n if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }\n else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }\n }\n }\n\n return winding;\n }\n\n // Buffer geometry within a polygon and then clip it en masse.\n function polygonStart() {\n activeStream = bufferStream, segments = [], polygon = [], clean = true;\n }\n\n function polygonEnd() {\n var startInside = polygonInside(),\n cleanInside = clean && startInside,\n visible = (segments = merge(segments)).length;\n if (cleanInside || visible) {\n stream.polygonStart();\n if (cleanInside) {\n stream.lineStart();\n interpolate(null, null, 1, stream);\n stream.lineEnd();\n }\n if (visible) {\n clipRejoin(segments, compareIntersection, startInside, interpolate, stream);\n }\n stream.polygonEnd();\n }\n activeStream = stream, segments = polygon = ring = null;\n }\n\n function lineStart() {\n clipStream.point = linePoint;\n if (polygon) polygon.push(ring = []);\n first = true;\n v_ = false;\n x_ = y_ = NaN;\n }\n\n // TODO rather than special-case polygons, simply handle them separately.\n // Ideally, coincident intersection points should be jittered to avoid\n // clipping issues.\n function lineEnd() {\n if (segments) {\n linePoint(x__, y__);\n if (v__ && v_) bufferStream.rejoin();\n segments.push(bufferStream.result());\n }\n clipStream.point = point;\n if (v_) activeStream.lineEnd();\n }\n\n function linePoint(x, y) {\n var v = visible(x, y);\n if (polygon) ring.push([x, y]);\n if (first) {\n x__ = x, y__ = y, v__ = v;\n first = false;\n if (v) {\n activeStream.lineStart();\n activeStream.point(x, y);\n }\n } else {\n if (v && v_) activeStream.point(x, y);\n else {\n var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],\n b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];\n if (clipLine(a, b, x0, y0, x1, y1)) {\n if (!v_) {\n activeStream.lineStart();\n activeStream.point(a[0], a[1]);\n }\n activeStream.point(b[0], b[1]);\n if (!v) activeStream.lineEnd();\n clean = false;\n } else if (v) {\n activeStream.lineStart();\n activeStream.point(x, y);\n clean = false;\n }\n }\n }\n x_ = x, y_ = y, v_ = v;\n }\n\n return clipStream;\n };\n}\n", "export default x => x;\n", "import {Adder} from \"d3-array\";\nimport {abs} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar areaSum = new Adder(),\n areaRingSum = new Adder(),\n x00,\n y00,\n x0,\n y0;\n\nvar areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop;\n areaSum.add(abs(areaRingSum));\n areaRingSum = new Adder();\n },\n result: function() {\n var area = areaSum / 2;\n areaSum = new Adder();\n return area;\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaPointFirst(x, y) {\n areaStream.point = areaPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction areaPoint(x, y) {\n areaRingSum.add(y0 * x - x0 * y);\n x0 = x, y0 = y;\n}\n\nfunction areaRingEnd() {\n areaPoint(x00, y00);\n}\n\nexport default areaStream;\n", "import noop from \"../noop.js\";\n\nvar x0 = Infinity,\n y0 = x0,\n x1 = -x0,\n y1 = x1;\n\nvar boundsStream = {\n point: boundsPoint,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: noop,\n polygonEnd: noop,\n result: function() {\n var bounds = [[x0, y0], [x1, y1]];\n x1 = y1 = -(y0 = x0 = Infinity);\n return bounds;\n }\n};\n\nfunction boundsPoint(x, y) {\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n}\n\nexport default boundsStream;\n", "import {sqrt} from \"../math.js\";\n\n// TODO Enforce positive area for exterior, negative area for interior?\n\nvar X0 = 0,\n Y0 = 0,\n Z0 = 0,\n X1 = 0,\n Y1 = 0,\n Z1 = 0,\n X2 = 0,\n Y2 = 0,\n Z2 = 0,\n x00,\n y00,\n x0,\n y0;\n\nvar centroidStream = {\n point: centroidPoint,\n lineStart: centroidLineStart,\n lineEnd: centroidLineEnd,\n polygonStart: function() {\n centroidStream.lineStart = centroidRingStart;\n centroidStream.lineEnd = centroidRingEnd;\n },\n polygonEnd: function() {\n centroidStream.point = centroidPoint;\n centroidStream.lineStart = centroidLineStart;\n centroidStream.lineEnd = centroidLineEnd;\n },\n result: function() {\n var centroid = Z2 ? [X2 / Z2, Y2 / Z2]\n : Z1 ? [X1 / Z1, Y1 / Z1]\n : Z0 ? [X0 / Z0, Y0 / Z0]\n : [NaN, NaN];\n X0 = Y0 = Z0 =\n X1 = Y1 = Z1 =\n X2 = Y2 = Z2 = 0;\n return centroid;\n }\n};\n\nfunction centroidPoint(x, y) {\n X0 += x;\n Y0 += y;\n ++Z0;\n}\n\nfunction centroidLineStart() {\n centroidStream.point = centroidPointFirstLine;\n}\n\nfunction centroidPointFirstLine(x, y) {\n centroidStream.point = centroidPointLine;\n centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidPointLine(x, y) {\n var dx = x - x0, dy = y - y0, z = sqrt(dx * dx + dy * dy);\n X1 += z * (x0 + x) / 2;\n Y1 += z * (y0 + y) / 2;\n Z1 += z;\n centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidLineEnd() {\n centroidStream.point = centroidPoint;\n}\n\nfunction centroidRingStart() {\n centroidStream.point = centroidPointFirstRing;\n}\n\nfunction centroidRingEnd() {\n centroidPointRing(x00, y00);\n}\n\nfunction centroidPointFirstRing(x, y) {\n centroidStream.point = centroidPointRing;\n centroidPoint(x00 = x0 = x, y00 = y0 = y);\n}\n\nfunction centroidPointRing(x, y) {\n var dx = x - x0,\n dy = y - y0,\n z = sqrt(dx * dx + dy * dy);\n\n X1 += z * (x0 + x) / 2;\n Y1 += z * (y0 + y) / 2;\n Z1 += z;\n\n z = y0 * x - x0 * y;\n X2 += z * (x0 + x);\n Y2 += z * (y0 + y);\n Z2 += z * 3;\n centroidPoint(x0 = x, y0 = y);\n}\n\nexport default centroidStream;\n", "import {tau} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nexport default function PathContext(context) {\n this._context = context;\n}\n\nPathContext.prototype = {\n _radius: 4.5,\n pointRadius: function(_) {\n return this._radius = _, this;\n },\n polygonStart: function() {\n this._line = 0;\n },\n polygonEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line === 0) this._context.closePath();\n this._point = NaN;\n },\n point: function(x, y) {\n switch (this._point) {\n case 0: {\n this._context.moveTo(x, y);\n this._point = 1;\n break;\n }\n case 1: {\n this._context.lineTo(x, y);\n break;\n }\n default: {\n this._context.moveTo(x + this._radius, y);\n this._context.arc(x, y, this._radius, 0, tau);\n break;\n }\n }\n },\n result: noop\n};\n", "import {Adder} from \"d3-array\";\nimport {sqrt} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar lengthSum = new Adder(),\n lengthRing,\n x00,\n y00,\n x0,\n y0;\n\nvar lengthStream = {\n point: noop,\n lineStart: function() {\n lengthStream.point = lengthPointFirst;\n },\n lineEnd: function() {\n if (lengthRing) lengthPoint(x00, y00);\n lengthStream.point = noop;\n },\n polygonStart: function() {\n lengthRing = true;\n },\n polygonEnd: function() {\n lengthRing = null;\n },\n result: function() {\n var length = +lengthSum;\n lengthSum = new Adder();\n return length;\n }\n};\n\nfunction lengthPointFirst(x, y) {\n lengthStream.point = lengthPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction lengthPoint(x, y) {\n x0 -= x, y0 -= y;\n lengthSum.add(sqrt(x0 * x0 + y0 * y0));\n x0 = x, y0 = y;\n}\n\nexport default lengthStream;\n", "// Simple caching for constant-radius points.\nlet cacheDigits, cacheAppend, cacheRadius, cacheCircle;\n\nexport default class PathString {\n constructor(digits) {\n this._append = digits == null ? append : appendRound(digits);\n this._radius = 4.5;\n this._ = \"\";\n }\n pointRadius(_) {\n this._radius = +_;\n return this;\n }\n polygonStart() {\n this._line = 0;\n }\n polygonEnd() {\n this._line = NaN;\n }\n lineStart() {\n this._point = 0;\n }\n lineEnd() {\n if (this._line === 0) this._ += \"Z\";\n this._point = NaN;\n }\n point(x, y) {\n switch (this._point) {\n case 0: {\n this._append`M${x},${y}`;\n this._point = 1;\n break;\n }\n case 1: {\n this._append`L${x},${y}`;\n break;\n }\n default: {\n this._append`M${x},${y}`;\n if (this._radius !== cacheRadius || this._append !== cacheAppend) {\n const r = this._radius;\n const s = this._;\n this._ = \"\"; // stash the old string so we can cache the circle path fragment\n this._append`m0,${r}a${r},${r} 0 1,1 0,${-2 * r}a${r},${r} 0 1,1 0,${2 * r}z`;\n cacheRadius = r;\n cacheAppend = this._append;\n cacheCircle = this._;\n this._ = s;\n }\n this._ += cacheCircle;\n break;\n }\n }\n }\n result() {\n const result = this._;\n this._ = \"\";\n return result.length ? result : null;\n }\n}\n\nfunction append(strings) {\n let i = 1;\n this._ += strings[0];\n for (const j = strings.length; i < j; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n const d = Math.floor(digits);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${digits}`);\n if (d > 15) return append;\n if (d !== cacheDigits) {\n const k = 10 ** d;\n cacheDigits = d;\n cacheAppend = function append(strings) {\n let i = 1;\n this._ += strings[0];\n for (const j = strings.length; i < j; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n }\n return cacheAppend;\n}\n", "import identity from \"../identity.js\";\nimport stream from \"../stream.js\";\nimport pathArea from \"./area.js\";\nimport pathBounds from \"./bounds.js\";\nimport pathCentroid from \"./centroid.js\";\nimport PathContext from \"./context.js\";\nimport pathMeasure from \"./measure.js\";\nimport PathString from \"./string.js\";\n\nexport default function(projection, context) {\n let digits = 3,\n pointRadius = 4.5,\n projectionStream,\n contextStream;\n\n function path(object) {\n if (object) {\n if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n stream(object, projectionStream(contextStream));\n }\n return contextStream.result();\n }\n\n path.area = function(object) {\n stream(object, projectionStream(pathArea));\n return pathArea.result();\n };\n\n path.measure = function(object) {\n stream(object, projectionStream(pathMeasure));\n return pathMeasure.result();\n };\n\n path.bounds = function(object) {\n stream(object, projectionStream(pathBounds));\n return pathBounds.result();\n };\n\n path.centroid = function(object) {\n stream(object, projectionStream(pathCentroid));\n return pathCentroid.result();\n };\n\n path.projection = function(_) {\n if (!arguments.length) return projection;\n projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream;\n return path;\n };\n\n path.context = function(_) {\n if (!arguments.length) return context;\n contextStream = _ == null ? (context = null, new PathString(digits)) : new PathContext(context = _);\n if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n return path;\n };\n\n path.pointRadius = function(_) {\n if (!arguments.length) return pointRadius;\n pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n return path;\n };\n\n path.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) digits = null;\n else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n if (context === null) contextStream = new PathString(digits);\n return path;\n };\n\n return path.projection(projection).digits(digits).context(context);\n}\n", "export default function(methods) {\n return {\n stream: transformer(methods)\n };\n}\n\nexport function transformer(methods) {\n return function(stream) {\n var s = new TransformStream;\n for (var key in methods) s[key] = methods[key];\n s.stream = stream;\n return s;\n };\n}\n\nfunction TransformStream() {}\n\nTransformStream.prototype = {\n constructor: TransformStream,\n point: function(x, y) { this.stream.point(x, y); },\n sphere: function() { this.stream.sphere(); },\n lineStart: function() { this.stream.lineStart(); },\n lineEnd: function() { this.stream.lineEnd(); },\n polygonStart: function() { this.stream.polygonStart(); },\n polygonEnd: function() { this.stream.polygonEnd(); }\n};\n", "import {default as geoStream} from \"../stream.js\";\nimport boundsStream from \"../path/bounds.js\";\n\nfunction fit(projection, fitBounds, object) {\n var clip = projection.clipExtent && projection.clipExtent();\n projection.scale(150).translate([0, 0]);\n if (clip != null) projection.clipExtent(null);\n geoStream(object, projection.stream(boundsStream));\n fitBounds(boundsStream.result());\n if (clip != null) projection.clipExtent(clip);\n return projection;\n}\n\nexport function fitExtent(projection, extent, object) {\n return fit(projection, function(b) {\n var w = extent[1][0] - extent[0][0],\n h = extent[1][1] - extent[0][1],\n k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),\n x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,\n y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n\nexport function fitSize(projection, size, object) {\n return fitExtent(projection, [[0, 0], size], object);\n}\n\nexport function fitWidth(projection, width, object) {\n return fit(projection, function(b) {\n var w = +width,\n k = w / (b[1][0] - b[0][0]),\n x = (w - k * (b[1][0] + b[0][0])) / 2,\n y = -k * b[0][1];\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n\nexport function fitHeight(projection, height, object) {\n return fit(projection, function(b) {\n var h = +height,\n k = h / (b[1][1] - b[0][1]),\n x = -k * b[0][0],\n y = (h - k * (b[1][1] + b[0][1])) / 2;\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n", "import {cartesian} from \"../cartesian.js\";\nimport {abs, asin, atan2, cos, epsilon, radians, sqrt} from \"../math.js\";\nimport {transformer} from \"../transform.js\";\n\nvar maxDepth = 16, // maximum depth of subdivision\n cosMinDistance = cos(30 * radians); // cos(minimum angular distance)\n\nexport default function(project, delta2) {\n return +delta2 ? resample(project, delta2) : resampleNone(project);\n}\n\nfunction resampleNone(project) {\n return transformer({\n point: function(x, y) {\n x = project(x, y);\n this.stream.point(x[0], x[1]);\n }\n });\n}\n\nfunction resample(project, delta2) {\n\n function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {\n var dx = x1 - x0,\n dy = y1 - y0,\n d2 = dx * dx + dy * dy;\n if (d2 > 4 * delta2 && depth--) {\n var a = a0 + a1,\n b = b0 + b1,\n c = c0 + c1,\n m = sqrt(a * a + b * b + c * c),\n phi2 = asin(c /= m),\n lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a),\n p = project(lambda2, phi2),\n x2 = p[0],\n y2 = p[1],\n dx2 = x2 - x0,\n dy2 = y2 - y0,\n dz = dy * dx2 - dx * dy2;\n if (dz * dz / d2 > delta2 // perpendicular projected distance\n || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end\n || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);\n stream.point(x2, y2);\n resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);\n }\n }\n }\n return function(stream) {\n var lambda00, x00, y00, a00, b00, c00, // first point\n lambda0, x0, y0, a0, b0, c0; // previous point\n\n var resampleStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },\n polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }\n };\n\n function point(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n }\n\n function lineStart() {\n x0 = NaN;\n resampleStream.point = linePoint;\n stream.lineStart();\n }\n\n function linePoint(lambda, phi) {\n var c = cartesian([lambda, phi]), p = project(lambda, phi);\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n stream.point(x0, y0);\n }\n\n function lineEnd() {\n resampleStream.point = point;\n stream.lineEnd();\n }\n\n function ringStart() {\n lineStart();\n resampleStream.point = ringPoint;\n resampleStream.lineEnd = ringEnd;\n }\n\n function ringPoint(lambda, phi) {\n linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n resampleStream.point = linePoint;\n }\n\n function ringEnd() {\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);\n resampleStream.lineEnd = lineEnd;\n lineEnd();\n }\n\n return resampleStream;\n };\n}\n", "import clipAntimeridian from \"../clip/antimeridian.js\";\nimport clipCircle from \"../clip/circle.js\";\nimport clipRectangle from \"../clip/rectangle.js\";\nimport compose from \"../compose.js\";\nimport identity from \"../identity.js\";\nimport {cos, degrees, radians, sin, sqrt} from \"../math.js\";\nimport {rotateRadians} from \"../rotation.js\";\nimport {transformer} from \"../transform.js\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit.js\";\nimport resample from \"./resample.js\";\n\nvar transformRadians = transformer({\n point: function(x, y) {\n this.stream.point(x * radians, y * radians);\n }\n});\n\nfunction transformRotate(rotate) {\n return transformer({\n point: function(x, y) {\n var r = rotate(x, y);\n return this.stream.point(r[0], r[1]);\n }\n });\n}\n\nfunction scaleTranslate(k, dx, dy, sx, sy) {\n function transform(x, y) {\n x *= sx; y *= sy;\n return [dx + k * x, dy - k * y];\n }\n transform.invert = function(x, y) {\n return [(x - dx) / k * sx, (dy - y) / k * sy];\n };\n return transform;\n}\n\nfunction scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {\n if (!alpha) return scaleTranslate(k, dx, dy, sx, sy);\n var cosAlpha = cos(alpha),\n sinAlpha = sin(alpha),\n a = cosAlpha * k,\n b = sinAlpha * k,\n ai = cosAlpha / k,\n bi = sinAlpha / k,\n ci = (sinAlpha * dy - cosAlpha * dx) / k,\n fi = (sinAlpha * dx + cosAlpha * dy) / k;\n function transform(x, y) {\n x *= sx; y *= sy;\n return [a * x - b * y + dx, dy - b * x - a * y];\n }\n transform.invert = function(x, y) {\n return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)];\n };\n return transform;\n}\n\nexport default function projection(project) {\n return projectionMutator(function() { return project; })();\n}\n\nexport function projectionMutator(projectAt) {\n var project,\n k = 150, // scale\n x = 480, y = 250, // translate\n lambda = 0, phi = 0, // center\n deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate\n alpha = 0, // post-rotate angle\n sx = 1, // reflectX\n sy = 1, // reflectX\n theta = null, preclip = clipAntimeridian, // pre-clip angle\n x0 = null, y0, x1, y1, postclip = identity, // post-clip extent\n delta2 = 0.5, // precision\n projectResample,\n projectTransform,\n projectRotateTransform,\n cache,\n cacheStream;\n\n function projection(point) {\n return projectRotateTransform(point[0] * radians, point[1] * radians);\n }\n\n function invert(point) {\n point = projectRotateTransform.invert(point[0], point[1]);\n return point && [point[0] * degrees, point[1] * degrees];\n }\n\n projection.stream = function(stream) {\n return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));\n };\n\n projection.preclip = function(_) {\n return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;\n };\n\n projection.postclip = function(_) {\n return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n };\n\n projection.clipAngle = function(_) {\n return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees;\n };\n\n projection.clipExtent = function(_) {\n return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n projection.scale = function(_) {\n return arguments.length ? (k = +_, recenter()) : k;\n };\n\n projection.translate = function(_) {\n return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];\n };\n\n projection.center = function(_) {\n return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees];\n };\n\n projection.rotate = function(_) {\n return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];\n };\n\n projection.angle = function(_) {\n return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;\n };\n\n projection.reflectX = function(_) {\n return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;\n };\n\n projection.reflectY = function(_) {\n return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;\n };\n\n projection.precision = function(_) {\n return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);\n };\n\n projection.fitExtent = function(extent, object) {\n return fitExtent(projection, extent, object);\n };\n\n projection.fitSize = function(size, object) {\n return fitSize(projection, size, object);\n };\n\n projection.fitWidth = function(width, object) {\n return fitWidth(projection, width, object);\n };\n\n projection.fitHeight = function(height, object) {\n return fitHeight(projection, height, object);\n };\n\n function recenter() {\n var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)),\n transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha);\n rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\n projectTransform = compose(project, transform);\n projectRotateTransform = compose(rotate, projectTransform);\n projectResample = resample(projectTransform, delta2);\n return reset();\n }\n\n function reset() {\n cache = cacheStream = null;\n return projection;\n }\n\n return function() {\n project = projectAt.apply(this, arguments);\n projection.invert = project.invert && invert;\n return recenter();\n };\n}\n", "import {degrees, pi, radians} from \"../math.js\";\nimport {projectionMutator} from \"./index.js\";\n\nexport function conicProjection(projectAt) {\n var phi0 = 0,\n phi1 = pi / 3,\n m = projectionMutator(projectAt),\n p = m(phi0, phi1);\n\n p.parallels = function(_) {\n return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees];\n };\n\n return p;\n}\n", "import {asin, cos, sin} from \"../math.js\";\n\nexport function cylindricalEqualAreaRaw(phi0) {\n var cosPhi0 = cos(phi0);\n\n function forward(lambda, phi) {\n return [lambda * cosPhi0, sin(phi) / cosPhi0];\n }\n\n forward.invert = function(x, y) {\n return [x / cosPhi0, asin(y * cosPhi0)];\n };\n\n return forward;\n}\n", "import {abs, asin, atan2, cos, epsilon, pi, sign, sin, sqrt} from \"../math.js\";\nimport {conicProjection} from \"./conic.js\";\nimport {cylindricalEqualAreaRaw} from \"./cylindricalEqualArea.js\";\n\nexport function conicEqualAreaRaw(y0, y1) {\n var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2;\n\n // Are the parallels symmetrical around the Equator?\n if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0);\n\n var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;\n\n function project(x, y) {\n var r = sqrt(c - 2 * n * sin(y)) / n;\n return [r * sin(x *= n), r0 - r * cos(x)];\n }\n\n project.invert = function(x, y) {\n var r0y = r0 - y,\n l = atan2(x, abs(r0y)) * sign(r0y);\n if (r0y * n < 0)\n l -= pi * sign(x) * sign(r0y);\n return [l / n, asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];\n };\n\n return project;\n}\n\nexport default function() {\n return conicProjection(conicEqualAreaRaw)\n .scale(155.424)\n .center([0, 33.6442]);\n}\n", "import {asin, atan2, cos, sin, sqrt} from \"../math.js\";\n\nexport function azimuthalRaw(scale) {\n return function(x, y) {\n var cx = cos(x),\n cy = cos(y),\n k = scale(cx * cy);\n if (k === Infinity) return [2, 0];\n return [\n k * cy * sin(x),\n k * sin(y)\n ];\n }\n}\n\nexport function azimuthalInvert(angle) {\n return function(x, y) {\n var z = sqrt(x * x + y * y),\n c = angle(z),\n sc = sin(c),\n cc = cos(c);\n return [\n atan2(x * sc, z * cc),\n asin(z && y * sc / z)\n ];\n }\n}\n", "import {atan, exp, halfPi, log, pi, tan, tau} from \"../math.js\";\nimport rotation from \"../rotation.js\";\nimport projection from \"./index.js\";\n\nexport function mercatorRaw(lambda, phi) {\n return [lambda, log(tan((halfPi + phi) / 2))];\n}\n\nmercatorRaw.invert = function(x, y) {\n return [x, 2 * atan(exp(y)) - halfPi];\n};\n\nexport default function() {\n return mercatorProjection(mercatorRaw)\n .scale(961 / tau);\n}\n\nexport function mercatorProjection(project) {\n var m = projection(project),\n center = m.center,\n scale = m.scale,\n translate = m.translate,\n clipExtent = m.clipExtent,\n x0 = null, y0, x1, y1; // clip extent\n\n m.scale = function(_) {\n return arguments.length ? (scale(_), reclip()) : scale();\n };\n\n m.translate = function(_) {\n return arguments.length ? (translate(_), reclip()) : translate();\n };\n\n m.center = function(_) {\n return arguments.length ? (center(_), reclip()) : center();\n };\n\n m.clipExtent = function(_) {\n return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n function reclip() {\n var k = pi * scale(),\n t = m(rotation(m.rotate()).invert([0, 0]));\n return clipExtent(x0 == null\n ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw\n ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]\n : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);\n }\n\n return reclip();\n}\n", "import projection from \"./index.js\";\n\nexport function equirectangularRaw(lambda, phi) {\n return [lambda, phi];\n}\n\nequirectangularRaw.invert = equirectangularRaw;\n\nexport default function() {\n return projection(equirectangularRaw)\n .scale(152.63);\n}\n", "import {asin, cos, epsilon, sin} from \"../math.js\";\nimport {azimuthalInvert} from \"./azimuthal.js\";\nimport projection from \"./index.js\";\n\nexport function orthographicRaw(x, y) {\n return [cos(y) * sin(x), sin(y)];\n}\n\northographicRaw.invert = azimuthalInvert(asin);\n\nexport default function() {\n return projection(orthographicRaw)\n .scale(249.5)\n .clipAngle(90 + epsilon);\n}\n", "import { geoArea } from \"d3-geo\"\n\n/** The on-disk shape `@motionscript/geo-data` writes; see its `generate.mjs`. */\nexport const GEO_DATA_FORMAT = 1\n\nexport interface GeoFileData {\n format: number\n source?: string\n transform: { scale: [number, number]; translate: [number, number] }\n /** Global arc id per local arc — identical across files for a shared border. */\n arcIds: number[]\n /** Per arc, flat `[x0, y0, w0, dx, dy, w, …]`: delta-encoded quantized lon/lat and a weight bucket. */\n arcs: number[][]\n features: GeoFeatureData[]\n}\n\nexport interface GeoFeatureData {\n code: string\n name: string\n nameNl?: string\n parent: string | null\n first: boolean\n listed: boolean\n remote?: boolean\n area: number\n mainland: number[] | null\n areas: number[]\n /** Polygons → rings → arc refs (`~i` is arc `i` reversed). */\n polygons: number[][][]\n}\n\n/** `[code, name, nameNl, parent, first]` per listed region. */\nexport type GeoIndexEntry = [string, string, string, string | null, 0 | 1]\n\nexport interface GeoIndex {\n format: number\n source?: string\n regions: GeoIndexEntry[]\n}\n\nexport interface GeoArc {\n /** Identity for de-duplicating a border drawn by two regions, across files. */\n key: number | string\n /** Interleaved lon/lat, in degrees. */\n points: Float64Array\n /** Per point: 0 always survives, higher buckets are less significant; see `thresholdBucket`. */\n buckets: Uint8Array\n}\n\nexport interface GeoRingRef {\n arc: GeoArc\n reversed: boolean\n}\n\nexport interface GeoPolygon {\n rings: GeoRingRef[][]\n /** Per ring, in steradians — exterior first, then holes. */\n ringAreas: number[]\n area: number\n mainland: boolean\n}\n\nexport interface GeoFeature {\n code: string\n name: string\n nameNl: string\n parent: string | null\n first: boolean\n listed: boolean\n remote: boolean\n polygons: GeoPolygon[]\n}\n\nexport interface DecodedGeoFile {\n features: Map<string, GeoFeature>\n}\n\nfunction decodeArc(encoded: number[], key: number, [kx, ky]: [number, number], [tx, ty]: [number, number]): GeoArc {\n const count = encoded.length / 3\n const points = new Float64Array(count * 2)\n const buckets = new Uint8Array(count)\n let x = 0\n let y = 0\n for (let i = 0; i < count; i++) {\n x += encoded[i * 3]\n y += encoded[i * 3 + 1]\n points[i * 2] = x * kx + tx\n points[i * 2 + 1] = y * ky + ty\n buckets[i] = encoded[i * 3 + 2]\n }\n return { key, points, buckets }\n}\n\nexport function ringCoordinates(ring: readonly GeoRingRef[]): [number, number][] {\n const out: [number, number][] = []\n for (const { arc, reversed } of ring) {\n const n = arc.buckets.length\n for (let j = out.length === 0 ? 0 : 1; j < n; j++) {\n const i = reversed ? n - 1 - j : j\n out.push([arc.points[i * 2], arc.points[i * 2 + 1]])\n }\n }\n return out\n}\n\n/** A ring's area in steradians, whichever way it winds. */\nexport function ringArea(ring: readonly GeoRingRef[]): number {\n const coordinates = ringCoordinates(ring)\n if (coordinates.length < 4) return 0\n const area = geoArea({ type: \"Polygon\", coordinates: [coordinates] })\n return area > 2 * Math.PI ? 4 * Math.PI - area : area\n}\n\nexport function decodeGeoFile(data: GeoFileData): DecodedGeoFile {\n if (data.format !== GEO_DATA_FORMAT) {\n throw new Error(`geo data format ${data.format} is not supported (expected ${GEO_DATA_FORMAT})`)\n }\n const arcs = data.arcs.map((encoded, i) =>\n decodeArc(encoded, data.arcIds[i], data.transform.scale, data.transform.translate)\n )\n const ref = (index: number): GeoRingRef =>\n index < 0 ? { arc: arcs[~index], reversed: true } : { arc: arcs[index], reversed: false }\n\n const features = new Map<string, GeoFeature>()\n for (const f of data.features) {\n const mainland = f.mainland ? new Set(f.mainland) : null\n features.set(f.code, {\n code: f.code,\n name: f.name,\n nameNl: f.nameNl ?? f.name,\n parent: f.parent,\n first: f.first,\n listed: f.listed,\n remote: f.remote === true,\n polygons: f.polygons.map((rings, i) => {\n const resolved = rings.map((ring) => ring.map(ref))\n return {\n rings: resolved,\n ringAreas: resolved.map((ring, r) => (r === 0 ? f.areas[i] : ringArea(ring))),\n area: f.areas[i],\n mainland: mainland === null || mainland.has(i),\n }\n }),\n })\n }\n return { features }\n}\n", "import {\n Clip,\n Graphics2D,\n ShapeNode,\n node,\n property,\n type AssetScope,\n type FillResolved,\n type NodeConfig,\n type PathBounds,\n type RenderContext2D,\n type ShadowResolved,\n type ShapeProps,\n type StrokeResolved,\n} from \"@motionscript/core\"\nimport { snapValue } from \"@motionscript/core/component\"\n\nimport { geoGeometry, type GeoBorders, type GeoContour, type GeoGeometry, type GeoProjectionKind } from \"./geometry\"\nimport { geoDataVersion, geoLoader } from \"./loader\"\nimport { geoRegistry } from \"./registry\"\nimport { geoFilesFor, normalizeIso, selectGeoFeatures, type GeoFrame, type GeoLevel } from \"./selection\"\n\nexport interface GeoBorderProps extends ShapeProps {\n /** ISO 3166-1 alpha-2 (`\"FR\"`) or ISO 3166-2 (`\"US-CA\"`) codes. */\n iso: string | readonly string[]\n level: GeoLevel\n /** 0–1: 1 is full resolution, lower is a more stylised outline. */\n detail: number\n projection: GeoProjectionKind\n frame: GeoFrame\n borders: GeoBorders\n}\n\ninterface Chunk {\n data: string\n /** Where this chunk's contours sit along the whole drawing, as fractions of its length. */\n from: number\n to: number\n}\n\ninterface Drawn {\n geometry: GeoGeometry\n width: number\n height: number\n fills: Chunk[]\n lines: Chunk[]\n}\n\n// Skia's cost for one path grows faster than its contour count, and a shape\n// drawn as several paths under one paint is unioned every frame — so a region\n// is cut into paths of bounded size, each painted on its own.\nconst CONTOURS_PER_PATH = 256\nconst POINTS_PER_PATH = 40_000\n\nconst coordinate = (value: number) => String(Math.round(value * 100) / 100)\n\nfunction chunk(contours: readonly GeoContour[], total: number, scale: number): Chunk[] {\n const chunks: Chunk[] = []\n let parts: string[] = []\n let count = 0\n let points = 0\n let from = 0\n let length = 0\n const flush = () => {\n if (count === 0) return\n const to = total > 0 ? Math.min(1, length / total) : 1\n chunks.push({ data: parts.join(\"\"), from, to })\n from = to\n parts = []\n count = 0\n points = 0\n }\n for (const contour of contours) {\n const p = contour.points\n // Path data is y-down; the unit geometry is y-up.\n for (let i = 0; i < p.length; i += 2) {\n parts.push(i === 0 ? \"M\" : \"L\", coordinate(p[i] * scale), \" \", coordinate(-p[i + 1] * scale))\n }\n if (contour.closed) parts.push(\"Z\")\n count++\n points += p.length / 2\n length += contour.length\n if (count >= CONTOURS_PER_PATH || points >= POINTS_PER_PATH) flush()\n }\n flush()\n return chunks\n}\n\n/**\n * Country and subdivision outlines by ISO 3166 code, fitted into the node's box.\n *\n * <GeoBorder iso={[\"FR\", \"DE\"]} detail={0.4} stroke={{ weight: 2, fill: \"white\" }} />\n *\n * Geometry comes from whatever `geoRegistry` has been given — a URL, a loader,\n * or shapes defined by hand — and loads as a declared asset, so a frame never\n * draws half a country. Fill and stroke are separate geometry: the fill is each\n * region's polygons, the stroke is every border once, which is why a border two\n * selected regions share is not drawn twice and why `stroke.align` does not\n * apply.\n */\n@node({\n key: \"geoBorder\",\n parentKey: \"shape\",\n forkable: true,\n layout: {\n children: \"freeform\",\n acceptsChildren: true,\n defaultWidthMode: \"fixed\",\n defaultHeightMode: \"fixed\",\n },\n seed: { width: 480, height: 480 },\n})\nexport class GeoBorder extends ShapeNode<GeoBorderProps> {\n @property({ default: [\"FR\"], mapper: normalizeIso, tween: snapValue })\n declare iso: string | readonly string[]\n\n @property({ default: \"country\", tween: snapValue, options: [\"country\", \"state\"] })\n declare level: GeoLevel\n\n @property({ default: 0.5, min: 0, max: 1, step: 0.01 })\n declare detail: number\n\n @property({\n default: \"conic\",\n tween: snapValue,\n options: [\"conic\", \"mercator\", \"equirectangular\", \"orthographic\"],\n })\n declare projection: GeoProjectionKind\n\n @property({ default: \"mainland\", tween: snapValue, options: [\"mainland\", \"all\"] })\n declare frame: GeoFrame\n\n @property({ default: \"all\", tween: snapValue, options: [\"all\", \"outline\"] })\n declare borders: GeoBorders\n\n constructor(props?: NodeConfig<GeoBorder, GeoBorderProps>) {\n super(props as NodeConfig<ShapeNode<GeoBorderProps>, GeoBorderProps>)\n }\n\n override declareAssets(assets: AssetScope): void {\n super.declareAssets(assets)\n for (const file of geoFilesFor(this.iso as string[], this.level)) {\n assets.loader(`geo:${file}`, geoLoader(file), { gate: \"render\" })\n }\n }\n\n protected override renderSelf(ctx: RenderContext2D): void {\n const drawn = this._drawn()\n const fill = this.fill as FillResolved[]\n if (!drawn || drawn.fills.length === 0) return\n const shadow = this.shadow as ShadowResolved[]\n const g = new Graphics2D()\n for (const chunk of drawn.fills) {\n if (!this._pathOp(g, chunk)) continue\n if (shadow.length > 0) g.shadow(shadow)\n g.fill(fill)\n }\n ctx.draw(g)\n }\n\n protected override renderOverlay(ctx: RenderContext2D): void {\n const overlay = this.overlay as FillResolved[]\n if (overlay.length === 0) return\n const drawn = this._drawn()\n if (!drawn) return\n const g = new Graphics2D()\n for (const chunk of drawn.fills) if (this._pathOp(g, chunk)) g.fill(overlay)\n ctx.draw(g)\n }\n\n protected override renderStroke(ctx: RenderContext2D): void {\n const stroke = this.stroke as StrokeResolved[]\n if (stroke.length === 0) return\n const drawn = this._drawn()\n if (!drawn || drawn.lines.length === 0) return\n const centred = stroke.map((layer) => (layer.align === 0 ? layer : { ...layer, align: 0 }))\n const shadow = this.shadow as ShadowResolved[]\n const castsShadow = shadow.length > 0 && !(this.fill as FillResolved[]).some((layer) => (layer.opacity ?? 1) > 0)\n const g = new Graphics2D()\n for (const chunk of drawn.lines) {\n if (!this._pathOp(g, chunk)) continue\n if (castsShadow) g.shadow(shadow)\n g.stroke(centred)\n }\n ctx.draw(g)\n }\n\n // The box, not the outline: a path clip has no winding test, and a country's\n // bounding box is what the selection shows.\n protected override clipSelf(): Clip {\n return new Clip().rect({\n x: 0,\n y: 0,\n width: this.layoutBounds.width,\n height: this.layoutBounds.height,\n })\n }\n\n private _drawnCache: Drawn | null = null\n private readonly _warned = new Set<string>()\n\n private _pathOp(g: Graphics2D, chunk: Chunk): boolean {\n const start = this.start\n const end = this.end\n const width = this.layoutBounds.width\n const height = this.layoutBounds.height\n const centerBounds: PathBounds = [-width / 2, -height / 2, width / 2, height / 2]\n if (start <= 0 && end >= 1) {\n g.path({ data: chunk.data, centerBounds })\n return true\n }\n const span = chunk.to - chunk.from\n if (span <= 0) return false\n const localStart = Math.max(0, (start - chunk.from) / span)\n const localEnd = Math.min(1, (end - chunk.from) / span)\n if (localEnd <= localStart) return false\n g.path({ data: chunk.data, centerBounds, start: localStart, end: localEnd })\n return true\n }\n\n private _drawn(): Drawn | null {\n const codes = this.iso as string[]\n const level = this.level\n const frame = this.frame\n const selection = selectGeoFeatures(codes, level, frame)\n for (const code of selection.unknown) {\n if (this._warned.has(code)) continue\n this._warned.add(code)\n console.warn(`[GeoBorder] no region with code ${code}`)\n }\n if (selection.features.length === 0) return null\n\n const geometry = geoGeometry({\n selectionKey: `${geoRegistry.generation}:${geoDataVersion()}:${level}:${frame}:${codes.join(\",\")}`,\n features: selection.features,\n frame,\n projection: this.projection,\n borders: this.borders,\n detail: this.detail,\n })\n if (!geometry) return null\n\n const width = this.layoutBounds.width\n const height = this.layoutBounds.height\n const cached = this._drawnCache\n if (cached && cached.geometry === geometry && cached.width === width && cached.height === height) {\n return cached\n }\n const scale = Math.min(width / geometry.width, height / geometry.height)\n const drawn: Drawn = {\n geometry,\n width,\n height,\n fills: chunk(geometry.fills, geometry.fillLength, scale),\n lines: chunk(geometry.lines, geometry.lineLength, scale),\n }\n this._drawnCache = drawn\n return drawn\n }\n}\n", "import {\n geoArea,\n geoBounds,\n geoConicEqualArea,\n geoEquirectangular,\n geoMercator,\n geoOrthographic,\n geoPath,\n geoStream,\n type GeoPermissibleObjects,\n type GeoProjection,\n} from \"d3-geo\"\n\nimport { ringCoordinates, type GeoArc, type GeoFeature, type GeoPolygon, type GeoRingRef } from \"./format\"\nimport type { GeoFrame } from \"./selection\"\n\nexport type GeoProjectionKind = \"conic\" | \"mercator\" | \"equirectangular\" | \"orthographic\"\nexport type GeoBorders = \"all\" | \"outline\"\n\nexport interface GeoContour {\n /** Interleaved x/y in unit space: the longer side spans 1, centred on the origin, y up. */\n points: Float32Array\n closed: boolean\n length: number\n}\n\nexport interface GeoGeometry {\n /** The drawing's extent in unit space; the longer of the two is 1. */\n width: number\n height: number\n fills: GeoContour[]\n lines: GeoContour[]\n fillLength: number\n lineLength: number\n bytes: number\n}\n\ninterface Part {\n polygon: GeoPolygon\n largest: boolean\n}\n\ninterface Frame {\n projection: GeoProjection\n centerX: number\n centerY: number\n size: number\n width: number\n height: number\n}\n\nconst FIT = 1024\n\n// `detail` maps onto a weight threshold that is a fraction of the selection's\n// own area, on a log scale — which is what makes a value look equally stylised\n// on Monaco and on Russia. 0 keeps points worth 1% of the area; just below 1,\n// points worth a billionth of it.\nconst POINT_BASE = 2\nconst POINT_RANGE = 7\nconst POLYGON_BASE = 1.5\nconst POLYGON_RANGE = 6\n\nconst clamp01 = (value: number) => (value > 1 ? 1 : value > 0 ? value : 0)\n\n/** The highest weight bucket a point may carry and still be drawn. */\nexport function pointBucketLimit(detail: number, area: number): number {\n if (detail >= 1 || !(area > 0)) return 255\n const minWeight = area * 10 ** -(POINT_BASE + POINT_RANGE * clamp01(detail))\n return Math.floor(-2 * Math.log2(minWeight))\n}\n\n/** Rings smaller than this (steradians) are dropped, bar each region's largest. */\nexport function polygonAreaLimit(detail: number, area: number): number {\n if (detail >= 1) return 0\n return area * 10 ** -(POLYGON_BASE + POLYGON_RANGE * clamp01(detail))\n}\n\nfunction partsOf(features: readonly GeoFeature[], frame: GeoFrame): Part[] {\n const parts: Part[] = []\n for (const feature of features) {\n const mainland = frame === \"mainland\" ? feature.polygons.filter((p) => p.mainland) : []\n const polygons = mainland.length > 0 ? mainland : feature.polygons\n let largest: GeoPolygon | null = null\n for (const polygon of polygons) if (!largest || polygon.area > largest.area) largest = polygon\n for (const polygon of polygons) parts.push({ polygon, largest: polygon === largest })\n }\n return parts\n}\n\nfunction centerLongitude(west: number, east: number): number {\n if (west <= east) return (west + east) / 2\n const mid = (west + east + 360) / 2\n return mid > 180 ? mid - 360 : mid\n}\n\nfunction makeProjection(kind: GeoProjectionKind, west: number, south: number, east: number, north: number): GeoProjection {\n const lon = centerLongitude(west, east)\n const lat = (south + north) / 2\n switch (kind) {\n case \"mercator\":\n return geoMercator().rotate([-lon, 0])\n case \"equirectangular\":\n return geoEquirectangular().rotate([-lon, 0])\n case \"orthographic\":\n return geoOrthographic().rotate([-lon, -lat])\n case \"conic\": {\n const span = north - south\n return geoConicEqualArea()\n .rotate([-lon, 0])\n .center([0, lat])\n .parallels([south + span / 6, north - span / 6])\n }\n }\n}\n\nfunction fitFrame(kind: GeoProjectionKind, parts: readonly Part[]): Frame | null {\n if (parts.length === 0) return null\n const shape = {\n type: \"MultiPolygon\",\n coordinates: parts.map(({ polygon }) => [ringCoordinates(polygon.rings[0])]),\n } as GeoPermissibleObjects\n const [[west, south], [east, north]] = geoBounds(shape)\n\n for (const candidate of [kind, \"equirectangular\"] as const) {\n const projection = makeProjection(candidate, west, south, east, north).fitSize([FIT, FIT], shape)\n const [[x0, y0], [x1, y1]] = geoPath(projection).bounds(shape)\n const size = Math.max(x1 - x0, y1 - y0)\n if (!Number.isFinite(size) || size <= 0) continue\n return {\n projection,\n centerX: (x0 + x1) / 2,\n centerY: (y0 + y1) / 2,\n size,\n width: (x1 - x0) / size,\n height: (y1 - y0) / size,\n }\n }\n return null\n}\n\nfunction project(frame: Frame, object: GeoPermissibleObjects, closed: boolean): GeoContour[] {\n const contours: GeoContour[] = []\n let current: number[] | null = null\n const { centerX, centerY, size } = frame\n const sink = {\n point(x: number, y: number) {\n current?.push((x - centerX) / size, -(y - centerY) / size)\n },\n lineStart() {\n current = []\n },\n lineEnd() {\n const flat = current\n current = null\n if (!flat || flat.length < 4) return\n let isClosed = closed\n if (!closed) {\n const n = flat.length\n if (flat[0] === flat[n - 2] && flat[1] === flat[n - 1] && n >= 8) {\n flat.length = n - 2\n isClosed = true\n }\n }\n const points = Float32Array.from(flat)\n contours.push({ points, closed: isClosed, length: contourLength(points, isClosed) })\n },\n polygonStart() {},\n polygonEnd() {},\n sphere() {},\n }\n geoStream(object, frame.projection.stream(sink))\n return contours\n}\n\nfunction contourLength(points: Float32Array, closed: boolean): number {\n let length = 0\n const n = points.length / 2\n for (let i = 1; i < n; i++) {\n length += Math.hypot(points[i * 2] - points[i * 2 - 2], points[i * 2 + 1] - points[i * 2 - 1])\n }\n if (closed && n > 1) length += Math.hypot(points[0] - points[n * 2 - 2], points[1] - points[n * 2 - 1])\n return length\n}\n\n// Longest edge, in degrees, that simplification may leave. d3 takes an edge as\n// the short way round the sphere, so an edge across more than half the planet\n// (Kaliningrad to Chukotka, once the coast between is dropped) turns inside out.\nconst MAX_EDGE_DEGREES = 20\n\ntype MaskFor = (arc: GeoArc) => Uint8Array\n\n/** Which of an arc's points survive `limit`, the same whichever way the arc is walked. */\nfunction keepMask(arc: GeoArc, limit: number): Uint8Array {\n const n = arc.buckets.length\n const mask = new Uint8Array(n)\n let lastLon = arc.points[0]\n let lastLat = arc.points[1]\n for (let i = 0; i < n; i++) {\n const lon = arc.points[i * 2]\n const lat = arc.points[i * 2 + 1]\n let far = false\n if (arc.buckets[i] > limit) {\n let dLon = Math.abs(lon - lastLon)\n if (dLon > 180) dLon = 360 - dLon\n far = Math.abs(lat - lastLat) > MAX_EDGE_DEGREES || dLon * Math.cos((lat * Math.PI) / 180) > MAX_EDGE_DEGREES\n }\n if (arc.buckets[i] <= limit || far) {\n mask[i] = 1\n lastLon = lon\n lastLat = lat\n }\n }\n return mask\n}\n\nfunction filteredPoints(refs: readonly GeoRingRef[], maskFor: MaskFor): [number, number][] {\n const out: [number, number][] = []\n for (const { arc, reversed } of refs) {\n const n = arc.buckets.length\n const mask = maskFor(arc)\n for (let j = out.length === 0 ? 0 : 1; j < n; j++) {\n const i = reversed ? n - 1 - j : j\n if (mask[i]) out.push([arc.points[i * 2], arc.points[i * 2 + 1]])\n }\n }\n return out\n}\n\n/** A ring keeps at least three vertices, raising its arcs' limits if the global one would collapse it. */\nfunction ringLimit(ring: readonly GeoRingRef[], limit: number): number {\n let kept = 0\n for (const { arc } of ring) {\n for (let i = 0; i < arc.buckets.length - 1; i++) if (arc.buckets[i] <= limit) kept++\n }\n if (kept >= 3) return limit\n const buckets: number[] = []\n for (const { arc } of ring) for (let i = 0; i < arc.buckets.length - 1; i++) buckets.push(arc.buckets[i])\n buckets.sort((a, b) => a - b)\n return Math.max(limit, buckets[Math.min(2, buckets.length - 1)] ?? limit)\n}\n\n/**\n * Whether a simplified ring still winds the way its original did. Dropping\n * points can fold a small ring over itself, and d3 reads an exterior wound the\n * wrong way as the rest of the planet — one such island fills the whole frame.\n */\nfunction windsAsOriginal(ring: [number, number][], exterior: boolean): boolean {\n if (ring.length < 4) return true\n const inverted = geoArea({ type: \"Polygon\", coordinates: [ring] }) > 2 * Math.PI\n return inverted !== exterior\n}\n\ninterface Chain {\n refs: GeoRingRef[]\n closed: boolean\n}\n\nconst endKey = (arc: GeoArc, last: boolean) => {\n const i = last ? arc.buckets.length - 1 : 0\n return `${arc.points[i * 2]},${arc.points[i * 2 + 1]}`\n}\n\n/** Joins arcs that meet end to end with nothing else at the joint, so a border draws as one line with real joins. */\nfunction chainArcs(arcs: readonly GeoArc[]): Chain[] {\n const atNode = new Map<string, GeoArc[]>()\n for (const arc of arcs) {\n for (const key of [endKey(arc, false), endKey(arc, true)]) {\n const list = atNode.get(key)\n if (list) list.push(arc)\n else atNode.set(key, [arc])\n }\n }\n const visited = new Set<GeoArc>()\n const chains: Chain[] = []\n const refStart = ({ arc, reversed }: GeoRingRef) => endKey(arc, reversed)\n const refEnd = ({ arc, reversed }: GeoRingRef) => endKey(arc, !reversed)\n const nextAt = (node: string): GeoArc | null => {\n const list = atNode.get(node)!\n if (list.length !== 2) return null\n return list.find((arc) => !visited.has(arc)) ?? null\n }\n\n for (const arc of arcs) {\n if (visited.has(arc)) continue\n visited.add(arc)\n const refs: GeoRingRef[] = [{ arc, reversed: false }]\n for (let next = nextAt(refEnd(refs[refs.length - 1])); next; next = nextAt(refEnd(refs[refs.length - 1]))) {\n visited.add(next)\n refs.push({ arc: next, reversed: endKey(next, false) !== refEnd(refs[refs.length - 1]) })\n }\n for (let prev = nextAt(refStart(refs[0])); prev; prev = nextAt(refStart(refs[0]))) {\n visited.add(prev)\n refs.unshift({ arc: prev, reversed: endKey(prev, true) !== refStart(refs[0]) })\n }\n chains.push({ refs, closed: refStart(refs[0]) === refEnd(refs[refs.length - 1]) })\n }\n return chains\n}\n\nfunction buildGeometry(\n features: readonly GeoFeature[],\n frame: GeoFrame,\n fitted: Frame,\n borders: GeoBorders,\n detail: number\n): GeoGeometry {\n const parts = partsOf(features, frame)\n const area = parts.reduce((sum, { polygon }) => sum + polygon.area, 0)\n const pointLimit = pointBucketLimit(detail, area)\n const polygonLimit = polygonAreaLimit(detail, area)\n\n const kept: GeoRingRef[][][] = []\n for (const { polygon, largest } of parts) {\n if (!largest && polygon.area < polygonLimit) continue\n kept.push(polygon.rings.filter((_, i) => i === 0 || polygon.ringAreas[i] >= polygonLimit))\n }\n\n const limits = new Map<GeoArc[\"key\"], number>()\n const usage = new Map<GeoArc[\"key\"], { arc: GeoArc; count: number }>()\n for (const rings of kept) {\n for (const ring of rings) {\n const limit = ringLimit(ring, pointLimit)\n for (const { arc } of ring) {\n limits.set(arc.key, Math.max(limits.get(arc.key) ?? 0, limit))\n const use = usage.get(arc.key)\n if (use) use.count++\n else usage.set(arc.key, { arc, count: 1 })\n }\n }\n }\n\n const masks = new Map<GeoArc[\"key\"], Uint8Array>()\n const maskFor: MaskFor = (arc) => {\n let mask = masks.get(arc.key)\n if (!mask) {\n mask = keepMask(arc, limits.get(arc.key) ?? 255)\n masks.set(arc.key, mask)\n }\n return mask\n }\n\n if (pointLimit < 255) {\n for (const rings of kept) {\n rings.forEach((ring, index) => {\n let limit = Math.min(...ring.map(({ arc }) => limits.get(arc.key) ?? pointLimit))\n while (limit < 255 && !windsAsOriginal(filteredPoints(ring, maskFor), index === 0)) {\n limit = Math.min(255, limit + 2)\n for (const { arc } of ring) {\n limits.set(arc.key, Math.max(limits.get(arc.key) ?? 0, limit))\n masks.delete(arc.key)\n }\n }\n })\n }\n }\n\n const fills = project(\n fitted,\n {\n type: \"MultiPolygon\",\n coordinates: kept.flatMap((rings) => {\n const [exterior, ...holes] = rings.map((ring) => filteredPoints(ring, maskFor))\n return exterior.length < 4 ? [] : [[exterior, ...holes.filter((hole) => hole.length >= 4)]]\n }),\n } as GeoPermissibleObjects,\n true\n )\n\n const lineArcs = [...usage.values()].filter(({ count }) => borders === \"all\" || count === 1).map(({ arc }) => arc)\n const lines: GeoContour[] = []\n for (const chain of chainArcs(lineArcs)) {\n lines.push(\n ...project(fitted, { type: \"LineString\", coordinates: filteredPoints(chain.refs, maskFor) } as GeoPermissibleObjects, false)\n )\n }\n\n const sum = (contours: GeoContour[]) => contours.reduce((total, c) => total + c.length, 0)\n const bytes = [...fills, ...lines].reduce((total, c) => total + c.points.byteLength + 32, 0)\n return {\n width: fitted.width,\n height: fitted.height,\n fills,\n lines,\n fillLength: sum(fills),\n lineLength: sum(lines),\n bytes,\n }\n}\n\nclass ByteCache<V extends { bytes: number }> {\n private _entries = new Map<string, V>()\n private _bytes = 0\n\n constructor(private readonly _budget: number) {}\n\n get(key: string): V | undefined {\n const value = this._entries.get(key)\n if (value) {\n this._entries.delete(key)\n this._entries.set(key, value)\n }\n return value\n }\n\n set(key: string, value: V): void {\n const previous = this._entries.get(key)\n if (previous) this._bytes -= previous.bytes\n this._entries.delete(key)\n this._entries.set(key, value)\n this._bytes += value.bytes\n for (const [oldest, entry] of this._entries) {\n if (this._bytes <= this._budget || this._entries.size <= 1) break\n this._entries.delete(oldest)\n this._bytes -= entry.bytes\n }\n }\n\n clear(): void {\n this._entries.clear()\n this._bytes = 0\n }\n}\n\nconst frames = new ByteCache<Frame & { bytes: number }>(64)\nconst geometries = new ByteCache<GeoGeometry>(64 * 1024 * 1024)\n\nexport interface GeoGeometryRequest {\n /** Identifies `features` and `frame`: equal keys must mean equal selections. */\n selectionKey: string\n features: readonly GeoFeature[]\n frame: GeoFrame\n projection: GeoProjectionKind\n borders: GeoBorders\n detail: number\n}\n\n/**\n * The drawing for a selection, cached. The projection is fitted to the\n * selection at full detail, so a `detail` tween never moves or rescales it.\n */\nexport function geoGeometry(request: GeoGeometryRequest): GeoGeometry | null {\n const detail = Math.round(clamp01(request.detail) * 100) / 100\n const frameKey = `${request.selectionKey}|${request.projection}`\n const key = `${frameKey}|${request.borders}|${detail}`\n const cached = geometries.get(key)\n if (cached) return cached\n\n let fitted: Frame | undefined = frames.get(frameKey)\n if (!fitted) {\n const made = fitFrame(request.projection, partsOf(request.features, request.frame))\n if (!made) return null\n fitted = made\n frames.set(frameKey, { ...made, bytes: 1 })\n }\n const geometry = buildGeometry(request.features, request.frame, fitted, request.borders, detail)\n geometries.set(key, geometry)\n return geometry\n}\n\nexport function clearGeoGeometry(): void {\n frames.clear()\n geometries.clear()\n}\n", "/**\n * Visvalingam–Whyatt weights for a hand-defined ring, in the same buckets the\n * generated data carries (`-2·log2` of the effective area in steradians), so a\n * shape passed to `geoRegistry.define` answers to `detail` like any other.\n *\n * Planar in degrees with longitude scaled by latitude: accurate enough for the\n * handful of shapes an author defines, where the generated data uses the exact\n * spherical area.\n */\nexport function ringBuckets(points: Float64Array): Uint8Array {\n const n = points.length / 2\n const buckets = new Uint8Array(n)\n if (n < 3) return buckets\n\n const radians = Math.PI / 180\n const weight = new Float64Array(n)\n const prev = new Int32Array(n)\n const next = new Int32Array(n)\n for (let i = 0; i < n; i++) {\n prev[i] = i - 1\n next[i] = i + 1\n }\n\n const area = (a: number, b: number, c: number): number => {\n const cos = Math.cos(points[b * 2 + 1] * radians)\n const ax = points[a * 2] * cos, ay = points[a * 2 + 1]\n const bx = points[b * 2] * cos, by = points[b * 2 + 1]\n const cx = points[c * 2] * cos, cy = points[c * 2 + 1]\n return (Math.abs((bx - ax) * (cy - ay) - (cx - ax) * (by - ay)) / 2) * radians * radians\n }\n\n const heap: number[] = []\n const position = new Int32Array(n).fill(-1)\n const less = (i: number, j: number) => weight[heap[i]] < weight[heap[j]]\n const swap = (i: number, j: number) => {\n ;[heap[i], heap[j]] = [heap[j], heap[i]]\n position[heap[i]] = i\n position[heap[j]] = j\n }\n const up = (i: number) => {\n while (i > 0) {\n const parent = (i - 1) >> 1\n if (!less(i, parent)) break\n swap(i, parent)\n i = parent\n }\n }\n const down = (i: number) => {\n for (;;) {\n const l = 2 * i + 1\n const r = l + 1\n let smallest = i\n if (l < heap.length && less(l, smallest)) smallest = l\n if (r < heap.length && less(r, smallest)) smallest = r\n if (smallest === i) return\n swap(i, smallest)\n i = smallest\n }\n }\n const push = (i: number) => {\n position[i] = heap.length\n heap.push(i)\n up(heap.length - 1)\n }\n const remove = (i: number) => {\n const at = position[i]\n const last = heap.pop()!\n position[i] = -1\n if (at < heap.length) {\n heap[at] = last\n position[last] = at\n up(at)\n down(position[last])\n }\n }\n\n for (let i = 1; i < n - 1; i++) {\n weight[i] = area(i - 1, i, i + 1)\n push(i)\n }\n\n let floor = 0\n const final = new Float64Array(n)\n final[0] = final[n - 1] = Infinity\n while (heap.length > 0) {\n const i = heap[0]\n remove(i)\n floor = Math.max(floor, weight[i])\n final[i] = floor\n const p = prev[i]\n const q = next[i]\n if (p >= 0) next[p] = q\n if (q < n) prev[q] = p\n for (const j of [p, q]) {\n if (j <= 0 || j >= n - 1 || position[j] < 0) continue\n remove(j)\n weight[j] = area(prev[j], j, next[j])\n push(j)\n }\n }\n\n for (let i = 0; i < n; i++) buckets[i] = weightBucket(final[i])\n return buckets\n}\n\nexport function weightBucket(weight: number): number {\n if (weight === Infinity) return 0\n if (!(weight > 0)) return 255\n return Math.min(254, Math.max(1, Math.round(-2 * Math.log2(weight))))\n}\n", "import { geoArea } from \"d3-geo\"\n\nimport {\n GEO_DATA_FORMAT,\n type GeoFeature,\n type GeoFileData,\n type GeoIndex,\n type GeoPolygon,\n type GeoRingRef,\n} from \"./format\"\nimport { ringBuckets } from \"./simplify\"\n\n/** Prefix every data key carries; bumped with the file format. */\nexport const GEO_DATA_VERSION = `v${GEO_DATA_FORMAT}`\n\n/**\n * Answers a data key — `v1/countries/FR`, `v1/states/US`, `v1/index` — with the\n * parsed file, or `null` when this source does not have it. A throw means \"could\n * not tell\" (offline, a 500) and is retried on the next load.\n */\nexport type GeoSource = (key: string) => Promise<unknown>\n\ntype Position = readonly [number, number] | readonly number[]\ntype GeoPolygonShape =\n | { type: \"Polygon\"; coordinates: readonly (readonly Position[])[] }\n | { type: \"MultiPolygon\"; coordinates: readonly (readonly (readonly Position[])[])[] }\n/** GeoJSON in lon/lat: a Polygon, a MultiPolygon, or a Feature holding one. */\nexport type GeoShape = GeoPolygonShape | { type: \"Feature\"; geometry: GeoPolygonShape; properties?: { name?: string } | null }\n\nexport interface GeoDefinition {\n shape: GeoShape\n name?: string\n /** The country a subdivision code expands under, when it has one. */\n parent?: string\n}\n\n/** Fetches `<base>/<key>.json`; `base` may instead map a key to its URL. */\nexport function geoUrlSource(base: string | ((key: string) => string), init?: RequestInit): GeoSource {\n return async (key) => {\n const url = typeof base === \"function\" ? base(key) : `${base.replace(/\\/+$/, \"\")}/${key}.json`\n const response = await fetch(url, init)\n // Supabase Storage answers a missing object with 400, not 404.\n if (response.status === 404 || response.status === 400) return null\n if (!response.ok) throw new Error(`${url} → HTTP ${response.status}`)\n return response.json()\n }\n}\n\n/** Wraps a function returning the file as text, bytes or parsed JSON (e.g. `fs.readFile`). */\nexport function geoLoaderSource(\n load: (key: string) => Promise<string | ArrayBuffer | Uint8Array | object | null | undefined>\n): GeoSource {\n return async (key) => {\n const value = await load(key)\n if (value == null) return null\n if (typeof value === \"string\") return JSON.parse(value)\n if (value instanceof ArrayBuffer || value instanceof Uint8Array) {\n return JSON.parse(new TextDecoder().decode(value))\n }\n return value\n }\n}\n\nfunction definedFeature(code: string, definition: GeoDefinition, serial: number): GeoFeature {\n const shape = definition.shape.type === \"Feature\" ? definition.shape.geometry : definition.shape\n const feature = definition.shape.type === \"Feature\" ? definition.shape : null\n const polygons: readonly (readonly (readonly Position[])[])[] =\n shape.type === \"Polygon\" ? [shape.coordinates] : shape.coordinates\n let arcIndex = 0\n\n const toRing = (ring: readonly Position[]): GeoRingRef => {\n const closed = ring.length > 0 && ring[0][0] === ring[ring.length - 1][0] && ring[0][1] === ring[ring.length - 1][1]\n const coordinates = closed ? ring : [...ring, ring[0]]\n const points = new Float64Array(coordinates.length * 2)\n coordinates.forEach(([lon, lat], i) => {\n points[i * 2] = lon\n points[i * 2 + 1] = lat\n })\n return { arc: { key: `define:${serial}:${code}:${arcIndex++}`, points, buckets: ringBuckets(points) }, reversed: false }\n }\n\n const measured: GeoPolygon[] = polygons.map((rings) => {\n const resolved = rings.map((ring) => [toRing(ring)])\n const ringAreas = rings.map((ring) => {\n const area = geoArea({ type: \"Polygon\", coordinates: [ring as [number, number][]] })\n return area > 2 * Math.PI ? 4 * Math.PI - area : area\n })\n const area = Math.max(0, ringAreas[0] - ringAreas.slice(1).reduce((a, b) => a + b, 0))\n return { rings: resolved, ringAreas, area, mainland: true }\n })\n\n const name = definition.name ?? feature?.properties?.name ?? code\n return {\n code,\n name,\n nameNl: name,\n parent: definition.parent ?? (code.includes(\"-\") ? code.slice(0, 2) : null),\n first: true,\n listed: false,\n remote: false,\n polygons: measured,\n }\n}\n\nclass GeoRegistry {\n private _sources: GeoSource[] = []\n private _defined = new Map<string, { serial: number; feature: GeoFeature }>()\n private _generation = 0\n private _serial = 0\n\n /** Bumps whenever a source or a definition is added or removed. */\n get generation(): number {\n return this._generation\n }\n\n get hasSources(): boolean {\n return this._sources.length > 0\n }\n\n /** Adds a source after every source already registered. Returns its removal. */\n use(source: GeoSource): () => void {\n this._sources.push(source)\n this._generation++\n return () => {\n const i = this._sources.indexOf(source)\n if (i < 0) return\n this._sources.splice(i, 1)\n this._generation++\n }\n }\n\n /**\n * Shapes (GeoJSON, lon/lat) under codes of your choosing, checked before any\n * source. A definition replaces generated data for the same code.\n */\n define(shapes: Record<string, GeoShape | GeoDefinition>): () => void {\n const serial = ++this._serial\n const codes = Object.entries(shapes).map(([rawCode, value]) => {\n const code = rawCode.trim().toUpperCase()\n const definition = \"shape\" in value ? value : { shape: value }\n this._defined.set(code, { serial, feature: definedFeature(code, definition, serial) })\n return code\n })\n this._generation++\n return () => {\n for (const code of codes) {\n if (this._defined.get(code)?.serial === serial) this._defined.delete(code)\n }\n this._generation++\n }\n }\n\n defined(code: string): GeoFeature | undefined {\n return this._defined.get(code)?.feature\n }\n\n /** Removes every source and definition — for tests. */\n reset(): void {\n this._sources = []\n this._defined.clear()\n this._generation++\n }\n\n /**\n * Asks each source in registration order; the first non-null answer wins.\n * Resolves `null` only when every source answered that it has no such file.\n */\n async resolve(key: string): Promise<GeoFileData | GeoIndex | null> {\n if (this._sources.length === 0) {\n throw new Error(\"No geo source registered — call geoRegistry.use(geoUrlSource(…)) before rendering GeoBorder\")\n }\n let failure: unknown = null\n for (const source of [...this._sources]) {\n try {\n const value = await source(key)\n if (value != null) return value as GeoFileData | GeoIndex\n } catch (error) {\n failure ??= error\n }\n }\n if (failure) throw failure\n return null\n }\n\n /** Every listed region's code, names and parent, for a picker. */\n async index(): Promise<GeoIndex | null> {\n return (await this.resolve(`${GEO_DATA_VERSION}/index`)) as GeoIndex | null\n }\n}\n\nexport const geoRegistry = new GeoRegistry()\n", "import type { LoaderFn } from \"@motionscript/core\"\n\nimport { decodeGeoFile, type DecodedGeoFile, type GeoFileData } from \"./format\"\nimport { GEO_DATA_VERSION, geoRegistry } from \"./registry\"\n\nexport type GeoFileEntry =\n | { status: \"ready\"; file: DecodedGeoFile }\n | { status: \"missing\" }\n | { status: \"failed\"; error: unknown }\n\nconst entries = new Map<string, GeoFileEntry>()\nconst inflight = new Map<string, Promise<GeoFileEntry>>()\nconst loaders = new Map<string, LoaderFn>()\nconst warned = new Set<string>()\nlet version = 0\n\nexport function countryFileKey(code: string): string {\n return `${GEO_DATA_VERSION}/countries/${code}`\n}\n\nexport function statesFileKey(country: string): string {\n return `${GEO_DATA_VERSION}/states/${country}`\n}\n\n/** Bumps whenever a file lands, so derived geometry keyed on it rebuilds. */\nexport function geoDataVersion(): number {\n return version\n}\n\nexport function geoFileEntry(key: string): GeoFileEntry | undefined {\n return entries.get(key)\n}\n\nasync function fetchEntry(key: string): Promise<GeoFileEntry> {\n try {\n let data = (await geoRegistry.resolve(key)) as GeoFileData | null\n // A country with no subdivisions has no states file; its outline stands in.\n if (data === null && key.includes(\"/states/\")) {\n data = (await geoRegistry.resolve(key.replace(\"/states/\", \"/countries/\"))) as GeoFileData | null\n }\n return data === null ? { status: \"missing\" } : { status: \"ready\", file: decodeGeoFile(data) }\n } catch (error) {\n return { status: \"failed\", error }\n }\n}\n\n/**\n * Loads one data file into the shared cache. Never rejects: a rejected loader\n * is retried on every tick and fails an export outright, where a recorded\n * failure draws nothing and is tried again by the next call.\n */\nexport function loadGeoFile(key: string): Promise<GeoFileEntry> {\n const current = entries.get(key)\n if (current?.status === \"ready\") return Promise.resolve(current)\n let job = inflight.get(key)\n if (!job) {\n job = fetchEntry(key).then((entry) => {\n inflight.delete(key)\n entries.set(key, entry)\n version++\n if (entry.status === \"ready\") {\n warned.delete(key)\n } else if (!warned.has(key)) {\n warned.add(key)\n if (entry.status === \"failed\") console.warn(`[GeoBorder] could not load ${key}:`, entry.error)\n else console.warn(`[GeoBorder] no geo source has ${key}`)\n }\n return entry\n })\n inflight.set(key, job)\n }\n return job\n}\n\n/**\n * The loader an `AssetScope` declares for a file: one function per key, so\n * every node that needs the file declares the same one. Nothing is disposed —\n * decoded data is shared by every engine in the process.\n */\nexport function geoLoader(key: string): LoaderFn {\n let load = loaders.get(key)\n if (!load) {\n load = async () => {\n await loadGeoFile(key)\n }\n loaders.set(key, load)\n }\n return load\n}\n\n/** Forgets every loaded file — for tests. */\nexport function clearGeoFiles(): void {\n entries.clear()\n inflight.clear()\n warned.clear()\n version++\n}\n", "import type { GeoFeature } from \"./format\"\nimport { countryFileKey, geoFileEntry, statesFileKey } from \"./loader\"\nimport { geoRegistry } from \"./registry\"\n\nexport type GeoLevel = \"country\" | \"state\"\nexport type GeoFrame = \"mainland\" | \"all\"\n\nconst CODE = /^[A-Z]{2}(-[A-Z0-9]{1,3})?$/\n\n/** `\"fr, de\"`, `[\"FR\", \"de\"]` → `[\"FR\", \"DE\"]`; unique, in order, empties dropped. */\nexport function normalizeIso(value: unknown): string[] {\n const raw = Array.isArray(value) ? value : typeof value === \"string\" ? value.split(/[\\s,;]+/) : []\n const out: string[] = []\n for (const item of raw) {\n if (typeof item !== \"string\") continue\n const code = item.trim().toUpperCase()\n if (code && !out.includes(code)) out.push(code)\n }\n return out\n}\n\nfunction isSubdivision(code: string): boolean {\n return code.includes(\"-\")\n}\n\n/** Every data file a selection reads, for `declareAssets`. Depends on nothing but its arguments. */\nexport function geoFilesFor(codes: readonly string[], level: GeoLevel): string[] {\n const files = new Set<string>()\n for (const code of codes) {\n if (!CODE.test(code) || geoRegistry.defined(code)) continue\n if (isSubdivision(code)) files.add(statesFileKey(code.slice(0, 2)))\n else files.add(level === \"state\" ? statesFileKey(code) : countryFileKey(code))\n }\n return [...files]\n}\n\nexport interface GeoSelection {\n features: GeoFeature[]\n /** A file this selection needs has not landed yet. */\n pending: boolean\n /** Codes whose file loaded without them. */\n unknown: string[]\n}\n\n/**\n * The features a selection draws. A bare country code at state level is its\n * first-level subdivisions — minus the remote ones when framing the mainland —\n * or the country itself when it has none.\n */\nexport function selectGeoFeatures(codes: readonly string[], level: GeoLevel, frame: GeoFrame): GeoSelection {\n const features: GeoFeature[] = []\n const seen = new Set<string>()\n const unknown: string[] = []\n let pending = false\n\n const add = (feature: GeoFeature) => {\n if (seen.has(feature.code)) return\n seen.add(feature.code)\n features.push(feature)\n }\n\n for (const code of codes) {\n const defined = geoRegistry.defined(code)\n if (defined) {\n add(defined)\n continue\n }\n if (!CODE.test(code)) {\n unknown.push(code)\n continue\n }\n const subdivision = isSubdivision(code)\n const key = subdivision || level === \"state\" ? statesFileKey(code.slice(0, 2)) : countryFileKey(code)\n const entry = geoFileEntry(key)\n if (!entry || entry.status !== \"ready\") {\n if (!entry) pending = true\n continue\n }\n const file = entry.file.features\n if (subdivision || level === \"country\") {\n const feature = file.get(code)\n if (feature) add(feature)\n else unknown.push(code)\n continue\n }\n const children = [...file.values()].filter(\n (f) => f.parent === code && f.first && !(frame === \"mainland\" && f.remote)\n )\n if (children.length > 0) children.forEach(add)\n else if (file.get(code)) add(file.get(code)!)\n else unknown.push(code)\n }\n\n return { features, pending, unknown }\n}\n", "/**\n * The halo around the planet's edge — a shell, seen from the inside.\n *\n * The trick is old and still the best one: draw a sphere slightly larger than\n * the planet, keep only its **back** faces, and light nothing. What survives is\n * the far wall of the shell, which the planet hides everywhere except around the\n * silhouette — so the brightness only has to be a function of how edge-on the\n * surface is, and the occlusion comes free from the depth buffer.\n *\n * That is why it is a shader rather than a material with a gradient: the value\n * needed is `1 - |n · v|`, which no material exposes, and which is *per pixel*.\n * A gradient painted onto a sphere is fixed to the geometry and slides as the\n * camera turns; this is anchored to the eye, so the rim stays on the horizon\n * wherever the globe is looked at from.\n *\n * Additively blended, because atmosphere adds light rather than covering\n * anything — which also means it never darkens the stars or the planet behind\n * it, and needs no sorting against them.\n */\n\nimport { Mat, type Material3D, type NormalizedColor } from \"@motionscript/core\"\n\n/**\n * The eye-facing rim term, and nothing else.\n *\n * `vView` is the fragment's direction to the camera in view space, where the eye\n * is the origin — so it needs no camera uniform, and the same shader works for\n * an orthographic camera where a `cameraPosition` version would not.\n */\nconst VERTEX = /* glsl */ `\nvarying vec3 vNormal;\nvarying vec3 vView;\n\nvoid main() {\n vec4 viewPosition = modelViewMatrix * vec4(position, 1.0);\n vNormal = normalize(normalMatrix * normal);\n vView = -viewPosition.xyz;\n gl_Position = projectionMatrix * viewPosition;\n}\n`\n\n/**\n * `abs` on the dot product, deliberately: these are back faces, so the normal\n * points away from the eye and the un-absolute term would be brightest face-on —\n * a disc over the planet instead of a ring around it.\n */\nconst FRAGMENT = /* glsl */ `\nuniform vec3 uColor;\nuniform float uFalloff;\nuniform float uIntensity;\n\nvarying vec3 vNormal;\nvarying vec3 vView;\n\nvoid main() {\n float facing = abs(dot(normalize(vNormal), normalize(vView)));\n float rim = pow(clamp(1.0 - facing, 0.0, 1.0), uFalloff) * uIntensity;\n gl_FragColor = vec4(uColor * rim, rim);\n}\n`\n\n/**\n * The atmosphere's material — including which faces it keeps and how it blends.\n *\n * Those two belong *on the descriptor* rather than in the mesh shorthand beside\n * it, and not as a matter of taste: `resolveMaterialShorthand3D` returns an\n * explicit `material` immediately and never reaches the shorthand's own `faces`\n * or `blend`. Set them out there and they are silently dropped — the shell keeps\n * its front faces, covers the planet in a bright disc, and the only clue is that\n * the globe has gone.\n *\n * `color` arrives as core's resolved `[r, g, b, a]` and is handed on as three\n * numbers rather than four: the uniform coercion reads a numeric array of length\n * four as a `vec4`, never as a colour, so passing the tuple whole would bind\n * alpha where the shader expects nothing and shift the hue. Alpha has nothing to\n * say here anyway — the rim term is the opacity.\n */\nexport function atmosphereMaterial(\n color: NormalizedColor,\n falloff: number,\n intensity: number\n): Material3D {\n return Mat.shader({\n vertex: VERTEX,\n fragment: FRAGMENT,\n uniforms: {\n uColor: [color[0], color[1], color[2]],\n uFalloff: falloff,\n uIntensity: intensity,\n },\n faces: \"back\",\n blend: \"additive\",\n transparent: true,\n // Nothing here writes depth: the shell is a light, and one that occluded\n // would hide the planet it is drawn around.\n depthWrite: false,\n })\n}\n", "// Generated by scripts/vendor-natural-earth.mjs — do not edit.\n//\n// Natural Earth 1:110m Admin 0 – Countries, v5.1.2. Public domain.\n// See CREDITS.md beside this file.\n//\n// 177 countries, 289 rings, 10360 points, 1/1000° quantum.\n// source sha256 6866c877d39cba9c357620878839b336d569f8c662d3cfab4cb1dbe2d39c977f\n\n/** One country's identity and the shape of its rings. */\nexport interface CountryRow {\n /** Three-letter code, `ADM0_A3`. Stable across releases; not always ISO. */\n id: string\n /** English name, as Natural Earth spells it. */\n name: string\n /**\n * Point counts for this country's rings, in the order they appear in\n * {@link POINTS}. **Negative marks a hole** — see the decoder.\n */\n rings: number[]\n}\n\n/** Degrees per encoded unit, as a divisor. */\nexport const PRECISION = 1000\n\n/** Every country, sorted by {@link CountryRow.id}. */\nexport const COUNTRIES: readonly CountryRow[] = [\n { id: \"AFG\", name: \"Afghanistan\", rings: [68] },\n { id: \"AGO\", name: \"Angola\", rings: [8, 65] },\n { id: \"ALB\", name: \"Albania\", rings: [23] },\n { id: \"ARE\", name: \"United Arab Emirates\", rings: [21] },\n { id: \"ARG\", name: \"Argentina\", rings: [10, 109] },\n { id: \"ARM\", name: \"Armenia\", rings: [19] },\n { id: \"ATA\", name: \"Antarctica\", rings: [21, 12, 25, 12, 9, 7, 10, 555] },\n { id: \"ATF\", name: \"Fr. S. Antarctic Lands\", rings: [8] },\n { id: \"AUS\", name: \"Australia\", rings: [16, 223] },\n { id: \"AUT\", name: \"Austria\", rings: [36] },\n { id: \"AZE\", name: \"Azerbaijan\", rings: [34, 8] },\n { id: \"BDI\", name: \"Burundi\", rings: [12] },\n { id: \"BEL\", name: \"Belgium\", rings: [16] },\n { id: \"BEN\", name: \"Benin\", rings: [24] },\n { id: \"BFA\", name: \"Burkina Faso\", rings: [38] },\n { id: \"BGD\", name: \"Bangladesh\", rings: [35] },\n { id: \"BGR\", name: \"Bulgaria\", rings: [27] },\n { id: \"BHS\", name: \"Bahamas\", rings: [5, 6, 7] },\n { id: \"BIH\", name: \"Bosnia and Herz.\", rings: [22] },\n { id: \"BLR\", name: \"Belarus\", rings: [44] },\n { id: \"BLZ\", name: \"Belize\", rings: [19] },\n { id: \"BOL\", name: \"Bolivia\", rings: [59] },\n { id: \"BRA\", name: \"Brazil\", rings: [202] },\n { id: \"BRN\", name: \"Brunei\", rings: [7] },\n { id: \"BTN\", name: \"Bhutan\", rings: [12] },\n { id: \"BWA\", name: \"Botswana\", rings: [39] },\n { id: \"CAF\", name: \"Central African Rep.\", rings: [61] },\n { id: \"CAN\", name: \"Canada\", rings: [273, 6, 10, 7, 7, 6, 8, 27, 6, 6, 32, 19, 72, 10, 11, 10, 10, 15, 16, 21, 44, 14, 5, 12, 20, 64, 8, 10, 7, 8] },\n { id: \"CHE\", name: \"Switzerland\", rings: [23] },\n { id: \"CHL\", name: \"Chile\", rings: [19, 93] },\n { id: \"CHN\", name: \"China\", rings: [9, 229] },\n { id: \"CIV\", name: \"Côte d'Ivoire\", rings: [45] },\n { id: \"CMR\", name: \"Cameroon\", rings: [60] },\n { id: \"COD\", name: \"Dem. Rep. Congo\", rings: [123] },\n { id: \"COG\", name: \"Congo\", rings: [48] },\n { id: \"COL\", name: \"Colombia\", rings: [99] },\n { id: \"CRI\", name: \"Costa Rica\", rings: [35] },\n { id: \"CUB\", name: \"Cuba\", rings: [41] },\n { id: \"CYN\", name: \"N. Cyprus\", rings: [15] },\n { id: \"CYP\", name: \"Cyprus\", rings: [14] },\n { id: \"CZE\", name: \"Czechia\", rings: [34] },\n { id: \"DEU\", name: \"Germany\", rings: [57] },\n { id: \"DJI\", name: \"Djibouti\", rings: [14] },\n { id: \"DNK\", name: \"Denmark\", rings: [17, 5] },\n { id: \"DOM\", name: \"Dominican Rep.\", rings: [25] },\n { id: \"DZA\", name: \"Algeria\", rings: [61] },\n { id: \"ECU\", name: \"Ecuador\", rings: [32] },\n { id: \"EGY\", name: \"Egypt\", rings: [43] },\n { id: \"ERI\", name: \"Eritrea\", rings: [27] },\n { id: \"ESP\", name: \"Spain\", rings: [50] },\n { id: \"EST\", name: \"Estonia\", rings: [18] },\n { id: \"ETH\", name: \"Ethiopia\", rings: [58] },\n { id: \"FIN\", name: \"Finland\", rings: [39] },\n { id: \"FJI\", name: \"Fiji\", rings: [7, 8, 4] },\n { id: \"FLK\", name: \"Falkland Is.\", rings: [9] },\n { id: \"FRA\", name: \"France\", rings: [18, 47, 6] },\n { id: \"GAB\", name: \"Gabon\", rings: [30] },\n { id: \"GBR\", name: \"United Kingdom\", rings: [7, 47] },\n { id: \"GEO\", name: \"Georgia\", rings: [23] },\n { id: \"GHA\", name: \"Ghana\", rings: [24] },\n { id: \"GIN\", name: \"Guinea\", rings: [69] },\n { id: \"GMB\", name: \"Gambia\", rings: [15] },\n { id: \"GNB\", name: \"Guinea-Bissau\", rings: [18] },\n { id: \"GNQ\", name: \"Eq. Guinea\", rings: [6] },\n { id: \"GRC\", name: \"Greece\", rings: [10, 42] },\n { id: \"GRL\", name: \"Greenland\", rings: [131] },\n { id: \"GTM\", name: \"Guatemala\", rings: [34] },\n { id: \"GUY\", name: \"Guyana\", rings: [39] },\n { id: \"HND\", name: \"Honduras\", rings: [56] },\n { id: \"HRV\", name: \"Croatia\", rings: [42] },\n { id: \"HTI\", name: \"Haiti\", rings: [20] },\n { id: \"HUN\", name: \"Hungary\", rings: [31] },\n { id: \"IDN\", name: \"Indonesia\", rings: [37, 8, 6, 38, 8, 5, 12, 44, 6, 8, 9, 22, 34] },\n { id: \"IND\", name: \"India\", rings: [135] },\n { id: \"IRL\", name: \"Ireland\", rings: [12] },\n { id: \"IRN\", name: \"Iran\", rings: [75] },\n { id: \"IRQ\", name: \"Iraq\", rings: [29] },\n { id: \"ISL\", name: \"Iceland\", rings: [19] },\n { id: \"ISR\", name: \"Israel\", rings: [25] },\n { id: \"ITA\", name: \"Italy\", rings: [65, 10, 9] },\n { id: \"JAM\", name: \"Jamaica\", rings: [10] },\n { id: \"JOR\", name: \"Jordan\", rings: [18] },\n { id: \"JPN\", name: \"Japan\", rings: [36, 15, 11] },\n { id: \"KAZ\", name: \"Kazakhstan\", rings: [111] },\n { id: \"KEN\", name: \"Kenya\", rings: [36] },\n { id: \"KGZ\", name: \"Kyrgyzstan\", rings: [34] },\n { id: \"KHM\", name: \"Cambodia\", rings: [16] },\n { id: \"KOR\", name: \"South Korea\", rings: [18] },\n { id: \"KOS\", name: \"Kosovo\", rings: [20] },\n { id: \"KWT\", name: \"Kuwait\", rings: [8] },\n { id: \"LAO\", name: \"Laos\", rings: [36] },\n { id: \"LBN\", name: \"Lebanon\", rings: [10] },\n { id: \"LBR\", name: \"Liberia\", rings: [26] },\n { id: \"LBY\", name: \"Libya\", rings: [55] },\n { id: \"LKA\", name: \"Sri Lanka\", rings: [9] },\n { id: \"LSO\", name: \"Lesotho\", rings: [11] },\n { id: \"LTU\", name: \"Lithuania\", rings: [18] },\n { id: \"LUX\", name: \"Luxembourg\", rings: [6] },\n { id: \"LVA\", name: \"Latvia\", rings: [21] },\n { id: \"MAR\", name: \"Morocco\", rings: [62] },\n { id: \"MDA\", name: \"Moldova\", rings: [26] },\n { id: \"MDG\", name: \"Madagascar\", rings: [48] },\n { id: \"MEX\", name: \"Mexico\", rings: [169] },\n { id: \"MKD\", name: \"North Macedonia\", rings: [17] },\n { id: \"MLI\", name: \"Mali\", rings: [75] },\n { id: \"MMR\", name: \"Myanmar\", rings: [69] },\n { id: \"MNE\", name: \"Montenegro\", rings: [17] },\n { id: \"MNG\", name: \"Mongolia\", rings: [74] },\n { id: \"MOZ\", name: \"Mozambique\", rings: [78] },\n { id: \"MRT\", name: \"Mauritania\", rings: [38] },\n { id: \"MWI\", name: \"Malawi\", rings: [27] },\n { id: \"MYS\", name: \"Malaysia\", rings: [24, 36] },\n { id: \"NAM\", name: \"Namibia\", rings: [43] },\n { id: \"NCL\", name: \"New Caledonia\", rings: [12] },\n { id: \"NER\", name: \"Niger\", rings: [57] },\n { id: \"NGA\", name: \"Nigeria\", rings: [57] },\n { id: \"NIC\", name: \"Nicaragua\", rings: [51] },\n { id: \"NLD\", name: \"Netherlands\", rings: [14] },\n { id: \"NOR\", name: \"Norway\", rings: [17, 49, 11, 7] },\n { id: \"NPL\", name: \"Nepal\", rings: [22] },\n { id: \"NZL\", name: \"New Zealand\", rings: [35, 29] },\n { id: \"OMN\", name: \"Oman\", rings: [40, 5] },\n { id: \"PAK\", name: \"Pakistan\", rings: [65] },\n { id: \"PAN\", name: \"Panama\", rings: [51] },\n { id: \"PER\", name: \"Peru\", rings: [75] },\n { id: \"PHL\", name: \"Philippines\", rings: [5, 11, 26, 8, 32, 8, 13] },\n { id: \"PNG\", name: \"Papua New Guinea\", rings: [33, 13, 21, 10] },\n { id: \"POL\", name: \"Poland\", rings: [44] },\n { id: \"PRI\", name: \"Puerto Rico\", rings: [8] },\n { id: \"PRK\", name: \"North Korea\", rings: [3, 43] },\n { id: \"PRT\", name: \"Portugal\", rings: [32] },\n { id: \"PRY\", name: \"Paraguay\", rings: [32] },\n { id: \"PSX\", name: \"Palestine\", rings: [8] },\n { id: \"QAT\", name: \"Qatar\", rings: [8] },\n { id: \"ROU\", name: \"Romania\", rings: [43] },\n { id: \"RUS\", name: \"Russia\", rings: [4, 455, 10, 6, 8, 6, 7, 14, 8, 25, 21, 23, 7, 17] },\n { id: \"RWA\", name: \"Rwanda\", rings: [13] },\n { id: \"SAH\", name: \"W. Sahara\", rings: [27] },\n { id: \"SAU\", name: \"Saudi Arabia\", rings: [75] },\n { id: \"SDN\", name: \"Sudan\", rings: [80] },\n { id: \"SDS\", name: \"S. Sudan\", rings: [62] },\n { id: \"SEN\", name: \"Senegal\", rings: [43] },\n { id: \"SLB\", name: \"Solomon Is.\", rings: [5, 6, 7, 8, 6] },\n { id: \"SLE\", name: \"Sierra Leone\", rings: [21] },\n { id: \"SLV\", name: \"El Salvador\", rings: [19] },\n { id: \"SOL\", name: \"Somaliland\", rings: [24] },\n { id: \"SOM\", name: \"Somalia\", rings: [35] },\n { id: \"SRB\", name: \"Serbia\", rings: [47] },\n { id: \"SUR\", name: \"Suriname\", rings: [25] },\n { id: \"SVK\", name: \"Slovakia\", rings: [32] },\n { id: \"SVN\", name: \"Slovenia\", rings: [17] },\n { id: \"SWE\", name: \"Sweden\", rings: [39] },\n { id: \"SWZ\", name: \"eSwatini\", rings: [10] },\n { id: \"SYR\", name: \"Syria\", rings: [26] },\n { id: \"TCD\", name: \"Chad\", rings: [57] },\n { id: \"TGO\", name: \"Togo\", rings: [18] },\n { id: \"THA\", name: \"Thailand\", rings: [63] },\n { id: \"TJK\", name: \"Tajikistan\", rings: [40] },\n { id: \"TKM\", name: \"Turkmenistan\", rings: [53] },\n { id: \"TLS\", name: \"Timor-Leste\", rings: [10] },\n { id: \"TTO\", name: \"Trinidad and Tobago\", rings: [7] },\n { id: \"TUN\", name: \"Tunisia\", rings: [30] },\n { id: \"TUR\", name: \"Turkey\", rings: [53, 13] },\n { id: \"TWN\", name: \"Taiwan\", rings: [8] },\n { id: \"TZA\", name: \"Tanzania\", rings: [51] },\n { id: \"UGA\", name: \"Uganda\", rings: [27] },\n { id: \"UKR\", name: \"Ukraine\", rings: [92] },\n { id: \"URY\", name: \"Uruguay\", rings: [20] },\n { id: \"USA\", name: \"United States of America\", rings: [232, 16, 8, 4, 8, 6, 6, 8, 137, 11] },\n { id: \"UZB\", name: \"Uzbekistan\", rings: [53] },\n { id: \"VEN\", name: \"Venezuela\", rings: [91] },\n { id: \"VNM\", name: \"Vietnam\", rings: [43] },\n { id: \"VUT\", name: \"Vanuatu\", rings: [4, 6] },\n { id: \"YEM\", name: \"Yemen\", rings: [43] },\n { id: \"ZAF\", name: \"South Africa\", rings: [81, -11] },\n { id: \"ZMB\", name: \"Zambia\", rings: [60] },\n { id: \"ZWE\", name: \"Zimbabwe\", rings: [36] },\n]\n\n/**\n * Every ring's points, zig-zagged varints in printable ASCII, longitude then\n * latitude, delta-encoded from each ring's own first point.\n *\n * Decoded by `decodeWorld()` in `../impl/world.ts`, which is the only thing\n * that should ever read it.\n */\nexport const POINTS =\n \"m|`Ce~gAya@Lcn@dLcRrFel@aSaT`KeSs[kd@h@sHeHqEeX}YwTy`@dMxEbR}Q|AxDns@wWnSwTcLwZgE}e@}Zaj@pCm_ABcJ|Pjc@~Ev^pJvfAfFbbAbLnc@fZyMlYcFb^b^fYsA~VdPnUlz@}@qWhh@xf@zNnYtd@mBpd@lWpPbVyDvn@bGzEnPnm@Cza@jb@dAdt@dpA~Xpj@oDrKtLjd@}Fn}@hHvgB{^uw@uw@bDgg@hn@oIzCuf@nS{p@wYga@fZeHePol@oX{lAw~@tVcn@iGaLi[ip@mHeb@_RoK_q@us@aKyHgUm\\\\tOgkXxiHvUbLfI`O|@fZ|NrEtO_n@gX_Z{QoIcaWf|JyXkGcQb@}ToFmwDXkNrm@}Pld@kMfS}Vt_@ih@aDsSyGqa@xGkHsNuNmc@we@mAkByI{^GlDpUyjAQc@hf@uKbWdHtd@qCle@{SdVjBjiAoNwDcZp@we@kHm[tBsEjRbFh]_Jh\\\\hHlViDpTbaCYzAzeEci@br@yg@`f@zqBnXhvC{Ghj@}\\\\h|FtAlHjChd@g[ng@{@ld@tI`]zJzDif@uG}u@qTgx@gByYgSiw@{MsX}b@{g@aSyZqEim@hBmb@tQiUrO}d@jNod@kB_LeRwW|Qk{@xK{h@h^qf@w`h@uwnAf@lOhS`HvBhS`\\\\h]rIkCf@wLra@_TlDw\\\\iDui@oGkRnI{H??fC{RcZw]_CvJyOqDiLxO}MjEeCtU??|FfT{GxYwvcBijn@aJaBiAbP}o@yHur@r@wd@x@yi@gi@sm@ag@of@oe@{JfToGjp@|^FbDtg@aJtGf[hKDpXfQzXr@dXpKdLzzDo^|Vi~@r`eCvxeB_W~[g^zm@gpAnd@ovArNb[f^jz@bBz^aUrd@u@|aAAppoBn_z@rN`q@tOf_AQf}@pLzLxCjg@fCr_@inApt@nG`j@af@fZdBp]`{@boAt{An`@h|B~KtcAgEcLfd@xKxm@qJn^nd@~T~~@rGb{@wUbWhOuGb}@gi@xQea@uRsQl_@px@lRdq@xe@dHz}@vMn`@`z@D~o@~^|Pzm@o|@vl@wz@rKnT`w@xhAfb@rg@hhA`x@rWrXh\\\\eSz_Ash@dc@jYeBzx@wH`vCkGzXmc@e@ym@rh@~B~TsUlDiaA}n@mZyRuf@fFq^c`@kt@yUwqAtEuc@gZ{JtEoV~[qKsSeYd[uVrMcgAcXwKpIekAuM__AuOwv@md@uU~Q_|@Dmx@in@yg@l@es@ub@_|@Cox@dOmJx[{jBoe@i_A|Do{@kUyw@}g@sy@ak@{e@tQoWaLcS~@cgBccA{]mT}_ArFsNcs@ow@wpAfNwc@bl@kWgq@ifApAaIjL{qB~dBcr@nHkkAbm@k_AlW}GrZn|@~}A_~@~OeeAnHmp@_Iuw@{n@gIev@}]}Jk^`c@h@zp@rs@na@|h@lXpeAt{@syyAevjArUz@pXec@IsHrZBnQwO~Kt@rWgQnm@qNaEk]rI_UyuAwH}KlOyVxIpKrNi`@nTrPzRqY~O_[fIh`~A|lwC{^?_|AoLg}AnLclA|Y}Y~d@kF|YmAx^v_BrRpdBzNntBtM~aCfKbsCsB~pAyS_JwXmdCcP{t@yScf@_Ze[gV}d@_Ukg@wXbn`C~v{CwkClAueCbEom@wXa`@_U{_AtXjQz^jQb[|aCqGpjCtBjmAyS?mAvjoChejC??{i@iFegAlAkQ{^uBgVf@eq@ob@m\\\\qx@wHa`@fVuMfV{Yd[yS|YePd[iFb[~InWbPhVlhApGxdAfK~pAg@s]oWnhApGvdArGvn@kQtBwXtzfEjlkCef@_JqnApGqyAzCqcArGqcAkFwc@nb@~o@{CzjAlAblAmAlsAtBt~@gKznnFrznC??oLySsiA~IyoAxHuiAaJnb@`Uvy@|N|uA}CdrwFjnnC??il@oLk}@tMo~AnWtc@mAxoAcE`w~HfoxC}d@iVisBxHm}@rRwn@~TcPd[~vBpG~pAaUtc@_UnAuB_q~IpmdD?liI~b~T??miIsBNev@kc@soBrRgFeA_aA}RsGTiFNmyA~XcnA_YgMqBsvD_Jmz@pMk\\\\lFg}AxSopD|NwkCrRepFtM}rDcPshGfKquCpRgdDkQylDcPoLm\\\\`uFmA~hEuMrs@oWtfDmL_Je[gVuXgViVfKuX~fBePvn@_Ut_BsRwvCtBmoCyHsyAxSknBkQyeBgVeq@yS~TwXxoAcPxzAkQn_CuBroBqGdxBcElg@gVvoAsR~o@_UpRafAs]bEgw@rR{eBcEcbBqGmr@|YcbBcEgrAoLkmAcP_fAySg}AcEnAiV~TgVkQaUwoA_Jwc@xSo~AgKegA}NkxAe@msAcEosAuMibAoL{jAmL_p@rByi@|Ca|AqGgrA~IutAg@_qAqGmsAbEa|AbE}uAmAqyAf@_|Ad@utAmAu~@kQ{jAyHkmAnLsiA_JkbAaUkg@pRaU`Ukg@xS{_AkQuiAhVmsAhFggAbPcwAsBqnAaJg}AlAmsArGutA~Ia`@}Yjg@ySr]aUvoA{Cnb@iVnLgV~Tom@wn@pG_qArBwoAsBohAvHs~@jQ}Y`UmsAtByoAqGutAgKclAkFs~@tMgrA{C{t@wn@eq@b[ggA`JimAcEmr@nW_qAlA{jAhFuiAnL_p@gVmWaUm}@nWutAcEu~@lLyi@zSgrAcE{_AoLs~@}N}jAqGcwAiFqnAsGe|@mLwc@sRuM}YjFuXpRoW~ToWrRoWzNaUtBoWcEmWk\\\\iVoWuXwHoWfK}YhFoWq]e[ia@kQkg@gV{i@sReq@iQmW_Zia@cPef@}N}z@sBef@sRak@gKmr@iFgl@}Nob@sR_p@iFuc@zNfVzSr~@hQ|YnLnm@yHlr@bExi@tMhl@|Nr]jQpGnWuBfVk\\\\xSzi@vMvy@zCfa@xSvc@pRbf@~YxHfV_UtXa`@rRmr@tMwn@rRuXlWmLhVkQnWk\\\\xSkQfVqGpx@kQfV{CnWsRnWpG``@ha@vXtc@xSfrApGd[`U|d@xSf}AfVfrAxHhmAlLnsAnLdq@tXjcBnAdmBoAbbB|CfhB?qRnWo~A~IwdAbPef@`UxdArRtjBcEjxAzNtBvXlAnWmhAxSoLfVqnAhVecCvHsoBdPkxApRypBrRozCvH_xCdPoiBjQisBxSe|@j\\\\s]fV{jA_UyeBkQ}kBsRw`C{NmnBePmzCe@_xCpGc}BtMkg@}Y}uAkQ{|Cg@szBmLqtBoLw`CqGiiC_Ju_B}N`k@aU|Y_U?iVdxBlAn_CxHlyB?bPgVqGqm@c[mLkxAuMihBwM{jAiQ{jAkQiw@oWutAaJosAqGyi@{Cu_BmAyzAsGclAgK}jAuMocAuM}uAqRav@ySyy@kQiQoW`aAuM_UwXsh@qR{_AgKqcAwMs~@qR_p@oWs]k\\\\gl@ePuiAtBs]xSsiAnAoAiVy^oWibAbE}NhVsiArByoA_JkmAkF_fAtB{YvXqcAySu~@aJ_fAqGwdAqGu~@uMwdAyH{t@mL}d@aUom@|N{_AsGil@l\\\\ob@~T_fAgKc[mWu~@eP_qAtBoWfVkr@gVkbAkFmhAmAaaAf@ydAhFibAtBk\\\\xSkg@jQqcA_JmhAmA_fA?ydAg@m}@qGaaAkFcv@cPwy@_Js~@cEwn@ePga@ga@ob@yS{_AvHoW`U{t@tM{_A{Cak@~Tom@|Nu~@uM_U}Yiw@_J{_AySg|@sGmhAgK}o@mLmr@uM}o@oLwy@jFiw@aUmg@cPwy@d@kr@uMgKaUus@cPkr@gKm}@yHqx@{Cav@tBwy@bEeq@bPcE|Yav@xS_e@dPsiAhFsh@dPmr@bP}z@tBeq@gK{t@wXwy@nLg|@hFwy@jFe|@zCm}@?mr@|_AnA|NhFb[~z@|N|o@fVqGnWwdAe@pGlWx^hVj\\\\tXwn@rRegAbEggAaJga@mWySiVia@qRcf@kQ}NaUa`@s]ef@cE_fAmAk}@kFu~@wHs]oWiQiV{i@gVe|@{Nss@gKia@{Sob@_Jgl@yHm}@bEiw@cEg|@iFocArBil@cPy^sh@gVbPk\\\\l\\\\us@dK}z@|C_{@kFu~@|Cwy@d@cf@cEus@tBun@nLiw@qGkbA?ox@sG{_ArGsh@{Sy^yS{i@cPimAqm@mg@pGwn@dPqh@`UsnA|d@e|@f@ox@?kbAkFibAqGkr@cP{i@kQwdAoAqm@mL}o@fKy^pRak@rRqcAmA{i@zNsiA|NkmAbE{_A{C}o@sRsh@qRiw@}Ciw@pG{_AbEwy@wHiw@?cv@bEox@bEiw@aJibAwHu~@oA_fA?ox@cEiw@{CePs]mAuXcf@bPaJd[yStXuXxSss@`J_fAuB_qAg@iw@uBaqA?wy@e@_qAlAwdAzCck@rRfKfVkg@jQibAtMydA|NwoA~IosAxHs~@xH_fAf@mg@{Sav@dPwn@pRav@tM}jAbEegAjFs]nW_fAtMun@`UydAvHegAe@kbAtBsiAg@uiAzCydApG{_AvM{_AfKak@jQjFlW``@`Ub[d[`U`Uj\\\\tX~pAxHvc@~TvoAnLd[nWxi@fVhl@rRtXtX|NhVbEb[g@hVob@lWmLhVk\\\\`UisBpGoW|YroBvHn~AnLvuBlArs@nb@~Il\\\\|YfV``@fVgrAzSy^tX{t@fV{jAxS}uArRg}ApRgnCrRy^r]}rDlLaKxCum@nQskD}NenCrRmseC`~}Aig@tRaz@xFeAzJnPl[|~A`Cp@i`@gHwXqm_HnunAod@dCmCdiAlTpTlEhq@xTcPlj@pj@|KkBle@}@ne@ot@pGgh@`c@mu@s@u[{g@pDk{@pTaa@qGikuFn|}@faA`_@du@jM`Kx_@`VjX`t@n@ff@pDfv@kJ|k@xEzi@zAdd@h`@fQyAh^tP`]zRpl@oA|h@?haA}f@p`@yJk@{b@_^oGsIeMfAoUuFmj@~Ead@``@c~@fIub@uAsb@zWug@r@kQrZ{WxF}o@vb@op@rGsYmZ~Y`T_y@_^bQoQdW`@__@|]ep@~DuRlMuQwEec@yKkNoGg^rEqc@yX}k@uCpn@mY}i@wq@}Sm]sYyn@}Uk[{CgPtFgp@iV{d@}EoHuLoOuDqa@n@u`AiQ_a@wZ}Nm`@uc@u^yA}Ws@_a@wj@ct@iY~t@qYoKfUo\\\\sRk]qZpLsFqn@ca@w]aNuWm^sI_@mPmZfFc@uNoZ}Ge]mGem@t[ua@~c@cf@Luf@zDdLia@}\\\\cq@c[kOtHqNcZwb@yd@_U__@jFos@wJb@}^vl@qSg`@aHmh@lNe`@tXss@|N{PiEue@fRqc@}PmVlDsM_Kw[|]tOl`@vVfXlTbAgF|WjQf^dUt]mCtPup@na@co@`Se_@nTel@`d@sPAw_@~NoHhRsz@dTgh@kTgKq`@uKuZwFga@_Rwp@tGg]qCeQfFwb@eGan@_KuKvH{ScNe`@yJia@s@yPeVmVsPp]kCff@qNpFuAfYuUv^uCjb@dAvUoU~o@cg@qVuSlY_]lWlEtZiLrt@oHd^wNrF}Olt@~Dj_@eSji@wbAt_@ek@t\\\\{h@dZdGbNwb@ff@iWrbA}WwLkX`ZgNsHyIfaAik@je@a\\\\zVyo@rq@qPdq@s@rb@hCte@w\\\\bt@pBhv@xI|[zOvv@i@zb@jKvk@rZzw@hm@t]xUlo@xSz]pQ|t@bWd^xNvm@`G`j@eBvRxb@vT|dAfAtx@rXv[fWvd@xYvr@sZhe@aJuHq_@ba@xJvu@fl@`u@}Olb@{Htb@mCn{@cQlg@oe@pJmn@pMs^t]iXb{@qFoSi]`Nkm@p]fj@rv@nJu_@sa@oHac@cWs]~Cgm@xq@ht@`f@jT|Vtp@xo@uX}@e`@bf@il@|_@mVwJmMdoA{d@|j@w@b{@m]znBzD|oAjUbfAzSgd`@u~|AvCnXdb@BaKpLvSfg@zJnItu@p@p^dMrr@yCjxAeO|LuTv|@xIfF|Jzd@}G|^u@f[kJqHiNlAaJ{QmBs^jP}GoOav@rAuk@eJ_]|@oRvKyDsIzGug@mU}FaUy[mm@bScb@qX_UuCqo@`Ri\\\\gBy[xJ~C|FisyAiwpAqPbA}i@|d@uZhCuI}Nid@eX{_@|_@y^hk@c\\\\|AgRxOnr@`DzIpo@vIzTzUrMs@|]pNbB|e@w_@qT}]nQiQlVrCthA`m@l@ij@~ZgIpY_PsP{Rh`@oTqKsNxVyI|KmOiNeIsm@|Pu`@vBoGkFx]y`@_cyAitjAzi@iGp^{[|HqV_Lu@oQvOsZCHrHkoz@zuCsBrWmLbMQhSjNbLjWp_@rUrUzX~A~BkjAtNm[}d@|CcRsb@y_KgfbBbFfi@hOjAvE`b@tu@o[`_@zCrj@o\\\\`\\\\aX`\\\\a@~G_Uaq@iK????wl@|C}x@_Lqf@jZggDefKtr@hFjNcj@yAqnCpK{KjAs]tT}TbRmQ_G{_@mTcFwKiZq]yDsLuQ_TiQmUEsn@~b@lAvSaM`d@hKdXqExOh]te@fRbRvJlf@q@vf@vpIegSdCgc@aPoYl@eTsp@yr@eHyi@cPgNe]jGeYuKoGaOoo@_[}JqRmy@}Xka@{GsN~Jag@I|Ch]kGl[eb@xg@}@f]agAdMl@xi@rLtQp]xDvKhZlTbFvu@k@|[}CdS`IpZqCpkB|An@nb@qG`n@xi@cOf\\\\jAzTtNb[eL|IuSa_tDq`j@h@xk@xTmHcCfq@zPq_@rB{^zJa]bYkc@px@oAuDvXrRxa@rYuK`HjJtPyEdWsDvHmr@rT_n@sIud@ne@wO{LwUcf@iVbl@a`@aUmi@op@`Zy\\\\`BqDlj@mz@pG_y@[_c@rIx[|s@|ZpBhRpb@ea@l_@gI}f@gPEagk@ukuA_QtXeWqCao@vHwzAhB_^}NqhAqMol@vUwc@pEl_@zXxUtk@eStb@xt@kGt~@rRTb^xw@|D~j@{T`q@dPfm@y@lCih@f^aSgIyGvEmFoI}RyVoRj]_ZrDyUfgyCkis@k\\\\_Dgh@z@{@fObcA~Hz|vC_ys@kp@b[xIlk@lJ_G_@u_@~ZuW|uwCsfp@yQnA{Tzr@Ifc@hNbBzN_c@jVcQ_gc@shrAhv@uVrVaYxV{Lv[iVnLkRr]g\\\\aL}XmUjMqL_Le\\\\k@wt@jIej@[g[zL??uUErNnZc]`WbHj\\\\tMvAtJtDjSpMa`v@qulBy`AtN{GnNw_@mFc|@zMcEh\\\\jLzOcf@|g@mXjJvBhJei@~I_QtOhWrLlq@cA`KxDuMvSkN~f@??rt@vBhRtL~Bl^zW_Ejw@~AjOsMlVzInV_Hfp@g@vdA_Nb~@}Clo@l@fa@|Oz\\\\lAd@{ZhR}[od@wKK}WhPwVvAsZm{@JybAoVoMib@gr@_SzD_[_e@oIlbmD_xa@NeHqF}AkJlFkUwd@{JYGdHyJF^~ObI`ZmDtHpEhU}B~DdFp^hKrOfJ|@lKtTrQ?{CqeArxfCnkTom@fDe_@i@}L}Qsu@iX}_@oVypAqItExm@uF`W~Czh@{bA~v@_eAhIqWjVgi@jK{XbQif@Sic@pQwAbc@eKfQY|YfQ`@aWvgAyvBrAdH`c@uEtWca@nPyMze@bJfp@bPjZ_Erb@nR|K`@iRfy@}^`y@[zkBdQ~\\\\~u@p@r`@rWxiA`IkLhfAqAjWfq@vc@cl@vpAgNbs@nw@`l@pGnWeuAp`@aeAuRo{@x_@mYhGcl@r]oi@kf@mbAzYqs@kM_TfJeVmWe^g@et@aB}j@mLeTzfgBn}`AhPkb@qZs\\\\bc@qi@~o@oa@j_Aag@dVx@t}@io@pg@rEkrAetAqeAu{@}h@mXss@oa@i@{p@j^ac@|]|JgKac@oG}c@?ka@nUiJlV`IhVwAhFaWxDgx@tJuQdi@}OpXfK|`A_KcCysAlQwa@oR}K~Dsb@cPkZcJgp@xM{e@ba@oPtEuWeHac@xvBsA`WwgAgQa@X}YdKgQvAcc@hc@qQhf@RzXcQfi@kKpWkV~dAiIzbA_w@_D{h@tFaWuEym@xpApI|_@nVru@hX|L|Qd_@h@nm@gDfb@vIl[eFeC}}Afr@xc@dv@q@rVk`@nh@sBgLyYva@ae@~Xgw@oOmJ@kYwd@aQfEy`@}NwTqCc\\\\ofAqi@er@_KkGmHiw@|Ac[kjDo@aZxHyb@vZyUIkl@gb@iIoKlEaA}Vrc@mEVcf@wxBl@uSqTkPxReKzc@yJuFka@``@so@aCaKcRom@sMwXgIgFmYsk@yPjBcL|s@kDtGkf@qA{h@~ZeOuJwDim@|Fup@rN_QwM_l@uH{dAkV{U{VhGsPo_@wAqMjMbGlZoTlHiM`\\\\hP`U~Hdt@_Op^qC|[me@h\\\\u]bB}EgKwRuAg[_JiSsOqa@hDgNgA}`@bDsDwKlImKgEaQeXnDo\\\\kEyb@fLiZzKiR}O_MrAqGrP{\\\\oC_WwVeR_m@}c@ex@iT}AmNpa@ab@flBm`@jIu@bj@~m@lr@mRxQmmBxHiAt}@mn@_h@smAlUyfBde@o]rc@fIpa@ugAgRsxB``@k|AmAm{Avr@ynA~dAco@~Pmt@pAuUtReTpnAkIxd@zWhfBx^xg@bwA~uAxf@reAfm@du@rNf@lP|l@mCbtBlPh_BrEfh@xRrW`JprAj~@rpArIn_Apq@bZrMld@|bAChaB~V~j@xZ~dAfQphAvp@zs@~|@bHtm@kIna@tJb~@bMn]tj@ja@jdA~lB|u@rp@ni@d\\\\n[nz@un`FosIxAx]tBzf@x\\\\}@bLfTn[k_@wWkVabrDwfu@mX|RlCle@|q@x@xs@eCff@xHxw@wVj@oKkh@om@w`@yNuk@lM_`@n@onx@tcj@lwA`m@bw@rm@xSth@vQlV~`@~C~I|\\\\hEnR~f@pMzq@cBx\\\\oPjYqFn]lMfN|\\\\r\\\\xQf^|Zvk@jE~L_UyDae@`d@kz@zOkH@muDs|@eA{@s}Eom@aAk_B{T{VvX{f@oW_RCeb@aMgJtCaW|p@qKbJuRdc@weAtcAwYtEC`UkQrf@ko@pH{mt@cfIrSrE`g@m@`n@qEdVjDjHdNfSz@rWgLrdAd^n[gEpGxCtQvd@rm@eKtl@eExf@aVlr@gTn`@bShWv^rDrj@dg@oBhi@oIfd@b`@v_@by@rEaQvAq[r[aS`Vg_@hDmUp\\\\u_@aDsQfEiY{Cmo@_NiJk^k~@ur@uCqJaOiId@sNdMumA}VqYkWq_@{TdE_UsPwDk{@zByy@}[el@ecAu^iXqf@sIcFvY_c@`f@EnXbI~X_ClRuT~Pqn@hZga@fXQhSai@p_@_Y~YyNnd@um@vWn|nFou~AjGE~wBk|@tk@_ZdpB{Xxa@iv@}Gke@~nAqY|Imq@rjAkl@h@e_@??wa@c]v@mf@fiBwf@z~@ifAbf@yk@dx@e[bi@sXd`@i_@v}@fSv{@|a@pv@ah@rj@kZz{@iPp|@y@K{bJK_gF??qsB`NmaB`]c`AvD{u@aYujAoR{{ArFs|AoZgeBqN}i@|Xsm@sM_Mm\\\\ej@tEuhB~v@erAii@mGjn@ykAgIsVgQujArBq~AfYgqC|UauApIe|@_CisAt^|vA~]_pBlLugDkFgt@}IsaAnd@_cAs^x~@qYkg@kTakA{A_q@gEmq@|My}@|`@ydA_DmmBd[_`B}HezAn@fF{e@sv@}Iy_BfTJbz@yf@{p@gq@t@g[y}@|aAqe@|gAgX_DadA{hAkl@mqA`Ig~@pZ{sAneAlv@t]gsBrKH|~@qrA_p@uiAfg@pQjm@m{@bi@g`Acl@ql@_u@mBqcAywAxCk{AdH}rA~]wB~]nm@h`@ak@n`@~Fj]jyBtj@zuAtHr_AyQtQj^d{@ts@fQhZngAhi@lxAbCjp@lYbCrg@tgAxFnkArq@xbAjeAdWhp@nBpgA{zAlIc[ny@g\\\\ln@mvAkKcsB`Zo}@vVwk@p\\\\imAdPeaAhYefBrB_cA`EdIbu@mRx}@gl@|dA_|Ajz@co@kSy`@g_Ar_@uaBbk@}_@acBg\\\\yeAyj@ua@qj@bDyh@li@at@|jAan@whAo`AfZqw@zSs`Boj@mMejB`Pg_A`Ewr@mOey@dT_lAfc@}QfWonBvCz@ns@wS~mAax@vHil@xc@oyAua@yz@_dAih@a\\\\uo@xv@mpAvnAadA~iAbXff@crAfb@ew@tb@ubBdOcg@zRwW|s@uo@hGcXpVqCdeAjl@nVzk@|T~eBfUrmAhr@thBdItdCeLv|AMv_AhChs@xk@tnAvZdyAtqA|fAtx@ct@gIicBcqAcbCas@o|AgEiv@t]~y@|h@wRjbAmSdn@epAd^gfBaHu}@geAiChl@kg@tUhlA|g@liCdd@~|@fXxdA`l@ln@sClA{s@qkBur@`cB`AldApFzg@ib@AetAvZaQ|h@rIvSmOtn@dn@`Rro@dUl[pYtH~RbBfElNdrB@|}ALd[nJ`aA~k@xFzC~RhWjx@?j|@Ff[|HcIfKsD`Rd@hEvpAb^l_AxHpgAj`@tN?fT{H~E}Gk@oEwL{Tk\\\\ka@gQ}c@nKiu@hLww@b`Ai\\\\uFcJbHsFdP?pK{HbByMdKlEvO}@yBeEtMcE`EmOno@_Srq@ySb|@eWry@uU|v@tPlSRzkAgOrq@bGr{@kRx~@}Hrj@{BlRqIbJia@bTHD~Vj`CAxtE@jsE?rzD?nzD?jwD?n}D?l|@?pxD?r`cDi~xBom@y[ytAPh@bKdhAna@bk@m@~xzCeemCvcAc`@sAoUa]eCanCvEwjBha@qDhPlaA{@jbAi@jcAlGtz{CkgxBcWwQqXj@{NxKnWz_@rZiDjOsQxyuDgmqC~`@fWvyAuCvjAiOg`@c[{xAyOqu@|T~gvD_lvCn[x@btB_CrOoPy|B\\\\{j@rJb~{D{yxCuiAvT|OpUn{AzKzq@oMxYmV|C{X}oAnAjdkDohpC|cBwF`eDcSrTia@rF_^v}@gZf`CsFlgAkRoVsXy_C|BkdAbSazBE}t@pSfMnVwfAbMuf@zMisAvAezAfDibBqLi~BiDodBjC}aApV_MzX~e@rOd|AlL~nAsFfrDrH~hxEqswCcwAxHxStQnsB~Pt{AeSqq@}RfvwEg|xCipArKbkAdKxfBA_@}Gc_AuQ~qkBifcBj`@jf@jh@tu@yg@cT_i@jL|TxTmv@bPy[gNi}@fRhRvl@wj@uI}Fd`@mRxe@hY`v@f[hAbh@yJqLcr@jP}FpgAdu@fd@eAck@k\\\\~z@eNbbAvBhxB{@pHoQ{e@aUdZ}Oos@ud@q_AobBwe@qb@gu@qT_\\\\vAtybDkd~BmcAlTsfAnRqDt\\\\_m@yCsk@tSnv@tRf`BaNbb@c[||@f`@|wAj_@nTqc@tsA~Diu@}]_Gep@iTgx@el@bDqJlZ__@sHdzxC_ilCcz@{WuiCr^auAx\\\\cGfZasBcMc`Axf@{uCtWmu@dXcz@ny@vqBb\\\\erCxg@gbBtLyxAnx@iaBbClRzj@tlBpgA|kAuYfaBc{@zoAxFzFxb@u`Ajc@{sAv[wXpOug@z|@pT|k@xmA}Ov{Caq@iwAzt@c`Avd@cIxTlhD}WbeCic@vjAm]yTsPf|Ac_@~yAi]]bQtsD|Hzs@mTeh@_m@mtBc@s_C_GzSiUyTe^{oA{{@dPsZbWkTt~Ak]r}BgT_g@yNbaA{e@bv@oBfp@iTl`@lQhpB`GnbF_MdcCiQjdBmH|r@}Ti`Ao[vwAIxRg~@_o@{v@i_AqXk`DsO~l@lg@gp@|e@wx@kq@k}CuXgjBr_AhH|g@nqwDmxoCgaCdAkvBdNj|Atv@niAbK`bAtm@hfAiA~e@{u@_@a^s_@qYl}nFitsC??aiBwm@k_Cmg@{~AZutAeHpG~n@bo@tTjy@`BdsBvY`cBpHjebGophB_{@_DtQ|eAku@hq@|WCrd@s[bVw[p^mRpJoZwB}Rf`mEk{yCuyBpG_hDxUyn@t\\\\iW`Y`eB}EzeBgSbjCiAk{@qQrjAaNjfpF{v}Al^tGreBk[vQeU|v@{TfJyPh_AgJbW_a@mDoMq`ArLke@nHwy@rEgTpT{]t\\\\k}@xXbklFalpCgxA~Ks~ClBw{@bQabAhYpmAvNfxC|j@nlAvj@?fZncDb]~_@kZhoCa`@yYmYij@ul@eu@ah@b|@ie@tqqEkcsCsv@mIo`AvA_Jp]~d@t\\\\trEtHt|C`Z`~Al@|FkSy`CuZjyGnFjvAeJgtAa|@yy@oP{nDbTanB~c@elBvCjxAyz@gx@wUo_AfFcTv\\\\t`oEgvmCaeAdXef@|{@kR`k@_hB|]woBr\\\\vEnZreB~C{f@~V`T|UbpByHnjB{OtgAxBhtBdTj}CjHdnBzDz`@m\\\\htAaPnv@~E~kAop@qh@uEo_BsIcwAxAqpA{IzwBsMpdC~CrwAi@|_@_V}oC_Xl_BZblBoOms@ym@qj@{WifDae@{~@bKd^f\\\\ajC{Q}uAp^seA}^ax@nSer@j|@k^{Xjk@a_A_v@cHjdcEc_mCzcA{g@_iAg]oiAdLonB}FgObQjy@|\\\\s}A|YfJfw@neBdWd{@eDfj@{VhzCgo@g@_SneoE_wnCwrAoAon@vL~u@fh@n`Bwj@fk_E_ztCwn@|[_Ab_@n[lm@`fBlEdbA_Ii@oc@leBxC~Bio@gbA~@e}AiT{vApB~ozDsl|Cij@aRa_AkChZiMipCeBynAj`@ehBjLoeBxJkp@fh@kjAdSztArQlrB~m@pmBnCp`C_GbbAoX]uUmp@sOhqBNzcAySrf@i[d{qDk}~C}{A}J_hAaAsyBcI{zAgVolAfBobAnPon@w`@oqA_IaoB}Ea~DqAe`@vEmsDqIkfC|BkfC~BafDzCeeC~FkqB|OvAtOnwCbZdvCtKpw@~LcgCKnrC|d@zdBtPziB`r@|_CjIxf@vKf|DtEeuAxFdj@dJur@x]lz@lTp_BtPr\\\\lWhvAtQwGdMyiBmAk@fN~eDnd@hbDgPrvDtH~{AqFduBgBxF_]qrBcMx]cl@ce@kCcfD|YftAag@jdB_Ksq@eWymB{MwPwTfwAmWpYe_@{iDtAip@vEq`BwUvkCgFtyE~BnmBgT`s@gX~gAiQ~{qCgvbCrg@lQ`eAbBpNq]oYab@ix@sGyo@hPUvY`_{DcvfCae@zVze@|TdsA}Q|q@xEhtAa[_v@kRuj@cZiaAvPod@fJl_}Bal`BsTgDeqAtN{~@`Y{@nJl]b@~oAsR|_|BwzzA}Tj]il@jG}x@u@v]rXbV`ChnAqYrN{SsvQiy{AmA`JpHhNg[jJ}^t@~CrXnZpIfm@yFpLdXv\\\\~@xI}H`b@fTb]|AzYkLnTmZx\\\\xH[i[wl@cb@~@{Nm[vDePuIct@L{KqLr`eCvxeBApjC}aA@sd@t@tSfXrt@lRt]_A~c@aDjl@yQn`A_HrmA}a@x~@q`@buAaeAqr@bLwvAvh@{qAlUg_@s[iSyi@qx@yXj|fCvia@s]ni@iGbl@y_@lYtRn{@q`@`eAoWduAal@qGsFrNlT|_AbcAz]_AbgB`LbSuQnW`k@ze@|g@ry@jUxw@}Dn{@ne@h_Ay[zjBeOlJBnx@tb@~{@m@ds@hn@xg@Elx@_R~{@ld@tUtOvv@tM~~@qIdkAbXvKsMbgAe[tVrSdY_\\\\pKuEnVfZzJuEtc@xUvqAb`@jt@gFp^xRtf@|n@lZmDhaA_UrUsh@_Cd@xm@{Xlc@avCjG{x@vHpv@Mb]jNjw@pU`Ijy@nYl@neAiSpfAoj@??vlAwb@pRsf@uPsc@l^qh@~FoiBqYc{@_aAio@x}AeQoz@gv@gTyfBodA~Ts_@o`C|h@qOnR~lAlf@yGsRkxAiTyrBu[ui@~P_|@bDmeAiY_Ake@}cBej@_cBoYc|AlMs|AuQqr@nFelAqc@ikAgJ{wBaSy`CqRwjCpCieB`L_wAe_@}NeytEkpb@fr@kRx@wt@y]i[icAoP}b@l@}LzVlZnZnMbc@gw{C{uqA~Csb@{i@gOfw@skByzB}W__@}Lal@{nB_{BpSwa@g[_Bu}@}r@yDqn@sh@mWcDmOrj@os@b`@exAlVcj@jq@`W~gAoUbZgiAtIesAvGojA|e@se@|Em[rx@uc@`d@}cAm@_`C~LcrAuGu|@hHm{A~d@sjAAuZlRwgAq`@_dBwTu|AiA_hA_U{k@o`@wj@_TbIsS~R_Wy_@ig@eb@rDg_AtKg}@e`@i~AeWyl@ih@_k@yPwyAgGip@~E{EeUrw@uj@dq@_S~n@`Vt|@uHjb@zFbOoXek@o}@m]cn@_jArVawAof@PoZmw@iaAwa@_SVoa@ha@{Msr@a^ulAiJyqAu@q|ArQ{u@~Use@`~@mVzYwTje@cVf|@ykB|R_iAlk@iXvy@_~A@eu@sWgfBmQx_@fw@hWzUjTlcA`i@x{@zjAaJrt@`UoOnt@~GzhA|^t@Kv^jg@{c@xW~a@p_B|YwH|_@~t@gAt\\\\sR|i@jk@zcAp`@zq@bg@jvAbQ`m@f\\\\fbA`Pe`@_\\\\`LiWop@_i@``@w_@lu@`UpeAlj@pe@jg@f|@~Az^b\\\\}_@hi@cr@fIcA`[mp@fQ_eAsk@ov@hWmg@t@cIt_@nwAnPd\\\\v`@v{@h^b_@vj@ibAja@oWl|@ae@hx@mi@~n@^lm@ff@`P_Nh`@wc@jRrH|q@zNnp@za@rDtl@tbArq@~pA~x@riA|tArx@|uArs@leAdFde@vZrTgSjb@`^hvAh^daApHhT~`Ara@tBjOkl@wMeWxrA_Sp\\\\dI|}@gOv\\\\kX{H_c@bx@mJb]mVft@h`@v{@dFzp@Ip`@fNj_@dHmHnfAh`@w@rDuMz@yXxl@dQbZoJjm@mVeQ}r@pf@cK|Mox@|`AjIoFeiAez@es@oAqr@x@yn@hZ{MzSyc@pc@rCjbAiHcTgYh\\\\{e@pk@hYls@iN`gAvf@zw@nm@jq@xFjZyO~_@o@tk@mMv`@xNjh@nm@fDgp@be@bLxgAaEveAkMtq@mZpo@iK~S_]bb@_H`~@ug@bq@gR|X~MzuAwj@j|@qf@pP{cA{k@jGaA{^zW__@iE_r@dbAghAveBgXnQao@dm@c\\\\bJ}PjHsb@eAiW|d@gMpShEzNyx@yPiMrGsMuz@o\\\\ej@gKcaAjGsV{f@eoAmFiUyWmaB{`@ztN}|RcGsDiPjHgo@NqJgQwIf@aQaFuHvYqM}FyXgHa[rL}ItSc[dL{TuNg\\\\kAyi@bOqOzwAjYns@fOreAaZxt@xAtWl[Rrj@gK`g@V~hAzIlj@`Qz|@|U`Ku@yCmr@}DyFz@sWnYeYxReCfQePsLwZfEe]{AeQ{HAuBgZxCaK_EuGeVqFlN_q@lM{XaDeT_i[ubXyW~f@eClh@fAph@_a@xw@|a@SrPlCn[gEpLn\\\\{c@lc@gZrIyGzXuR`j@xH|Oj^j~@~MhJzClo@gEhY`DrQq\\\\t_@iDlUaVf_@s[`SwAp[sE`QnCv`@tp@wMnq@oOzmAmAxFmB~c@`G|d@kGv\\\\bCtdBm@cHip@lWkh@n[qItK_[~N_HUgPcOgk@u\\\\g{@cQQed@sc@uV_@cb@tX}i@aTyD_YaMeXuHs^m`@wXqKwj@iL}LyGm_@oO}f@ss@io@iBySyEgJvW}WaA{Rwhx@fxGgJnx@fEn_@oKfc@gc@~a@w`@vmA??rWkE|rApIvOnFxPzf@_MpZbJ~hAvFv}@{ObJwj@hWcPkJgDjbAzn@OrXka@`VuYzn@uG`Mw_@de@tR`q@uGzSk[tf@wDf\\\\n@rBmRpTq@l[uBve@jHbZq@nNvDkBkiAzSeVpCme@eHud@tKcWb@if@xjAPmDqUz^FjBxIve@lAtNlc@jHrNpa@yGrSxGhh@`D|Vu_@jMgS|Pmd@jNsm@lwDY|TnFbQc@xXjGvGkR}NsE}@gZgIaOwUcLkOjEkT}Vaa@R_CtPkV`Jwc@cf@mc@q]wN_S`Amr@cZu{@s[e_@eh@c]eF}Rq@}UeIuThBmb@yFkv@eK_f@wQk`@uBwd@sDsj@iWw^o`@cSmr@fTyf@`Vul@dEsm@dKuQwd@qGyCo[fEsdAe^sWfLgS{@kHeNeVkDan@pEag@l@sSsE{d@rr@a[pFwOoI{[bCya@gL{MtY_v@ph@??xB`hAaXnG`SdU~VpO|Vr_@bL`\\\\nBbq@nMzVPbn@|PlPhAdd@rGxCvDda@uNl[i`c@_zEtBvd@vQj`@dK~e@xFjv@iBlb@dItTp@|UdF|Rdh@b]r[d_@bZt{@aAlr@vN~Rlc@p]vc@bf@jVaJ~BuP`a@SjT|VjOkElVmTzQnIfX~Yhr@eaAqn@oa@pVih@mTwNei@sF}CuZm`@~\\\\cv@rAeRq\\\\{Fqh@xEwo@p\\\\_d@aZkgApNmKnm@bDnPi_@qCgZ{mAlAoq@nOup@vMoCw`@w_@cy@gd@c`@ii@nIvraCimAxJtFdK{c@jPyRtSpTvxBm@Wbf@sc@lE`A|VnKmEfb@hIHjl@wZxUyHxb@n@`Zb[jjDf^e`@tQo@ig@s~@xn@g\\\\pd@jDpUyIla@nOnm@yFzc@q`Az[aO~Ro\\\\ph@s\\\\rO|DvYyMt]uSvP|H`t@uGfN{YrJ^n}@ub@nGkRiVuCvAi^sMuU_^eCkYgf@{Vy_@~U{MwJgc@`Mex@kLkOzH{s@hXi`@aGk]cSnCwJqQnMyc@sFeHg_@~@}m@sj@uXsESuSqJys@yb@_\\\\kf@e@_D_L{o@dDep@q^kW_Mg]a]cUxBmOlOdK`Tbg@lIzNf^dW|PbQfVtFpk@hPpc@g_@dCaGv[wLvL}CbXlFbVgA`LkNfD{MvTkoA_Eic@~F_k@vt@gXuE_l@jBsb@cFcUvIhJr`@|L~SzCxk@qKph@wPpQeA~Lt^`^uUxLsOxTbf`D{tQdWpDKdX_LfHjHlFmAhJdDrKhBlKz`@{LtKcLeFyIhAyLhP_NpWgKpTaG`CgQlOeJaCdQnK|MfMkPbScEnGsKI_RiGuRtPyGiMaKmHaGeh@pOkMeGyRfDkIzKmQbC}MgL{N~`@cWbXvt_Dihl@_u@nCap@Tuy@hT}WzUky@aFcUtM}s@te@{e@d[qS[id@vKpCrPam@pAgn@pXlFtMph@|F`i@`B`j@}ClxAbE{h@{a@nXgOfg@eCrTaQxMqb@hb@lAfy@wOxQcLlpAuHxTeKmVsNh|@eBzk@l_@|XZ|GfN|]zEvY}D_`@iRqLqUg[{L{^eKkn@_Ew|~@gscAkCKaHaN_l@Zyw@uQdi@rYqCtJvEeA|JvChHi@bBlAf@iEnC{B`KS|OhDw|~@gscAwJfB}OiDaKRoCzBg@hEcBmAiHh@}JwCwEdA}@`D`_AjXr]cGpMaXqi\\\\eybBs\\\\bSwm@lD|BdP}`@|KkHcO{i@~E{DpRom@vBw[x]rQ@tHfJjMtA`CfM|J~Av@xDhTlEtZa@zGvLx[yJh\\\\fBpo@aR~TtCbb@pXlm@cShb@{Yz^_NrEkY|IqQml@sLeVqN{k@cKuN{JoOdFoqZy~gBqMx^jPtOuUfUmNl`@zCpTsXzf@zZpEnOeFtNzJzk@bKdVpNll@rL}IpQsEjY{^~Mib@zY`Ux[lU|F{Gtg@xDrInRwK~\\\\}@tk@dJ`v@sA|GnOr^kPzQlB|aAcRzKpLbt@M}Fok@q^yi@`yAoJn\\\\kOqBkZnKcMcFgi@nIo`Aod@?{NoVqNgx@tJcTeKgLgs@kBsJvLmi@y]hMmVzAmb@gn@fG_g@oHc@bWc~@pMTdUq~@uJcb@cPqeArW_vqA{nWwYlDyQiNyMjR~@|Xrb@|MyYbP~Ul`@zLcJ`NlCza@a@^_RzCgPcTi\\\\ckRmkjB~f@nHfn@gGjXua@z@{~@mI{O{PwQav@{B_UgPgq@sPbAb_@nQjSoFnP{`@lHfNrVrQyE~k@~k@edW}qlB}Rh^nd@rq@j`Aib@vG}Xv`kCyfb@g@_P`OwQgNoIwCaWlD_a@yFuIwo@Had@`OmOq@kJdUea@g@~@rQyZfAu]|UdVlXv\\\\sLt[rApS}AfJjJ~VzBnHeNtS~G~Wvi@bO}Hv}Ogot@e@aK@eCNaiA}cBcm@k}@qHer@wO{Vi^chAwWuAgm@cc@mDg[cVypAqImJiWlOgLpT_aAvB_e@pV_g@a{@ea@sbA{Imf@wXe{@aR}hBcJkfBaDo^fH{y@sWwaAMmXnMwi@wBtK`_@{Hpz@tMpr@pe@za@qD`n@ar@fd@QbNqe@dXsYdoBgSdv@kB`\\\\~I~q@oCn[|Fda@mDhf@xWbY_d@pl@iAvYgUza@e\\\\oJkp@`\\\\mZbf@duEbvB|sDxyBdwAzZhdAbETyf@|[cI|e@{PzMi\\\\xqEkgCxqEkgCxerCnHuGln@lRtg@bcAl`AdjArWhe@ju@xJdi@hb@tXfYq^fXwExX~Ct@}UyP{MlF_Yi`@um@pLiZzV~[ld@kZuKsPpIww@}TkHoJ}e@sVgg@jCoXga@mL_j@{Wo}@tb@sJ_@gNzYat@tGwP}Hu]tSc_gA_~i@zvF?nqF?fzF??eeF?g}EvQiq@cOse@tHuYsU_]crAa@e{@pO_}@lQ_\\\\vHao@yRwX{Pcv@eDmk@zF_P~]oMkScq@vMuo@pBw]wN??{a@bzAgEfOpPbXlLdn@~Op_@rMzIxScSd[}Zrk@qxAlEtD}X|`Ake@x}@gn@j`BaV|`@aShb@aw@ddAjK|I_Arg@ygA`w@{cfAkd[tE_X}Y{zAeEqh@sRcRam@iIs^sb@ic@hgAePjx@ga@l]itA`z@wa@rb@{`@`c@qRnTu]vQxQhNvYmDjTgStXsc@vZaSbOsTlu@aXxi@WbNaLrc@vM|d@k[nRrm@zpMsmgAdDuScVmVsG_PpTqQgPah@`Xod@_ZcDqAq\\\\cIcHYwo@{[}OnPi^jc@eAvIzFzc@@tNq]nX`HtUzNeBok@pXcZmwAal@okAfJ{rAKoaAtI{r@iBadB`A{WhWarBj[wUoLieAh[mgAcGiBhc@dz@rh@`oAdLrD`Tje@ra@bWzq@kWtb@bc@|ZnLrg@dn@lKfk@`o@jnA\\\\pz@e@bf@`UzVrVp]eDdVcTtP}b@ysu@edsB??mHzInk@~b@qQhy@xYxRnr@Axt@gVjZsFft@`JgF{c@~UzFrf@gUlD{b@_nAmPwmAaHybAhIo_Ay@yi|AesNpoDpzDlpAvAtv@`k@`g@d@bPtRti@?fXcT`x@bYnQ`Yrh@}CzLeFrMt@vRSbnAat@nj@?jTqS?ab@l_@oI|c@_cAp[oM|I_Xt^m]je@oCiTsb@e`@o@iHcRXew@mQk`As\\\\oPiEqXwYwn@wd@}]kXq|@_Iut@wgA`LoRsm@}d@j[sc@wMcN`Lyi@Vmu@`XcOrTwZ`SuXrc@kTfS~TrZbTh\\\\{CfP_@~Q{a@`@aNmC{LbJrLbUaVla@aVb]{VfUikEdiA_zv@q{eCbHvj@u~Ath@rx@bn@ugAbfAbi@pt@iw@pm@pXtg@o{Axi@nVz^`y@bc@xdCvnA????lpB~CzlB|UtdBdLdc@ca@p{@oS}Lq|@j]kw@y\\\\mc@uw@gf@_nCwbAuh@aLnEmY|uAq\\\\`TiWt@g_Bn`Bqi@hrAq]md@oOmdA~_@spAaBcbA`Nqz@sZu]yl@_`BeTgoAzW_q~Idk^?n]vf@jN|f@dL~FiVg^yKyRmB{{zI`ea@oNiIoT~PhIt_@ve@pGna@wF~DmZcWoT`d~Ihh^vF`]dDhB?o]~ovBrgdB_jAod@ct@rNod@_X_q@b[vQzTjsAvQb[{Tbt@b[r{cBwbG|c@dx@dR~l@~VvVz\\\\nCpGsP~LsAhR|OhZ{K}NgYoDs[}I{YpWad@|Cwi@q_@wt@gTzE_m@xMeaAvs@saKor_Bo\\\\jOayAnJp^xi@|Fnk@dPtIl[wD_AzNvl@bb@Zh[y\\\\yHoTlZrArPmQnVtT~QcOjo@{`@|FdFbZrw@hb@fzB}O`zAhSbFrd@lgAbGheAi[vUnL`rBk[zWiWi_@od@{Jo{Bn_Aq`A`m@s^p~AaWfEql@_pAsL}gBbOvRweA_z@xYopCwo@wQgr@uu@sK_H~Ta\\\\`@a\\\\`Xsj@n\\\\a_@{Cuu@n[_MjDsaPggrAgg@{VsIrt@rSfo@j[wKnMai@w_UilCw\\\\cC}d@jG_d@aGyFlBpCfZoPh_@om@cDqNlK`ZjgAq\\\\~c@yEvo@zFph@dRp\\\\bv@sAl`@_]|CtZdi@rFlTvNqVhh@pn@na@f_Ac~@hh@qr@|d@q_A_AwSsL_SeNol@sKim@aTsB}yARjbKwehBfn@{Kre@Z{Ko`@zKo`@ks@qA_bAre@j`EyhgBC@eHic@zh@oe@\\\\[zjA_J|M}OwU{ZpSgPr`@p\\\\tBg{@p^{^uUs_Aqo@uq@}p@|CkjAgDxaArbAu~@qGocAHhO|q@dw@~v@s_A~B}CpEuv@vhAyi@`Ime@dfAyPtWwjAzJrF~f@x^hQ}Wj_@fw@t_@rrAQjiBdPb\\\\iKhh@h\\\\zx@cFzj@zVf`@oKuzAs`A}v@oLNAp`BkItP{Wi`AkRfa@u`@{J}g@e`mAuysAsFkFys@tI_{AbIctA|\\\\}IrJ}d@yHgy@`LcRtXif@lMfOrGy]x`@nGjFt`@wBrm@}PhNdIxuAvHd{@u]raA|AiHuYrNsi@bc@aVra@eFo@uoTrCnRcYf_@Bjl@}Dfp@uNxUxLfw@}Cb^uOrf@}L|T~`Brc@va@jThw@dQtv@wPyAuW`Zyt@gOseAkYos@pO{wApGan@o@ob@qkB}AqZpCeSaIfwYsqWc]R}k@fNwLk@uC_Fca@|C_HoBsBzU{HAiOiGkI`AkPzNwY~CcPoLeSkG_NwGqKr@{LvLmFdPsXdYxKbOlAhSiLcEyFfFhBrQaR~PlKzC`DdTmMzXmN~p@dVpF~DtGyC`KtBfZzH@tPs@vKdXtPIbKiLcCcXbYge@jO~EhLl@dPpBU}U`IiOaAeQpLgYjPkU~p@ApMvJfPl@tInLdFhPl`@nZjZ_d@hWmW~NcGrNkK`FsZdHyLbQeIwZo]_Rd@iOoIwLC{HgGhDwSyEoErs_@upYacAy@cMwMyR_@uWjNkRFsSoIsK`Q`Z~LbZa@xYgLdVlMdJP~MvG|w@i@hq_@aeWa`@eIuS~@yO_ForBrAd@dTxEnEiDvSzHfGvLBhOnI~Qe@vZn]j`@cYhYeCjMsPKoH`RgLazQwmCudBl@QdjA|yAS`TrBtJmHcjr@g}cAxFlQ~xAhDSiIfkAeKqJqYea@`Tso@qBom@lCn@zIoyk@svoAgm@x@aq@eP_k@zTyw@}DUc^m]pOhRbf@zM~E`e@y@r_@{DtjAfOij@bb@v^dIxa@@``@e_@vJtL_Mjd@g^h\\\\pVtLya@x[}]bQ]hb@xx@qOmQz^tf@pEuVbv@nh@Xfr@eZlV_q@|Iqh@jWw[~^sb@fCyPa\\\\i]wBiSiSaHg@mO{g@oDyVuL{`@f@iI}IvizAgk`D{pEid@gzExAwnAaV{{E_EgrNxF}eKpp@lrB`WbnFvAjoIbEo^bJe|E{Ei{DpTixBcR}r@lUrcAhc@c~CgVonHeWkzD`Kab@tYv}Fnk@hb@jMvfExIwoC~AbhApl@hq@pg@}@ndAajAxg@r`BrAveBvRirBb`@uMbt@xaAvD}oAvt@xiCnCmgAlXlS`UbwArHbvADimAji@YxZrzB{Xd_@vOksArN{pAde@uVhq@jnB`Kdo@aWflA}b@kTli@rgAz_@wcDrAcuAlBnfDju@zhDhp@|uDpT|cAFr_AbW|uA|`AleCxj@dj@pAdrAjNxxArMpt@re@Zxj@r^`h@zdB~p@cXxo@`[tr@~^~{@`wAxBh{A_r@|{BIr{@ia@th@_|@hkBwlAt^ug@pGew@puAux@oUam@th@_Uy|@ahAa}AgVuWcYaLyo@lfAbU~`@hHbw@zGtkAkSdCmi@mWg`@_y@]q~BrOljBuf@|v@kTf}@vGds@mNydAgy@~d@iVrp@ej@fjAgaApnAiWWcYvfDqc@tcCqC~eDnAnwCrCpgA}RrkBif@ccDsRy|BiBljGgOzkCoXsGiWskFa]{cF_]eWwUtgDmUou@}WkwEsj@}yAuE`Ya[asCoOe_EyHa_EQecAnRwdDma@etCjVwvA|Cy`ChSrsCu`@fcsDuk[q@eQgFuMzGsJa]_r@goAEq@gTbIyB|EoLbVmMfV{Sg[E?eb@ky@Ayx@TNnp@zCpeAsQ?kShJmDiHiQ|Fn[zVr\\\\nPjC~J}CfK|KzNrMxBiBjFvJ|ElTvN|@dH`_@}I|e@c@r[kKtlmBwuBfNfApa@iDhSrOf[~IvRtA|EfKt]cBle@i\\\\pC}[~Nq^_Iet@iPaUhMa\\\\nTmHcGmZpMkMn_@vAfi@mn@}OePf@{[me@aIoNuJjTeVmDyUqp@uc@_h@~Uue@tg@w@d_@qVn@o`@n]uWvT~Hdw@|d@hOkBvMpJf_@uZjl@aSBeGfb@tkaDgh\\\\lTg@tGnGtTdGvN?xL|FpKyArIqHpEz@~FzM~DO^zKxTdPpJlFjEvFlQsKnLtO`LMrMl@i@v]dHPxFfMlRpAvIqR~QkDiCaXnGwExKoClZnFhAmGzQaInLmKjQgD}K{N|CgKkC_Ks\\\\oPo[{VoElAuL}I{P]yDbDuHcBa\\\\rD{[s@cS{EiF_F}RdB}MfCkOm@kKmDq[tG}Hj@aRtJaQ~LwUpHij_@oyyA{RtFum@xYsr@`KkVkHeNdWyRxP`WpVf[{Ldj@Zvt@kId\\\\j@pL~KlUkM`L|Xs]f\\\\oLjRw[hVyVzLsV`Yiv@tVzErI??vy@cVfc@oUdx@qQps@_m@sKuCn[gYb@cTdg@{HdR~YlQ}Sk@uTgA_@qj@bAmJqIgTdIqWf@FoPwTkEaEgX~`kCcoe@mD~`@vC`WfNnIaOvQf@~Onh@sIn\\\\hCde@oCd\\\\tJn`@oRoDcSox@tGen@~CoU{Lp[cZO{Vlf@wHaMgPce@vAkcj@kq}Aua@~OkCvOde@bLp\\\\ji@xd@ji@bq@xJ~e@yAzn@lO??jVjHrr@aKtm@yYzRuFbKaTpIUwSgg@`KqLeb@CwCoXw^~NaVxEos@uF_DqKyWy@m]wHwE~Bk\\\\yFuMuMmSyB}aA~QokrGnaDa@tjEa@tjEtv@ir@l~@qKlNxPdnA|@qY{q@kf@kPhO}bA~\\\\os@dxB{s@nr@gDz|Awx@lQj]~VnDdM}UDcZvn@u]ibAqUqk@f@fDqOnzACvWgd@xv@oJlY}]gsAeN__@iSkcBrXyHfVoP`dBu_Ald@es@iaAwfAud@qv@Amt@vTkm@jUqasFxjPiEhKe@|Qxg@tm@nt@vLnFoFsDgT{Yce@cceG|mL`Ean@aJmUcLcTeMhQBv\\\\sfeFsaGpb@nw@}l@bz@vIv[aeAzx@`iAjFzSri@wArw@b{@vi@r@f}@bWp~AdHgU~eAb[vWee@pk@qBd^_ShiAlUxUg]|g@lBnr@eFpHyrAd^kP~\\\\mt@tGuu@gF}x@cd@oh@mIvh@wi@hb@ig@uK}f@nCkc@s^_]oDcz@nP}q@iLa_@{uAaWwTuTcfAyfA@ut{FbnDwcAfQwUvn@vs@wXfs@eDfb@bCfj@gAyMia@uxvF|kFdj@oJdK{Yg~@_BoNrSwzxF}fCoCba@}c@nDyDpXfBru@f_@cEnH~d@wX~_@nPnFfXqf@pQ}nAsK}p@_boFuu@{fAsAw|@kl@}I|Lfq@~|@|m@~Jd{@eKbgBbBru@~GzGhn@}v@pv@w`@i[qsBgTdDv[dZaHbZrc@`v@dWez@boAlJlTew@dgAP`h@h`@jQpW_Ug]er@j|@dWpNgPcGeW`l@sc@sC{{@th@~QiDzgAqAjxArf@`HzYiQ}Pqx@tHi{@hYMjRyi@yX}g@{Gsp@m^e}AcLwXct@mm@yo@lQm}iFd`S|qAyj@gy@iK{_@`R{T~QvBzO{~kFptOqh@wCaw@}UdHva@||AvPbrAwFDyUsp@_Li~eFriOqe@aDqNpYhgApKfj@jGr`@OoT_c@ga@OwOaUm{rEjpKoGfUwvBdEyLwX}rB`]wUng@w|AlJukAbd@hfAxVvcAeXpw@t@z_AsCny@eJjgA{Vzl@eE~XxF~pBwXxI{Yfx@sC}i@uz@yjAtBmq@lWczjExbAqIpj@yTza@{l@pDm]pf@vNvlAlAr_BfdAh@rs@gs@foAar@vY{d@hn@{q@~]{m@pn@ovAzu@as@jQwt@`Vyo@hw@if@t_@ot@`n@_b@d`A{cAnDy^gg@nAw_BbKgv@b|@ko@ji@ma@~Xez@dbAq~@\\\\os@xi@ec@js@qn@n[~W`r@yb@tT}a}Dkev@wCtV|TnJcDle@tk@iJzoAdj@{@xb@na@ls@bBl]zZnr@zo@gMlAt_AbMhTsEpYx]xM|_@cbBfPDfI|f@da@m_@iRqb@}ZqBy[}s@~b@sI~x@Zlz@qGpDmj@x\\\\aBnp@aZ`Uli@cl@``@bf@hVzLvUoe@vOrItd@sT~m@wHlr@|GxUpi@W~kA|KqB`n@j`@|c@|xA`i@|dAphA~m@lf@f}@zg@Bv[b^lNhw@jUd\\\\hBvQtn@_LfpAiBzr@lYjz@HdiBh_@~An[tn@aRpS~w@vP`Tni@`X|Pdz@iy@|[qvA~V_~@zTq\\\\d`@a{@nNemAxI_f@zw@{tAzXcxBtQ}nAEwjA`Koy@~yAld@`k@oFrpAwjAa]sUlQoWhhAat@sh@uh@ohCBjKst@bb@u^bFco@|g@a[{cAo`AsgAvCk`Aq`Aef@k~@s{@w}@\\\\qk@it@cc@lq@{]vTgi@bUyu@s]}Yy}AfNudAiHi{@os@ebAfhAhE~q@{W~^`Az^zk@kGqPzcAk|@pf@{uAvj@rf@h[hWny@q{@rV}y@t]opA~a@utAbGac@x^go@|DejApMas@a@eFuWfGwf@yC}Yce@cLgDfp@k@nKyw@vVgf@yHys@dC}q@y@mCme@lX}Rkq@yF{w@om@agAwf@ms@hNqk@iYi\\\\ze@bTfYjbKwehBiItk@fn@xv@xmB|c@lwAmHuq@i`At_@o~@atA_p@gn@e\\\\{Kn`@zKn`@se@[oz}Ammy@pa@y_@Ri`@~R?gIgl@b_@on@rkAga@fj@mz@mMwo@o^qTvCoc@|g@yQng@oiA??da@cq@eKiRnRufAyi@yP}HpVq^z[{i@hGsU{@uhAam@mVsCoQhQpT|]}e@v_@qNcByR`m@gz@~Kkj@j^{wAxIs`BqO_EsM{u@aKok@wb@wh@x@mZsJmk@vDcdAt^}p@xEmfAjv@qm@dAoDrs@nXzlAdPnl@gZdHvYfa@oSzp@{Ctf@in@nIcDfg@tw@tw@}]z_@eXvd@wz@lZu@`v@}\\\\bIeDv[dyAh_@pVrgAptB{QbcAkMpeAcGrYskA|\\\\aJ~n@bJ`~@f]jkAuS`~@ao@d{@yPvh@iz@bm@irAr`@bIvf@uSupkAay}@dXckAkiC_`AsVqjAzDul@ea@mNa_@_f@yYuHugA`G}TzN_]oIog@niA}g@xQwCnc@n^pTlMvo@gj@lz@skAfa@c_@nn@fIfl@_S?Sh`@qa@x_@`d@aB~h@eDzl@~z@fsB_DdoDu|Bb|Awj@xi[ox`ClMlg@seAri@fpAtn@fsDxi@zt@lJhqAgHjmDwRq|@sZ`gCq]umBcKtAkQdbCoMei@wg@w}AeHm`Bji@}}Aaa@smAtP}dBi`@owdAi{~@zItRrUuG`Lrh@uN`F|NpGvAnOm\\\\oGm@hWb^|bBfEgOza@czA????eQsSfCqBqOe\\\\sKcn@}G{Nw@S}SBwD}IwOY]pXlGnHukS{qzA{d@|GgF}Jw|@yI}LtTkxAdOvEv]_NrYvp@cHxq@dUmB`^tFxPoSx^sy@l^m^tr@qdAjq@}o@KgNxLpPlK_w@pU{l@|Qst@p_@mEtJtJjUta@e\\\\fu@gIhYlg@cl@bVjFr_@bYtBj`@rt@`YxCGcRwKo`@qLkLjWec@`Ro^~XyFlQ_Zbg@iJ`ZcXfm@aCxo@g[dx@sg@ni@_c@nRy|@b^gFxq@sSv[lGbc@~[~XpCeFcZz`@}FbOko@uT_RlQoVsAsP{YjLc]}Aab@gTyI|Hw\\\\_AqLeXgm@xFoZqIqy[_oiAmn@mDnUdp@kHjRbLb_@xn@qVv^wEfvAw^wGa_@chAtDk_Pg{nAg^kRod@jk@vGtqAl[}BnXxStVqOnAkjAfMwb@bovCubc@ai@rDg`@~MiIbP|j@d@|QlI~a@aIvb@wUoFiMiYiCsldAsg~@{IuRsdAvWkyBsaAeXbkAzJlHd|Bj^i}@l}@tSrIfI|Stn@tG~MnU~YfRpdA_I`A_Hc^}bBl@iWeHkQybtGyokAzx@|}@a@n_AnVzp@{Ih^p_@`k@xnAj\\\\zlBzB`xAhfA~h@_WrAwm@tkBxL|hAl\\\\dhAd@k~@~l@th@fiBlg@fYf]gWkNiw@pf@eQlX{i@cz@gRw_@if@{}@i_@{l@ui@k{BuQ{aAxKk`AcnBuh@z\\\\uzAo}@ob@iWif@mkAvIgeAmYof@maAoJaa@tuAimyGqztAgk@oY{LdeAt{AbPvu@`}@haBwi@~`@jcAndA\\\\pGc}@{]ao@yaAoBeQmuAoQuo@mhA``A}n@~SepaGoj`Aqa@gd@qb@dFuXgY{l@nL_GlTdb@xd@rXaS`_@nMpOpc@vg@wP_siD}b_Bpn@rh@|r@xD~At}@va@f[~zBqS`l@znB~^|LxzB|Wgw@rkBzi@fO_Drb@ne@eHj^mUv{AqErfBu@tUzE~wAgYnb@|KtHzc@xeBoTdh@xG~LjZxb@pJlqApj@jZtk@fVLbPs\\\\nnA_AtKgr@n]MuCu}@xiAsl@djBzChhAbHtz@kw@br@sVz_Bwk@tJmDz_D|c@mAleF`_@`Bvj@_p@fi@oP|eA~KrZxSnBgNkNaY|JwTlgAiTd[cw@na@yN`AkSy{@|DkAul@ct@cIsu@hHgJ_|@bJse@p}@~Abt@gNjgAnZhy@bLv^cIkEe_@zf@wh@jm@v@`t@ki@cc@kn@fQwKyp@ucAi_Afc@wFsl@a`C_cAs`Bs@whChj@_iAfXiaAkYabBg@}nAl_@eQqQwvAtAuNs\\\\fdB}i@}z@o]tJ_P_{@gObl@yi@u[iT{hFwTo]mNk{CaVew@}XioBlLuRx_Ag`AgNioAhTdDba@}z@qBs{C_z@zUrRwnAho@ujCt}Cg`@u_@cuA~b@yxAaOoa@fJa]bc@wj@bKqYnYooAkGcqkAhcHtxAo}@fCgc@raFi~BpI{ERgaA{PiXw]kh@wUql@nZwfAhFk^r\\\\kj@me@id@ki@eh@m_@nI?`b@kTpSoj@?cnA`t@wRRsMu@{LdFsh@|CoQaYax@cYgXbTui@?ru@zeAWtbF_d@pr@vj@~WlN`YlVpCzG`k@`SdXdKrh@criCspqA_MkZeh@yGyeBnTuH{c@ob@}K_xAfYuU{EsfBt@w{ApEk^lUoe@dHxGbMlaBz`@hUxWdoAlFrVzf@baAkGdj@fKtz@n\\\\sGrMxPhMbuBnHflAiSvbAxC}D_c@_cAlI{UgRqn@bE_oA_l@`iA}_@nk@pNbm@oVms@og@qjgEuxVxMmjA_g@_s@yoA}Jsy@~Gqr@nWg[cj@mv@`VoMrh@vF|iA~gB`o@mZzd@r`ApCbu@bXhs@cHjXq_@}luFkvhA{BsD}ZdAiWe[ek@aBsYaC_HcN}t@vhAmNng@O~fApVja@pw@~J|p@zXhw@jD~Eaa@qJ{m@rZ_`Amm@qI{eg@}vpAdCuU|MkEhLyOuJ_M}MoCsGwSeJmB}GxGsJzBeG|HiI|AcKrJ{GK~EfNnFlFcAtC~LjA|c@tHxAxKmu|Aopy@_LrZpDfMcSbn@dk@r@pNy\\\\tv@_E{l@_{@mvpEsvZlv@aVf[bj@pr@oWiSe[yA{s@rq@ou@zBu|@pn@wq@fn@iCpKvTrc@x@tQ_Jz`Ahd@n@aw@kN{`Afi@yApBqd@`ZiRiL_Vet@ug@sDtMi`@v@lHofAk_@eHqc@jp@a[vw@}kANgWnu@~f@jOzPnU{iAjd@}r@zhAkf@`v@in@lj@wNdk@y}dAy~_AvOXvD|I|SCgU{q@c^ak@c@eAc[dBgInWba@pVlnOk_NzAdQgEd]rLvZgQdPyRdCoYdY{@rW|DxFxClr@jOPl_Aw\\\\vw@sn@ft@ea@bi@ig@}M_SiBeQe[{`@c\\\\e\\\\iLm@kO_FcYfe@bCbXcKhLuPHwKeXoyo@_~i@?x{BzfADVfYhxFuvBfxFuvBb~@da@dk@fVdb@ka@xaB}YlZcf@jp@a\\\\d\\\\nJfU{a@hAwY~c@ql@yWcYlDif@}Fea@nCo[_J_r@jBa\\\\fSev@o]mMmDmYtE{X}i@aWgRaSm]}PqB_o@khAnTgYkDgs@lI}qA|Zg\\\\pv@cw@bKawAbYqaAb^o]gO}\\\\w[pM{n@sRk]al@i\\\\_j@oGqsAvKiT~ZgVF}RrIa}@jFgNrSrU~\\\\uHtYbOre@wQhq@?f}Ewv~CeuMlH``AdYxPju@hMv\\\\up@`J{xAi[mdBej@va@a\\\\~j@crw@vpw@uTxQdRl]rIjSxa@vHnJ~RjUdEzm@ao@k`@qf@y`@oWg\\\\uK{vr@}rkB{D~Zfr@~RnMhb@xbAnVl{@K~MiR`_@uE~C}NuEcPrZ{Hn`A}IfLqs@qfAeRygB~Bm|@eEwG~Kg`@`CuxJ_|`BoKbMpBjZ~Ph@~LkDwEab@oht@egoBc]lMiDh]cSzc@dbAbW~d@nI`{@i]f`@aCvG_Ll|@dExgB_CpfAdRcAan@w]gf@{y@iTsp@tm@eq@g@_K}n@gt@aJkZrFyt@fVrfC_ucAqV~f@wB~d@qT~`AmOfLlJhWxpApIf[bVbc@lDtAfm@bhAvWzVh^dr@vOj}@pH|cBbm@O`iAnH?m@l`@re@`AbSdMj[?rUcGrs@vEhSto@pRpCj\\\\xmAzuAlbArShuArX`[nFnUvkC~C`@A}A_\\\\_W_PmSq_@~BeTmTak@ya@wf@aTaIoOoc@o@g`@qUse@sh@yUsf@y~@c@[m^_Wcy@}Egp@ui@i^uOes@es@rNwlAwVwt@kG}_@gg@ei@u}@q[im@yXyh@w_AsRke@_m@Hud@nYmz@iCw_AxLu~r@yd}A}MeHqh@eEam@lRuXjAg[xOnCdTwUdIaHbYyT|NlChHuJhEpOrCxc@y@dEuG`L~CmCdJbP|R|IlTtNxEfJq[sEuY~@kZ`c@ed@xRkYjRoQow_BjjWqOpYoNhh@_IdjAgOf\\\\fE|\\\\`JjQdTsc@vJnQ{Jhm@nDnYfPlM|B|s@rWzgAx]buAre@luB|VzuAf[ngAzq@vMnu@lY~b@}Nrp@kUfP}_@bCmv@~Typ@vD_l@eJal@y[yICyS{\\\\kn@sDyf@nMq\\\\xJmf@~Cqx@yT_b@mGsf@c^iA{a@yKcViJmZYsb@sb@mr@oe@wQm^nGuYqYnFma@mj@e@qd@uS}ZnwcFmp~@afAyCknAyEzDfKk}Aj]qmC~j@i{BMqp@?CyXgkB?yUdU}^vRed@nZuSr_@qNja@i_@zQ{r@vQkf@kp@cr@e@_k@zWk^xi@sTrc@{c@rb@wLvj@oPj\\\\wo@jRkk@vLkW{@fWzu@|I~k@pCtrA~Dp]yI`a@kRn]oKno@mh@nm@sMtb@mWv]kaApOyXdYyu@oPun@iEym@gJif@uIwf@oX{Mmc@eDqs@wIgQki@kOaaAoMkv@dA{d@iD_NfLbAb]p`@dd@zM~d@oJ|IjH~YrNvo@zNaO`L`@zJXjUvd@jJmFpF|AOdHxx@Ujy@@?db@f[DgVzScVlM}EnLcIxBp@fTfoAD`]~q@{GrJfFtMp@dQteAgbAf_@iS`r@iOza@pCdq@nVn^bEdk@mOxm@{Jly@u[xm@wGveAa\\\\hs@{\\\\xNuO|a@wB|~@wR`Yq[bbAmb@h^mf@zMm]yScElEyPkMeOIsT`Ta[rD{W~Sq^`v@c}@x}@yo@l]}e@rt@qXnJgNoHse@x^qM|c@k]pNsj@r`@aDhc@}_@f\\\\k]vAqRr`@cn@bU{n@]_Wdl@yWzSvArb@gP`IlXkI|\\\\aE|m@mTxXkm@~i@iIvMoHlCgGnTcJ[oKhg@_RzNiLbUif@x^uSby@qQjZkPh\\\\mB|_@c]`AaXl[uUzZn@dJhY~U`JInO_e@|g@sb@`l@e]|^{NaAwl@nH{`@v\\\\kR~i@{ZfG`GvNiOpe@cNxc@ic@qCuCwXpBeVkViAe[bo@qk@tc@iP~Uaf@dV}g@~[_q@yuj@_tqAg^`SmChh@zJ`AhI|Iz`@g@xVtLzg@nD|XeNzGyY}FgT??}FNyAyK}c@uH_MkAgTuBrnUuhW{AoRhDcWlVqPhKyb@zA{e@aTkJoIyc@yRm@sj@jPgb@iKeWbCkH{LwyF_@}Lwj@zIuFb]wlGd]wlGu~Ac@yqEjgCyqEjgC{Mh\\\\}e@zP}[bIUxf@idAcEE|nCda@vh@hDne@nv@zHftAjDbVfU`g@lA`g@HrN_Kja@zGly@|X|JpRno@~ZnG`OdYtKd]kGbPfNdHxi@rp@xr@m@dT`PnYeCfc@xXfHpM|FtHwY`Q`FvIg@pJfQfo@OhPkHbGrD`R_QiBsQxFgFhLbEmAiSyKcOrXeYlFePzLwLpKs@~MvGdSjGbPnLvY_DjP{NjIaAhOhGzH@gpbEc{f@xb@lMlc@bZbk@xAn[pbAjYjJe]xu@uf@rl@qXfh@zUju@pTnJ}Mj^uh@rp@cF|a@^~[mW~w@ha@fy@f]f_A`Ekm@gR{n@`T_d@cDacAjXk_@jSyiAhJ_nA~Ywr@dh@j^`fApk@`b@qDte@uMoTmlA~Kqy@~o@_gAsFqUpc@_Ghk@_r@bCgq@yTlHi@yk@y]yMrEqYcMiTmAu_A{o@fM{Zor@cBm]oa@ms@z@yb@{oAej@uk@hJbDme@}ToJvCuVqc@sC{Sxc@iZzMy@xn@nApr@dz@ds@nFdiA}`AkI}Mnx@qf@bKdQ|r@km@lVcZnJyl@eQ{@xXdt@tg@mef@ydrAxOpD~BwJbZv]gCzRbLyCnPmS~YkK{EsIcHka@kSqMuJuDqOvIcHrGqSvEyV|KbDjDmkjDah_B}`A{IgvByt@a~Ak\\\\iu@dRg`AZwh@f\\\\k}@fAkyAtNw{@oj@jXyc@u_Aw_AaeAxXuw@hFohA`O}Jxm@ywAhYaz@qJanAeGs}@fGe|@~\\\\}d@|^}x@SwmAdImx@oNiqAkIozA_k@od@vEw_@|SqiAgDl]bn@dk@n}@cOnXkb@{Fu|@tH_o@aVeq@~Rsw@tj@zEdUhp@_FvyAfG~j@xPxl@hh@h~AdWf}@d`@f_AuKdb@sDx_@hg@_S~VcIrSvj@~Szk@n`@~gA~Tt|AhA~cBvTvgAp`@tZmRrjA@l{A_e@t|@iHbrAtG~_C_M|cAl@tc@ad@l[sx@re@}EnjA}e@dsAwGfiAuInUcZaW_hAbj@kq@dxAmVns@c`@_obA~nU_n@aDcjArPiO{Foj@s@iUwQod@^icAgWwp@gc@????aI~ZpAh}@wFxu@mAt`B}Ir]rQrk@fWlj@vf@ve@dx@vVleAh]reAbbA`WjJrj@lk@vXlMfDpk@s\\\\hn@iKtc@YtQaJcBx@h|@bI~[uMvIfH~XbYdUpr@bTdjAz`@jZ`ViDjY_OdCjDz_@jn@OjDsZfHa[jDmUeJudAhOkk@|\\\\}vA{`A_fAoOal@mHuDaFwc@`IqQuAum@eKij@BcnAn_@aSv\\\\qCnLmN|[eLbs@f@`CiV|Dok@u|Dor@_c@~\\\\ePwDuWxNsB`XdL`\\\\sC`k@yg@pe@aRkj@aZcLhDkoAdYel@pUeStT\\\\nPgpAli`@o_h@sLySwsFJzJgyAiNc_@qy@sD~@{~CclEfBEu}AajFhvCt~Ab@e]vlGc]vlG{ItF|Lvj@vyF^jHzLdWcCfb@hKrj@kPxRl@nIxc@`TjJfh@}i@xd@}l@nh@qOx\\\\kQ|a@Tn]rL`^mDjT`SlDu`@mPy]yFyy@|Ey|@pFa^gEe^bOu\\\\m~~@|_Qi|@rJqKhPeTb\\\\oP~sAnPnn@oPfpAuT]qUdSeYdl@iDjoA`ZbL`Rjj@xg@qe@rCak@eLa\\\\rBaXtWyNdPvD~b@_]z_@eO_Ray@sRwT~Jyr@qKsq@uI}O|Nat@knbE_sK{IeJ_r@jZ{Cb_@gh@oFmSuXkMzD}c@vd@eYxh@sB`i@tEl[aEnTqC~c@aUfPqWfv@d@bThk@dCbz@im@|hAsp@hFy^dc@yh@rGwr@nUaa@yEql@sfeFsaGdu@oIxfAAtTbfA`WvT`_@zuA|q@hLbz@oP~\\\\nDjc@r^|f@oChg@tKvi@ib@lIwh@yl@jTio@uJqK{s@uYyJ}iAoLyk@op@u]of@o[j_@cLgTy\\\\|@uB{f@yAy]co@mj@o^{o@iXEa_@r^{AdZeh@jPcs@xQlCnW|h@`BcJp]oze@~jo@@xeFxv@|^p`@pChf@yJ`[oCnIwYtWcP|\\\\|]lm@gn@nWsl@vL{{@lNgl@|Sg_Bj@wiA~Fca@hWwXh_@sr@x_@_jArLgf@zq@_|@xB}n@a]{Jmd@uIog@z@id@f[mHkCi|FuAij@|\\\\ivCzG{qBoXer@eMog@pBuWbMMdDdb@`M~QBzf@nWzVwXj_BzTnm@`Az@r}Er|@dAgxbIndh@gr@ve@o_@v[vV~Mja@{Ovk@c[fg@c`@jh@ak@rGeT{YZ_b@fToZfTe_\\\\}sk@kNb`BkVhO_@zR_YjTpL|YbWx}BfBhpAvnA|y@~YhqAaYbVDfg@cg@l@fEl\\\\rPpB`AzRrJj@fi@kcAtMoAzo@|a@jo@gQr`@sB`QvGrc@{@zc@rYz^n@rjAi_@r\\\\jN|^a@lVsVr}@iVdbAlFfOnLxG|b@zPdXjCxv@rn@_c@lUD~ShQm@yi@`gAeM|@g]db@yg@jGm[}Ci]ag@mAcVgUgtAkDov@{HiDoe@ea@wh@D}nCewA{Z}sDyyBeuEcvByaB|Yeb@ja@ggDefKqBwcBp@wf@wJmf@gRcRi]ue@pEyOiKeX`Mad@mAwSkCyv@{PeXyG}b@gOoLebAmFs}@hVmVrV}^`@s\\\\kNsjAh_@{^o@{c@sYsc@z@aQwGs`@rBko@fQ{o@}a@uMnAgi@jcAsJk@wW|WxEfJhBxSrs@ho@nO|f@xGl_@hL|LpKvj@l`@vXtHr^`MdXxD~X|i@`Tbb@uXtV^dd@rc@bQPt\\\\f{@bOfk@z_AnUtViB`W~L~p@i@l`@cf@pSgl@fk@eh@~m@XnkbDujT|MfLlQcCjI{KxRgDjMdGdh@qOlH`GpTuRf\\\\gXvLaTjYsRf^g[}EuHiIlHuCmCmRqAyFgMeHQh@w]sMm@aLLoLuOmQrKkEwFqJmFyTeP_@{K_EN_G{MqE{@sIpHqKxAyL}FwN?uTeGuGoGmTf@jD~DdB|LkEzUjMhTvEbX~@pZiBbOs@b[pHbEzDvYiCnOvK~N{AzOqnLsmgBuJbTpNfx@zNnVnd@?oIn`Aja@qMpf@kZ|x@~Kvl@}C??e_@ePwu@}zAotAcYmq\\\\srzCwVkTwzAeAymAxTwlErm@h|CpWta@~l@zu@xJv\\\\xr@hjAlAjeCce@uw@gUt|AaQxxBws@po@}o@kiDkUga@zTyv{@kzfChiB`Xnq@vDoYyj@foA{W~_BdTt]xl@pz@rZbbAaNrpA`BldA_`@ld@nOxe@pAbHbh@xtB_IpOva@~z@Efh@nk@p}@fdA~_B|vAwUjTvTvW~|@a@pg@ry@yB~qA}f@r^tSnhA~r@zi@pZ~b@zh@ke@lzBhgAhrArMluAy^jUebAvRgoCqx@eg@_dDos@mzBo_AkqBcvAeuCuwBugB_n@wjDkmAchCkZ{eBhBe~Awr@}pBvAgoBmKmbEtl@noAvO_pt@oj{Ct{Ar`@htDjFhwDmIbJePtxAc@jcAu[_`EmPwyA~Me~@uQa}CrNgho@{`wCrjCpXfmBoMcj@cOvd@_So`CoKyWlVobkDimu@xC|YgGvf@dFtW`s@`@djAqMfo@}D`c@y^ttAcGnpA_b@|y@u]p{@sViWoy@sf@i[}X_Ncq@fRa~@tg@cb@~G_T~\\\\qo@hKuq@lZweAjMknxIbgmArVt`@~]xi@fo@zWvIkO`Y_Hac@mr@nSka@fbA_Xw@sUel@yToIco@zAmg@hX{h@u@_Jz\\\\yXdp@iv@bYgk@eV{C_a@ta@so@dOuPtv@il@x`Ai@ui@e[`PiHfn@iq@jSgi@~Cub@yVu^dFbNnv@`Rlc@tn@g@tO~QyDzYgkjIdatAqt@u_@od@m_@yZsm@uVyNgH{a@{j@{[yLpYeMxXmk@iXcQjYAhYhV|[xg@`m@~^bXaV`]do@Xnt@pVvOzg@nb@f~@bp@|Zd^xPpx@i@lg@sS|bAkCnI}Uq`@km@smAu|@ig@wJoyjBgjk@s@eXgQ{XEqXg[iK`JuGcDug@}^G_[ti@{a@tU{l@dG_d@jJg[zb@yOvSkUzFB|LvUfd@~HpPhY~RhVxi@j[gB~KzM~Ht^uFvh@|DtFv[E~e@jVbEl]fMdL|e@OlWvNIfXf]hPna@{Dvh@`Tz[pBlSuj@zo@cfBozDo}@uh@_|Bi{lBefq@zJgTeQiTwFlD|DxXy_wCkidAh{@ns@tdAhHx}AgNr]|YcUxu@wTfi@mq@z]ht@bc@]pk@r{@v}@df@j~@j`Ap`ArgAwCzcAn`A}g@`[cFbo@cb@t^kKrt@nhCCrh@th@xl@yNtQ}k@fo@qn@drBvJndBd@`wAvGqVsgAeyAi_@dDw[|\\\\cIt@av@vz@mZdXwd@|]{_@wgBz^o}@iHkd@|FsKuLqj@nDepA_YeAet@{a@kb@om@B{EoPwn@cGcVxDmWqPlBqd@oYud@yf@{NpWih@mz@|@ePoUrA_Wc^gYbFc^xMmYoc@gZcbAcLwfAgFw^qJkc@_Fem@b\\\\oQ`o@pavC}|OrFdHoMxc@vJpQbSoC`Gj]xS_QjLw`@mNuOxNiCtJsSb^kPjZ~BtKtTdXvNtLdAbE~Ky\\\\z`@`P~F~GfH`\\\\dBzIid@bGrIrSuBpKcXrXcCfOiFxY@|@pLdFmHiBmKeDsKlAiJkHmF~KgHJeXeWqDmUlUh@dL}WxA}DaDePjNw]qCqYwN}d@sKkTuQoa@tBhAbEya@dAyZvIkSxQjogCrkGhw@}AjGlHdr@~JnfApi@pCb\\\\|NvTgEx`@vd@`QAjYnOlJ_Yfw@wa@`e@fLxYoh@rBsVj`@ev@p@gr@yc@dC|}Am[dFgb@wIau@pcBlLdT`B|j@f@dt@lWd^gJdVjM~S{Yps@jf@lbAvO`_@d_@|Nr}@{b@lDuX|zBw}@`oBicAdo@qe@zXsr@gI_Q|s@_qAr|@irB`z@m{BpXo[tRam@no@wg@pk@iXgS{Zh]sz@mRyj@yp@mf@mF~XxPzMu@|UyX_DgXvEgYp^ib@uXyJei@ie@ku@ejAsWccAm`AmRug@tGmn@sO}Dqh@r\\\\_Sn\\\\{[`O{c@p`Aom@xFma@oOqUxIqd@kDyn@f\\\\hg@r~@uQn@c_kF_yW|^sn@qt@fAuTnUpO~t@slnFynRuNoP{Eye@oa@uB`Ibi@gm@k{@~Drz@lUpSpRnf@rRnQne@ej@qyuF}lOkEph@sB`b@fTdx@zUw~@d\\\\v^}R~l@zPh\\\\phAgc@pPgl@aRw\\\\rf@q\\\\rR|Xj\\\\kAhm@za@hIiQoWus@kf@qPca@qVaUh[on@cPgI{Zck@u@tBio@uq@r\\\\gDn^qmfFgeQdrAfz@s]uj@el@se@od@ej@w_@c}@eJ~q@hh@ja@a}mFarb@dI|XkTvk@nO~r@xc@tSzHjq@_Mxp@c`@zEsZmFamAta@|D~`@kS~MnEx[to@u]`Vy_@bO|Uvf@kd@xw@dH`^yLcByXqR{NtQoM`GpUz]}b@hHeZhA{z@cXpSoEw`BkSsw@yd@@qe@xPgRgOkjmFohUrHw\\\\od@jRwf@Cd@bY|[pYtf@vQfAa\\\\}btFewVoPxdAdo@qOi@|SgNpe@t\\\\~LrA}j@xQgBvHyd@wc@|CXsVde@wn@_{@j@okrGnaDmkB`j@qrBvb@aj@`_@ya@j^oHzc@cgBre@eNb`@nx@vEyLrh@yv@~g@qg@haAyb@cAnAtZgo@rIvQxJmaAhY|E`Qlh@hCjNeOtt@_Fb~@mHro@{f@lb@ia@n_@wu@npAiZ|s@xPde@rS_Gbm@bp@nT~a@mIr_AsA`@ujE_ciHvcFwV~RoFn_@pRrOvJ{c@pMcWh[oSpb@uYbl@kQkPaNw`@nPgTvLgY~MiofH`lJda@dN`_@rMd`@Afr@eQtb@mPeDiR_w@bHga@{CkH_]_Hq@aEd`@sb@wCuPkT{a@iUzEyc@md@e@sKfIf@ta@~Sbe@v_@bDogmHvlI}QdMi]rf@o\\\\dTvGnPnPfE`Z_WjZuf@lLsn@uGaEwzl@ohhBwArZiPvVJ|Wnd@vKiR|[e@zZm^pu@tEnP~]fFxw@~r@cOb[rLuBjz@_W~k@xGn\\\\kE|c@jLn^eUtXnGpBwBv[y]nm@wBzDqRzi@_FjHbO|`@}K}BePvm@mDr\\\\cSrX{f@{CqTlNm`@tUgUkPuOpMy^ui@kQo`B{[wmAeTk}@pIuCfNi{@X}kA`F}qB]a_@tErm`Cedc@}^nDgJlK~NvN`n@Knc@dArBuYyGeHwl~FwmqA????_d~FuxqA??wG|IvVwBbZdTtQfTkAzk@h_@xLbJ`JpVlQrh@hIbZvO|@`ZhF|E{WbImb@lZ~GbNrY`Cdk@`BhWd[|ZeAzBrDj]{JpFvJhQdDdAwJdOwDxO}HcPoZwMkFpDmJ{Nu`@bCeInc@yEl\\\\wO{q@cg@{cAq`@}i@kk@u\\\\rR_u@fAvH}_@q_B}YyW_b@tsPqxpAuU{NoXaHuNp]{c@AwI{Fkc@dAoPh^z[|OXvo@bIbHpAp\\\\~YbDaXnd@fP`h@qTpQrG~ObVlVeDtSbXfO|_@yGf_@zEqH{o@zDme@|ZwD~MuV_D}g@}WuUmCgX_Lsd@j@mYnKmUjrpB`lf@mQva@bCxsA}`A~JqXgKei@|OuJtQyDfx@iF`WiVvAmVaIoUhJ?ja@nG|c@fK`c@fIdv@tw@zn@lp@~HdeAoH~}@_Po|@_~A|GsZj_AmWjkAcm@br@oHzqB_eBsWyiAq@s`@_]_v@{kBeQay@Zgy@|^kcdAao|@l\\\\nGwAoO}NqGtNaFaLsh@sUtG@de@sfbBejo@bCml@yOy_@aPwE}QrRc@pc@pLxc@jPlCscv@_zwA{ZnJk\\\\aIi[vIo@bOh]lL~Q{DnPljAvc@qEnl@wUphApM~]|NvzAiB`o@wHdWpC~PuXlJ{IoMqIlNyFrR`Mlc@eQzCwXbe@uM~E}Rz`@oWcq@yJyd@ki@q\\\\ki@ee@cL}YkLue@zEag@F_\\\\fNkTqHcm@_EuNsMkY?aRbEkRnQyRjYac@dd@_AjZrEtYia|IuziCunAaY?vi@pcAdBy{~A}ryAn[`d@p{@hIb}@n_Ayw@hz@bE`i@ecArhA??hd@dXtI|NtZiC|i@}d@pPcAhf@mMbRuXfy@aL|d@xH|IsJbtA}\\\\~zAcIxs@uIrFjFtnAys@hfAqV~t@wc@ol@_I{r@gs@|a@wWc{AoXt@sL`w@`I}@wZg_@oPm{@qC{HySxLoa@kXu_@VkQb{AiSnc@Rre@g\\\\|n@zHjnA}Tk@iKfUcZxp@_BdDkRsNuK|f@kb@x_A`E~QeBxNfMhVqA??jN_g@tMwSaKyDmq@bAiWsL~PuOdi@_JwBiJlXkJbf@}g@kL{ObEi\\\\b|@{Mv_@lFzGoNx`AuNbS{c@hDi]b]mMyYyRpQiy@ok@_c@lH{I??afAqa@n`Aw\\\\??ydCwnAay@cc@oV{^n{Ayi@qXug@hw@qm@ci@qt@tgAcfAsx@cn@t~Auh@cHwj@oq@wDiiBaX??o_AwTseBxd@ejDzMckFteA_o@t\\\\cCph@jdAz_@`eBrO~uGon@|l@|F}dBxl@_C~[aCz~@moA`R{o@dOaGi]rd@yYwf@uVavCze@us@eN`i@yl@spCe|@ux@pBky@zTkc@}i@bs@gd@s]md@|l@we@ymD`Sub@~a@bnAtFMxa@ep@jTq_BqLiNyf@qaCy\\\\ayEst@en@`Br|@|d@olAnEyk@kTctBu@y{A}XefAtd@afAmh@n`Aec@o_@sSswD|QouAnRoaFlfAyh@w_@p~@_`@x@gLhjAeEsSs\\\\l`@wo@z@_SirBsw@_h@ww@om@iKodDnO_Lva@fz@tq@{e@|RcStj@dMrtA}cAhe@xYvh@lyBvwAmfAdH{WoUwcA_OsO}]au@w\\\\lc@qb@e\\\\gh@jcAcD~Mya@{p@w}@dpA}q@{nBci@nMmk@e^m@{_@ra@tWh{@{aAlJn[al@sgBqWu`CiBorBrb@pv@as@fEqaAukBsKiuCvAmfCeGvq@u_@igA_h@yfAw@oxB_^adDiGyScPccDyDcr@`MikCg`@yqB`@eP_Zwz@sYqrCsXejBfSbtAlNqlCpH{Oz]cx@eNuuDX}kCn]cq@jVpNn_@bdAnQfcDta@|m@pQolAvGm{AvNiw@yJ{^bg@mZgO}bB{HogEhIgNf\\\\idGhHqBwn@scC|IwbBI}cBz_@y[~f@~c@dYomAdp@iaBjXi{@q`AgcBb[oiByO_xBdR_m@oPgeBvGbl@_y@oqAaZosPpg@et@bd@sbDvn@k{FyJm{BfI_s@zXpFtl@_lAxPsrAyKymBs@_uBfKouB}E{kBpv@mlA_Spq@}f@yZwZmfEnP_aCwBwrDx\\\\ovAfZ?~wFLJjoAlZ~oAqCkw@f`@ed@nr@{[xOgFzXbOpOnsBsLtmD`n@pv@fFr~A|j@tyAje@~Uj[lxAgj@xaD`p@l[eVd{@vYrrAqGbSbh@~iAn{@gAfXefA~LjG~yA~x@hAxYfs@_Y|YflB|^tThfAd|AfNvQn~@`yAfy@bVaj@vYezAza@{iC_]uuAws@id@gBe\\\\c`B_MunBumAqjBg_AkoB{p@gq@cwA~jAhDnd@lr@p}CtcAdr@{kAh`DfTl{CvgBsr@he@njChOr_BlEoCel@b`BoHllAv]b~DwIplEnQniE~xBnnFjrCoaBzFu]df@w{@zL_g@g^qcA`CeyAvcAcAdt@zo@l}@fDriAd[|bBd}AlyA|Sfj@zsAvgAdsAdgAjg@|c@frAtc@lf@Xff@m]zrAvl@vHxS??????vG}I??Jw^}^u@_H{hAnOot@st@aU{jA`Jai@y{@kTmcAiW{Uy_@gw@ffBlQdu@rW~}AAhXwy@~hAmk@xkB}RbVg|@vTke@lV{Yre@a~@zu@_Vp|AsQxqAt@tlAhJrr@`^ia@zMWna@va@~Rlw@haAQnZ`wAnf@~iAsVpiAfDv_@}Snd@wEnzA~j@hqAjIlx@nNvmAeI|x@R|d@}^d|@_]r}@gG`nAdG`z@pJxwAiY|Jym@nhAaOtw@iF`eAyXt_Av_AkXxc@v{@nj@jyAuNj}@gAvh@g\\\\f`A[hu@eR`~Aj\\\\fvBxt@|`AzIlWbDd`@ge@noAjGpYoYvj@cK`]cc@na@gJxxA`ObuA_c@f`@t_@tjCu}CvnAio@{UsRr{C~y@|z@pBeDca@hoAiTf`AfNtRy_AhoBmLdw@|Xj{C`Vn]lNzhFvTt[hTcl@xi@~z@fOuJ~O|z@n]gdB|i@tNr\\\\vvAuAdQpQ|nAm_@`bBf@haAjY~hAgXvhCij@r`Br@``C~bAvFrl@h_Agc@xp@tcAgQvKbc@jn@at@ji@km@w@{f@vh@jEd_@cdvDag}CefCaMmxBl^}nCl{@lNdw@jgCxF`mDaQvfB{V~n@yk@ftAiKkzgEazyCk}Cnb@pQjXh_JbWeqBaqAir@_F}cnGqusCadDvA{`Fb`@bp@lm@jeFw@tfBxMxzBug@s`@}i@{n`HcdrC{{CjOfgAtW|bBqDbsBuW}MgSmdpGshnCiz@uWcmAyDywA|VqFlOv}ALb_C_F}qvA{k|C_yBkJ}}AWyKxO{b@}M}y@iIu{AtLdWpHzrAfGfw@tCtGhI`hAhItbAyMqb@oRukk@obiB|qB\\\\|kAaFeMoZguAgSo`A|IsZzHtEbPgogBk`oCstCyu@zOk[yjC_`@imEeg@_oEuJajBeVsxBcGmj@tW|h@lRn|E~]x}Dx\\\\daEnz@b|A~{@~`Bb{@wKzr@qvBhr@|c@lDfkEcGpOwZbpBwObHw`@{~@kLbAca@_{Bit@ecvGq{gBsTf{@r@n|@yX`~@{}@vmBn{AuSle@hyA{{@`_Av@tj@hn@ud@~g@jo@pJms@}E{{@bFmbAoMgn@wAqrArc@m|@qDmtAwx@w[xW}[yZyG~stIkgbCjDze@ci@nNnMkl@uhDhHiyBny@||@fZleBlEp@`|@~W~Kpy@{@rn@wTbrAgQ|LcZn~@eI`fA`G|`@yTqLgVziAxMe[l\\\\lb@nY?_xFcxCvn@j_|IymiCrpAxB?wi@_GsA_t@BkyA|PjDnGwh`AgxxAmOoNmk@lLcSlAcGjKmHz@OlDq]`Nw~@wBdKhUlcAxIxsAdc@xa@wKyLk\\\\hcAgQaJ_Kyz@ySelz@|eAyWfb@rBvc@~P|F??f`@cCbRrb@|d@}CwDea@sGyCiAed@}PmPeNjEr|Oo_u@AdCd@`KDt}AblEgB_Az~Cpy@rDhNb_@{JfyAvsFKrLxSuAkYa@@wkC_DoFoUsXa[sSiuA{uAmbAk\\\\ymAqRqCiSuo@ss@wEsUbGk[?cSeMse@aAl@m`@wgcAyix@qdA~H_ZgR_NoUun@uGgI}SuSsIh}@m}@e|Bk^{JmHijA|Oc|Avj@eoDt|BgsB~Cuv@~DqNx\\\\ek@s@oWzt@w]hMuI|Tqi@fYyBxXfExS}F~S}PnPkGnSiHhN{QlKkPmC{JzVkAlM}Vh~@{zDn^qKeLu[fk@th@~{BnzDn}@dsD|Vjy@b[vk@r`Ad\\\\lIrNyS|VbBl{@gElJgEbgAl@|OrDtXgOpOv]kEhYlZ|R`GuYzQyQxC}Wh_@kUh`@ms@rP{q@dj@aj@zZgIlh@qz@dFmj@sAad@xb@gdAh\\\\mWv`@{KpSyb@kBeMhPk_@fQ}LlWom@`e@mq@z^{i@b^FwHga@wA{Tm~n@iaOpn@iZtT_Q~BmRcI_YDoX~b@af@bFwYWeN|UkQTic@bLcW|TrBiE}UeOaYbF{XqSeR~KsMoOqe@q[am@{t@jC`BawFWgY{fAE?y{BgzF?oqF?{vF?eSh|@vLjJcHh_A}UriAyVjNea@bVr^rb@`m@hIrRbRdEph@|YzzAuE~W~Htt@jXp|@vd@|]vYvn@hEpXr\\\\nPlQj`AYdw@Vuo@rGg@a@c^nFmTd_@uWnFal@oFcm@~[iCfC|Lpd@fB_NfQkDnd@ha@ja@b^`l@d_@lEps@oc@rVzKlEfQd_@xJbAzKf}@?pG{K`l@eApUvIdPkDd_@mc@tIeP`l@pGdP~[bOvv@lTxJdRxEcf{@izE~u@qh@zMuYxa@fLz[cCvOnI`[qFzd@sr@`IyRtm@wWxNod@~X_Z`i@q_@PiSfa@gXni@mWeRyEmTyJcOwv@eP_\\\\al@qGuIdPe_@lc@ePjDqUwIal@dAqGzKg}@?cA{Ke_@yJmEgQsV{Kqs@nc@e_@mEc^al@ia@ka@jDod@~MgQqd@gBgC}L_\\\\hCnFbm@oF`l@e_@tWoFlT`@b^sGf@Wto@hHbRd`@n@hTrb@ke@nCu^l]}I~Wq[nM}c@~bAji@dh@le@hd@le@v[~j@Chq@rMtf@_Mrs_@upYvXuo@d^gUoZyJg]}j@{Ma_@kTaSa^lDo]sL}a@Uy\\\\jQoh@pOyd@|l@gh@|i@{Aze@iKxb@mVpPiDbWzAnR~GnBba@}CtC~EvLj@|k@gNb]SnrBsAxO~EtS_A``@dIhI{n@}w@h@_NwGeJQeVmMyYfLcZ`@aZ_MrKaQrSnIjRGtWkNxR^bMvMms{HdnSoPlTtj@KvVme@id@bN_xzH~vQlHnJhm@cu@~Kkd@gT?oU~p@gdyH`hRhWj@je@iE`LsH}ByWgh@xHkSbLoxvHftNuMxRsApK|o@oYfa@mUlVySiHkEw[~Mg|qHzuL{WjSlKpBhZgMtXuXgBmI|zXmkPm`@oZeFiPuIoLgPm@qMwJ_q@@kPjUqLfY`AdQaIhOT|UePqBb\\\\d\\\\d[z`@hBdQ|M~RxOsC~k@eXp_@o`@|IyUpomDod[kQfDoLlK{Q`IiAlGmZoFyKnCoGvEhC`X|EtMdc@]nU_EzXmKta@{BvPkL}@eHmTwNwJ}EhBkFgr~AehUJ`@FvX?~}@?r_@d[je@rj@ds@ps@JhkEeiAzVgU`Vc]`Vma@sLcU_Vm`@kSnJgKzXe[bY_^F}y@_O_cAmFav@kR_^cCiUkJqb@gAafpAdhB~c@qr@VubFsu@{eAcPuRag@e@uv@ak@mpAwAqoDqzDsj@es@e[ke@?s_@?_~@GwXKa@_Se@y[iHc`@iEq\\\\kTuVEm@hPvDhc@Ez_@dLpUrPpbA`]xdAre@xnArt@rzAjt@~dAnhAftAp}@pq@n|A`}@fy@pn@jcAtjAlM|_@{wc@itxA??{n@mO_f@xA{`@nW_F|Rce@tM{CvXmc@dQsRaMmNxFnMpImJzIlNdMsDxUk]~YxVnRnI|RwElFfIxG~[^fTtBbAuCoFmF_FgNzGJbKsJhI}AdG}HrJ{B|GyGdJlBrGvS|MnCcDkDxV}KpSwEbHsGpOwIuMwAcHk\\\\b]aWsNoZtUD??aWqVxRyPxniBooCxb@gLn\\\\jEdXoDfE`QmIlKrDvK|`@cDde@iu@dGgb@`SCtZkl@qJg_@jBwM}d@iO_Iew@{iAnKuEgJqq@oCebAvOp_@vt@}Cvi@qW`d@|IzYnDr[{`k@{z~AhPhOdKdXjLjE|aA_RlSxBtMtMj\\\\xFvE_Cl]vHxWx@~CpKns@tF`VyEv^_OfEuT_D}F{GwLuZ`@iTmEw@yD}J_BaCgMkMuAuHgJsQAqBvBuXoGo^dU}c@kLo\\\\jE_l@yG{}YyyyAsr@xCq^eMuu@q@{JoIqITcK`Tvp@rO`EfXvTjEGnPpWg@fTeIlJpIpj@cA}LuD~MsYepTo}qBqZ_c@_s@{i@uSohA|f@s^xB_rAqg@sy@_}@`@wTwWvUkT_`B}vAq}@gdAgh@ok@_{@DqOwa@ytB~HcHch@ye@qAirAp]o`Bpi@u@f_BaThWnjBtPp{@rj@wHfe@lbBfq@twBxt@nl@~vAmk@~j@yz@ta@lx@neA~_ArMxV|gBnb@py@xjAaEjb@pp@jgAzAzRaz@hs@}eAos}@zes@vKvZpc@vEhd@{`@PsTaPmV{DgQaQmCq^lJgH`[owdAi{~@d@MmGoH\\\\qXiNga@ca@qVfIoWb[eBxDyn@iNwXwOuLuOuLkB{a@oSdKycAkPg`@vJmr@E{fAmVu`@`@cfAwH`_@~e@da@lN{Dtl@rVpjAjiC~_AjyBraA{pm@wfe@aB`wFzt@kCp[`m@nOpe@_LrMpSdRcFzXdO`YhE|U}TsBcLbWUhc@}UjQVdNpf@rIt^hXdl@dcAxy@|[j{@{BrPvDeE~Tp_@zTpYjWtmA|VrNeMhIe@pJ`Otr@tCyH}OtRaj@xG{XfZsIzc@mc@qLo\\\\o[fEsPmC}a@R~`@yw@gAqh@dCmh@xW_g@gEm\\\\bg@m@Egg@`YcV_ZiqAwnA}y@gBipAcWy}BqL}Y~XkT^{RjViOjNc`Bc~@ea@gxFtvBgw@inT~Fz_@cRlQuT|TkAr]qKzKxApnCkNbj@hq@hL|L}TtOsf@|Cc^yLgw@tNyU|Dgp@Ckl@bYg_@sCoReolEa{Zry@_HxoA|J~f@~r@yMljAbw@u[lt@d@cHcp@~u@J|CvcAv`@hzAhSdv@gCfl@wg@|@kX`x@eJ`u@{a@xb@{d@fFk_@l_@lStXfh@nFzCc_@~q@kZzIdJtW_WtI}]f`@ib@f]s\\\\fItc@zJua@yE_f@mQ}z@g]g_Aia@gy@lW_x@_@_\\\\bF}a@th@sp@|Mk^qToJ{Uku@pXgh@tf@sl@d]yu@kYkJo[qbAck@yAmc@cZyb@mMaZhRqBpd@gi@xAjNz`Ao@`w@{`Aid@uQ~Isc@y@qKwTgn@hCqn@vq@{Bt|@sq@nu@xAzs@kncCqpgAcb@g~@nLqm@zl@{MeOoZes@|Aw\\\\qa@yRcg@srAoM`L~[}GhPyXq@zUfR~bAmI|D~b@wbAyCglAhScuBoH{Nxx@qSiE}d@fMdAhWkHrb@l_AC`j@qC|e@|ZvZfEvTbLvWoSyDos@|Q}AyEcRx`@eM|YvTpEdXrHdHjd@i@dSr[`TaKdl@`SkpeBmrpAsZyS}eA_Lgi@nPwj@~o@a_@aBoeAYfIo^mt@qTss@ic@esA``@uEzp@}VxKqbA{A_ThJu]l_AofAdj@wg@l\\\\k`Ap]crAvYt@fe@zQ}@l\\\\uOxHfUts@`KnK~p@db@~Qhp@lH`Lh[bn@hGv~@uVnDss@pm@eAlfAkv@|p@yEbdAu^lk@wDlZrJvh@y@nk@vb@zu@`KrJek@aHk`Avo@eTaOwi@nh@uByLus@}y@jN}u@_Spl@od@zPwb@hq@|NjExl@qasFxjPiFwMyt@aMsj@cAoRyFuVvF~U|Ob`AjZhs@|Pd@}Q~mwBo_T}b@cGcLdAnApm@ds@zEfJsDcQePsoQgez@rYeoBpe@eXPcN`r@gd@pDan@qe@{a@uMqr@zHqz@uKa_@acAgXwj@nFx@r^_t@_VmC~Jf^r]L|[uTnNfG`u@bh@l^{J`a@i_@`@wNv\\\\wVvHpB~n@l]|PfR`S|i@`WuEzXlDlYimvAcrgA~\\\\nI|T{NtgAaGxYtHbfAvHt`@a@zfAlVlr@Df`@wJxcAjPnSeKjBza@tOtLvOtL~Ui[uVoVbe@jDfs@mM~i@~b@z}A~Epq@o`@jbAcAlM|Xdj@lFl{@i`@fcAb@~c@c}@tl@ua@m]so@rf@{\\\\idAwz@g_BoAgYon@cvBfGcjAog@ygAuPmfBi@alB`k@uxAbWygAsHwt@pDyhAs_@saA}Ae{@t]sI~T`Ej]om@pNsWfQxi@xPoRtfAdKhRea@bq@i_r@eupAu~@sRyt@jGmF~Vou@dSjJhNdiAlBtYhRbs@t`@tRc\\\\[{K{M_FiRcf@czlFssn@rd@dcBxYfr@|_@ws@bFim@yc@k|@_q@in@o[pQ_faAjz@qIzEsaFh~BgCfc@uxAn}@x[~kAuBlb@_g@vU{@fOdPvd@qB~Q`Cz\\\\yTbf@{Xr|@}UtL??vp@fc@hcAfWnd@_@hUvQnj@r@hOzFbjAsP~m@`DnP_tAdTc\\\\pKiPh|@sJlb@yQvf@oIzWmIbY}N??v`@wmAfc@_b@nKgc@gEo_@fJox@{X_BsUsUkWq_@kNcLPiSlLcMrBsW??_Q}FsBwc@xWgb@}ToFocAV_faAjz@j~BxCncAW|TnFhd@fRdNkEQcn@oM{VoBcq@cLa\\\\}Vs_@_WqOaSeU`XoGyBahA??wXaPuf@~Liq@sM_k@Bme@w[s\\\\jj@iFj^oZvfAvUpl@v]jh@zPhXsa}@kwdBiVpAyNgM_RdBy_AaE}f@jb@rNtKeDjRyp@~AgUbZj@hKknA|T}n@{Hse@f\\\\oc@Sc{AhSWjQjXt_@yLna@zHxSl{@pCf_@nP|@vZ|p@~Cph@dSny@hBzt@hVeBl`@lH{@bGkKbSmAlk@mLlOnNpGyEd`BwNhCiVzx@tFdVla@lo@dm@h[wIj\\\\`IzZoJuNyE}ImTcP}RlCeJaL_DeEtGyc@x@qOsCtJiEmCiHxT}N`HcYvUeIoCeTf[yOtXkA`m@mRph@dE|MdHjY?tNrMbm@~DjTpH~[gN`g@Gte@{E|YjLjCwOta@_PeKeXiPiOsLtBbOc[yw@_s@_^gFuEoPl^qu@{\\\\mAga@}Omo@m@c~@|CwdA~Mgp@f@oV~GmV{IkOrMkw@_B{W~D_Cm^iRuLppoBn_z@qg@sEu}@ho@eVy@k_A`g@_p@na@cc@pi@pZr\\\\iPjb@~Yhf@reAva@bm@oKx`@tExx@{Yji@`A`e@sa@yCkg@qL{LPg}@uOg_An|nFou~AopD?qxD?m|@?o}D?kwD?ozD?szD?ksE?ytEAk`C@E_WcTIcJha@mRpIsj@zBy~@|Hs{@jRsq@cG{kAfOmSS}v@uPsy@tUc|@dWsq@xSoo@~RaElOuMbExBdEwO|@eKmEcBxMqKzHeP?cHrFtFbJc`Ah\\\\iLvw@oKhu@fQ|c@j\\\\ja@vLzTj@nE_F|GgTzHuN?qgAk`@m_AyHwpAc^e@iErDaRbIgKg[}Hk|@Gkx@?_SiWyF{CaaA_l@e[oJ}}AMerBAgEmN_ScBqYuHeUm[aRso@un@en@wSlO}h@sIwZ`Q@dtA{g@hb@wInSvaAh]d_ApT~`AnQ``@bd@rI`MRb`@sSb`@}Xp@pEyUwQzL~CzPdi@bI~\\\\e@fm@zIdZbBhc@`Bbs@bQyzAwJoQxJnvAvQxf@B{@uF`RhPmQzAnL|k@nl@`o@rC_OvLgBnSuN_Lt`@oNbJ]rV~RfWdb@|p@tDoAiRoi@|^{VhF}r@`K~YkLtf@hh@yH_j@bSuAnz@}PhCoErTyGn}@vf@jm@t_ApQ`h@tc@d^~Bt^|U|G~SpcApg@fb@v\\\\l\\\\`d@rHjk@_Jjj@{Snt@wZfk@K~Yq\\\\ngA|@bi@vAhWpNde@tQzFv]qFzHmZvVkMb`@wt@`\\\\yn@jHmWyKoh@nPka@vo@is@jWqH`~@j[dJcBh]e\\\\df@mNreAzFnv@}Ern@hCzXvHgJrO^hXgLjKzJdGdVeHnVzJhl@_Atm@_`@nu@xFll@oMze@jCrs@rMzw@hm@b}@~Yba@x\\\\jMb[Rbj@cB~\\\\{JfTjWz@jk@wLvo@kRnPk\\\\vLwj@zc@sb@rTsc@j^yi@~j@{Wbr@d@jf@jp@zr@wQh_@{QpNka@tSs_@dd@oZ|^wRxUeUfkB?BxXpp@?h{BLpmC_k@j}Ak]{DgKjnAxE`fAxCnI}^ng@}b@d\\\\oFxE}P`b@cBjU{O`y@eE|NcIpFga@t{@y}@~r@{uAeAmMpZuSjo@ks@rG}q@h`@ca@uLyr@dAst@|R{n@mW{y@qFww@sFuw@hJ{rAvRmt@dQ_\\\\qFgKkyAfTi`@~y@mNoO~Hgr@ronH_ff@aJlDeIjG}NzTn@nBlWhL~RxHbHlIpN}Gy@oPhIwUaB}E{IeIhCiKsByDwCb@vtoHwpg@dDnF|SnCxIeLdFaDP}BcEiDgU|DjdqHqjh@|@vEn`@y@uCsFpssHili@eD~BaQtSjBrBnCYvTeA|FeMlAoAjgvHmkj@i@pMlFdE`TkJgBqCqHcEfcdI_}tBsp@rD}D~Vje@vH|g@uJ|d@_PxgjHafpBoh@fCoYjR`u@t\\\\l}@xV|^cOtHg\\\\ww@gUrjrG_dgC??J~fFJzbJq|@x@{{@hPsj@jZqv@`h@w{@}a@w}@gSe`@h_@ci@rXex@d[cf@xk@{~@hfAgiBvf@w@lf@va@b]????ja@oV`v@}RtPou@poAqq@t`@_z@~z@aCjbBo@fhA_Qf`C{_Axz@{JhlBgUpuAhD|yBw[fiAsYjdAfL{Klj@pa@~BhgA~K~u@bTfdAfL|Gyc@a[i|@maAgRbPsNtnAxa@ri@ph@`yAnk@ul@h]~y@|k@dbAbYp}@`RnNtZp`Bf_@vRj\\\\bhAtY|i@yChy@lPl~@hT|r@zShjBzPvHoIkcAe\\\\c|@iRsaAea@olAaFy]sXuuAmd@}LoKcm@aUyIkn@w^}c@`gA|QbSwIz`@vUxg@u^xOjUjVc^n}@~Wje@AjDed@iJ}Ufg@gUfpA~Jvs@i\\\\vi@_NHmb@bo@sYeW}b@}q@{a@gUa_@sq@qC{i@~Hkq@e]ml@jDqn@kRpJq[~a@gJgm@cWje@VhaArL`RvLfp@wLlwA~EnzA_NfYcXbnAic@{vAcYkjCq]kr@?nGf^}bCmAvq@we@zkAwVlk@g^|z@uYztAwR}a@w_@{mBaA{mAm[{Mm]{~@u\\\\{{@eFouBwZmx@dCe_Bi`@q}AbLgl@f[wZcKshBvBvBjMs~ArIw~@gEubCvRewBzDco@bGerAeIw}AxQflnImq{Bse@|J}e@mEoq@nOc}@hGdDxEhn@fLrn@qLvVkJbv@rBzMoD_ilBytoAlAmeF{_D}c@uJlD{_Bvk@cr@rVuz@jw@ihAcHejB{CyiArl@tCt}@o]LuKfr@onA~@cPr\\\\gVMkZuk@mqAqj@yb@qJqQbEls@ng@cm@nVok@qNaiA|_@~nA~k@pn@cExXp@|GiPaL_\\\\rrAnMxRbg@v\\\\pa@ds@}AdOnZ{l@zMoLpm@bb@f~@bn@eLxa@Mu@ge@brAwYj`Aq]vg@m\\\\nfAej@t]m_A~SiJpbAzA|VyKtE{p@dsAa`@rs@hc@lt@pTgIn^zruB_dIiGrPzUzVzdAjV~k@tH~PvMtp@sNhm@}FtJvD_[dOpAzh@uGjf@}s@jDkBbLrk@xPfFlYvXfInm@rM`KbRro@`Cja@a`@`Rk}@rOyTtUyLu^a^dA_MvPqQpKqh@{Cyk@}L_TiJs`@bUwIrb@bF~k@kBfXtE~j@wt@hc@_GjoA~DzMwTjNgDfAaLmFcV|CcXvLwL`Gw[f_@eCiPqc@uFqk@cQgVeW}P{Ng^cg@mIv@vMtc@hFkSj[Vt_@pZfc@sVrp@}YaCaMel@jR_UdBin@{lAkXtGo\\\\}TuRmUzj@yj@`@sg@xa@mAtScw@PwaAmEyb@~Zyn@vFab@qRUuNmlAyB{iA[`t@nQiTn\\\\_q@tCkn@v]_I`q@q_@m@oWvMpp@tc@lDxUkTdVnNtJle@`Ig@z[|OdP{wjEmnScu@cXs`AqClZ{d@_hBao@wF}iAnMsh@kJo}@vNek@hn@mj@jf@av@|r@{hAziAkd@{PoU_g@kOfWou@|kAO`[ww@pc@kp@q`@gN{p@Hw{@eFgt@i`@c]lVcx@lJzH~b@w\\\\jX}}@fOlrAlt@`s@`z@vLjj@yn@z`Amy@tpAuw@pe@_e@dq@s[trBlG|lBbs@dh@pfAfg@~q@`s@|lAdy@tUag@qPii@areIf`^gf@zb@rSfG|SkZqwdIhr]|GgPh@}n@}\\\\fRcIjq@xOyF_qdBobd@{o@bfBmStj@fl@xO`KvZn@hTd}@jYzbBb\\\\~v@bk@nZlBvQuBpc@|Xxf@~Jls@fBxNpBtLnOjOpCrHzN|]k@~RnGfj@eBfOoc@w@ea@dImQfKem@|PuXoKaBlEq[sFaKxAgZmZ}RjEiYqOw]uXfO}OsDcgAm@mJfEm{@fE}VcBsNxSe\\\\mIwk@s`Aky@c[q|^`yv@}\\\\}]uWbPoIvYa[nCif@xJq`@qCyv@}^AyeF{OjHad@jz@xD`e@_M~Twk@kEg^}Zs\\\\yQgN}\\\\o]mMkYpFy\\\\nP{q@bB_g@qMiEoR_J}\\\\_a@_DwQmVySuh@cw@sm@mwAam@mXTg]rIaToFe`@fE}\\\\|vAiOjk@dJtdAkDlUp^mJ`QlCzDfQ`PlVQrTid@z`@qc@wEwKwZkn@NrNnl@jF|r@dOd[ri@p^dK`HnYv^lPb_@lb@vk@reAn_Abk@nd@dn@l[j`AfWx^fB`GjP~d@gH|]zJvbAaKzd@rFzXgBl_AtWjt@zHre@rVl[n@lYgUbTe@zY{Z~AtGhGyOKuc@hS{h@eSkJr@}n@|g@oy@l^}s@@Ecrw@vpw@fZgRf\\\\tKx`@nWj`@pf@{m@`o@kUeEoJ_Sya@wHsIkSeRm]g`{@fhOcY|N{WlIwf@nImb@xQo\\\\zZ}N`t@tI|OpKrq@_Kxr@rRvT~Q`y@{_@dOt|Dnr@}Dnk@hn@pGrb@zWpFtTjUzCju@lr@ra@lg@`Tl@hSeFzdAyEfJuCLeDtWcMng@qBdr@dMxg@af@bi@cr@{A{eEcaCXhDqTiHmV~Ii\\\\cFi]rEkRqTp@sBlRg\\\\o@uf@vD{Sj[aq@tGee@uRaMv_@{n@tGaVtYsXja@{n@NfDkbAbPjJvj@iWzOcJwFw}@cJ_iA~LqZyP{f@wOoF}rAqIm|{@vmj@d`@gE`TnFf]sIlXUxf@g[jo@qHjQsf@BaUvYuEveAucAtRec@pKcJ`W}p@{dAxEiSdFaTm@sa@mg@ku@mr@kU{CqFuTsb@{Win@qGaChVcs@g@}[dLoLlNw\\\\pCo_@`SCbnAdKhj@tAtm@aIpQ`Fvc@lHtDnO`l@\"\n", "/**\n * The vendored boundaries, decoded once and held.\n *\n * The generated module beside it is a string and a table of ring sizes; this\n * turns them into flat coordinate arrays and memoises the result, so a document\n * with a globe pays for the decode once per process and a document without one\n * never pays at all. That laziness is the whole reason the data can be a plain\n * static import rather than something threaded through a resolver: the 40 KB is\n * transferred either way, but nothing is parsed, allocated or walked until a\n * globe actually draws.\n *\n * Coordinates stay in **degrees**, not pixels and not sphere positions. The\n * texture resolution is a prop and the projection is `projection.ts`'s business;\n * baking either into the data would mean re-vendoring to change a number.\n */\n\nimport { COUNTRIES, POINTS, PRECISION, type CountryRow } from \"./data/ne-110m\"\n\n/**\n * One closed ring, as `[lon, lat, lon, lat, …]` degrees.\n *\n * Flat rather than an array of pairs for the reason the Protein's structure is\n * flat: the map is redrawn whenever its style changes and a pair object per\n * vertex would put ten thousand allocations behind every colour edit.\n */\nexport interface Ring {\n points: Float64Array\n /**\n * Whether this ring cuts rather than fills.\n *\n * It is drawn either way — the nonzero fill rule does the cutting, off the\n * winding the vendoring script enforced. This is here so a caller that wants\n * to *outline* only the coastlines can skip it.\n */\n hole: boolean\n}\n\nexport interface Country {\n id: string\n name: string\n rings: Ring[]\n}\n\nexport interface World {\n countries: readonly Country[]\n /** Every ring of every country, in one list — the order the map draws in. */\n rings: readonly Ring[]\n}\n\nlet decoded: World | null = null\n\n/** The world, decoded on first use and shared thereafter. */\nexport function world(): World {\n return (decoded ??= decode())\n}\n\nfunction decode(): World {\n const countries: Country[] = []\n const rings: Ring[] = []\n\n const cursor = { at: 0 }\n for (const row of COUNTRIES as readonly CountryRow[]) {\n const own: Ring[] = []\n for (const size of row.rings) {\n const ring = { points: readRing(cursor, Math.abs(size)), hole: size < 0 }\n own.push(ring)\n rings.push(ring)\n }\n countries.push({ id: row.id, name: row.name, rings: own })\n }\n\n // A short read leaves the tail unconsumed and every ring after the mistake\n // shifted, which draws as a plausible-looking but wrong world rather than as\n // an error — so the two halves of the generated file are checked against each\n // other here, once, where the cost is nothing.\n if (cursor.at !== POINTS.length) {\n throw new Error(\n `globe: boundary data is inconsistent — decoded ${cursor.at} of ${POINTS.length} characters`\n )\n }\n\n return { countries, rings }\n}\n\n/** `count` points, delta-decoded from the ring's own origin. */\nfunction readRing(cursor: { at: number }, count: number): Float64Array {\n const points = new Float64Array(count * 2)\n let lon = 0\n let lat = 0\n for (let i = 0; i < count; i++) {\n lon += readValue(cursor)\n lat += readValue(cursor)\n points[i * 2] = lon / PRECISION\n points[i * 2 + 1] = lat / PRECISION\n }\n return points\n}\n\n/** One zig-zagged varint. The inverse of the script's `encodeValue`. */\nfunction readValue(cursor: { at: number }): number {\n let shift = 0\n let result = 0\n for (;;) {\n const byte = POINTS.charCodeAt(cursor.at++) - 63\n result |= (byte & 0x1f) << shift\n // The continuation bit: set on every chunk but the last.\n if (byte < 0x20) break\n shift += 5\n }\n return result & 1 ? ~(result >> 1) : result >> 1\n}\n", "import { world } from \"./world\"\n\n/**\n * Every boundary line on the map, each drawn **once**.\n *\n * ## The defect this exists to fix\n *\n * Country rings are stored per country, so a border between two of them appears\n * in both — and stroking each country's own path draws that line twice. The\n * claim that this is harmless with an opaque colour is *wrong*, and visibly so:\n * a stroke is antialiased, so the fringe pixels either side get composited\n * twice. Coverage `a` blended over itself is `2a - a²`, which turns a half-lit\n * edge pixel into a three-quarters-lit one — and the eye reads that as a bolder,\n * wider line. Internal borders came out looking about twice the weight of\n * coastlines, which are stroked once because their other side is ocean.\n *\n * ## Dedupe by segment, then stitch\n *\n * Natural Earth's neighbours share their vertices *exactly* — measured on the\n * vendored data: of 10,360 segments, 2,658 appear in precisely two rings and\n * 5,020 in one — so a segment appearing twice is a shared border and one\n * appearing once is a coast. That makes the dedupe an equality test rather than\n * a geometric tolerance, which is the only reason this is a small function\n * instead of a topology library.\n *\n * The unique segments are then stitched back into polylines rather than drawn as\n * ten thousand two-point lines: a run of separate segments has a cap at every\n * vertex instead of a join, which on a 1.5px stroke reads as a dotted, lumpy\n * coastline.\n *\n * ## What the caller must do with them\n *\n * Draw them **instead of** stroking the country paths, not as well. The country\n * paths are then fill-only, and every line on the map — coast or border — is one\n * stroke of the same weight.\n */\n\n/** One boundary run, as flat `[lon, lat, lon, lat, …]` degrees. */\nexport type BorderLine = Float64Array\n\nlet lines: BorderLine[] | null = null\n\n/** The boundary lines, computed on first use and shared thereafter. */\nexport function borderLines(): BorderLine[] {\n return (lines ??= build())\n}\n\n/**\n * A vertex's identity.\n *\n * The integer form, not the degrees: the decoder divides stored integers by the\n * quantum, so two rings that share a vertex hold bit-identical doubles — but\n * keying on the integer says that out loud rather than resting on it, and is a\n * cheaper string besides.\n */\nfunction nodeKey(lon: number, lat: number): number {\n // Packed into one number rather than a string: 20,000 keys built per pass,\n // and a numeric Map key skips the hashing a template literal costs.\n return Math.round(lon * 1000) * 1_000_000 + Math.round(lat * 1000)\n}\n\ninterface Segment {\n a: number\n b: number\n /** Endpoint coordinates, kept so a chain can be written out without a lookup. */\n ax: number\n ay: number\n bx: number\n by: number\n}\n\nfunction build(): BorderLine[] {\n // --- Collect each distinct segment once -------------------------------\n const unique = new Map<string, Segment>()\n for (const ring of world().rings) {\n const count = ring.points.length / 2\n for (let i = 0; i < count; i++) {\n const j = (i + 1) % count\n const ax = ring.points[i * 2]!\n const ay = ring.points[i * 2 + 1]!\n const bx = ring.points[j * 2]!\n const by = ring.points[j * 2 + 1]!\n const a = nodeKey(ax, ay)\n const b = nodeKey(bx, by)\n if (a === b) continue\n // Canonical, so a border walked one way by one country and the other way\n // by its neighbour collides rather than surviving as two.\n const key = a < b ? `${a}:${b}` : `${b}:${a}`\n if (!unique.has(key)) unique.set(key, { a, b, ax, ay, bx, by })\n }\n }\n\n // --- Chain them into runs ---------------------------------------------\n const segments = [...unique.values()]\n const at = new Map<number, number[]>()\n segments.forEach((segment, index) => {\n for (const node of [segment.a, segment.b]) {\n const list = at.get(node)\n if (list) list.push(index)\n else at.set(node, [index])\n }\n })\n\n const used = new Uint8Array(segments.length)\n const out: BorderLine[] = []\n\n /** The next unused segment at `node`, or −1. */\n const nextAt = (node: number): number => {\n for (const index of at.get(node) ?? []) if (!used[index]) return index\n return -1\n }\n\n for (let start = 0; start < segments.length; start++) {\n if (used[start]) continue\n\n const first = segments[start]!\n used[start] = 1\n // Grown from the middle out: forward from `b`, then the backward half is\n // reversed onto the front. A junction picks an arbitrary unused neighbour,\n // which is fine — every line is the same colour and weight, so where one run\n // ends and the next begins is not visible.\n const forward: number[] = [first.ax, first.ay, first.bx, first.by]\n let node = first.b\n for (;;) {\n const index = nextAt(node)\n if (index < 0) break\n used[index] = 1\n const segment = segments[index]!\n const far = segment.a === node ? segment.b : segment.a\n const fx = segment.a === node ? segment.bx : segment.ax\n const fy = segment.a === node ? segment.by : segment.ay\n forward.push(fx, fy)\n node = far\n }\n\n const backward: number[] = []\n node = first.a\n for (;;) {\n const index = nextAt(node)\n if (index < 0) break\n used[index] = 1\n const segment = segments[index]!\n const far = segment.a === node ? segment.b : segment.a\n const fx = segment.a === node ? segment.bx : segment.ax\n const fy = segment.a === node ? segment.by : segment.ay\n backward.push(fx, fy)\n node = far\n }\n\n if (backward.length === 0) {\n out.push(Float64Array.from(forward))\n continue\n }\n // Reverse the backward half pairwise and prepend it.\n const points = new Float64Array(backward.length + forward.length)\n let write = 0\n for (let i = backward.length - 2; i >= 0; i -= 2) {\n points[write++] = backward[i]!\n points[write++] = backward[i + 1]!\n }\n points.set(forward, write)\n out.push(points)\n }\n\n return out\n}\n", "import {\n command,\n driveCommand,\n easeInOut,\n node,\n type Command,\n type CommandArgs,\n Canvas3D,\n Geo,\n Graphics3D,\n Mat,\n Scene3D,\n property,\n type Canvas3DProps,\n type Color,\n type NodeConfig,\n type NormalizedColor,\n type SurfaceTexture3D,\n type Transform3D,\n} from \"@motionscript/core\"\n\nimport {\n lerpColor3D,\n resolveColor3D,\n snapFlag,\n snapValue,\n cameraOrbit,\n orbitProps,\n type OrbitTarget,\n} from \"@motionscript/core/component\"\nimport { atmosphereMaterial } from \"./atmosphere\"\nimport { arcSegments, drawableArcs, drawableMarkers } from \"./places\"\nimport { greatCircle, latLonToPosition } from \"./projection\"\nimport { mapHeight, worldMapGraphics, type WorldMapStyle } from \"./world-map\"\n\n/**\n * The globe's radius, in scene units.\n *\n * One, and not a prop. Every other length the node takes — a marker's size, an\n * arc's width and lift, the camera's `zoom` — is a fraction or a multiple of it,\n * which is what makes those numbers mean the same thing at any framing and is\n * why there is nothing for a radius prop to be relative *to*. The Protein's\n * radius is a prop because a molecule's size is a fact about the molecule; the\n * Earth's is a choice about units.\n */\nconst RADIUS = 1\n\n/** How far off the surface a marker's centre sits, as a fraction of its size. */\nconst MARKER_LIFT = 0.35\n\nexport interface GlobeProps extends Canvas3DProps {\n // ── The map ──\n resolution: number\n ocean: Color\n land: Color\n border: Color\n borderWidth: number\n graticule: boolean\n graticuleColor: Color\n graticuleStep: number\n graticuleWidth: number\n\n // ── The camera ──\n orbit: number\n elevation: number\n zoom: number\n fov: number\n\n // ── Lighting ──\n ambientIntensity: number\n ambientColor: Color\n keyIntensity: number\n keyColor: Color\n\n // ── The atmosphere ──\n atmosphere: boolean\n atmosphereColor: Color\n atmosphereSize: number\n atmosphereFalloff: number\n atmosphereIntensity: number\n\n // ── What is placed on it ──\n markers: string\n arcs: string\n}\n\n/** What the map cache is holding, keyed by the style that produced it. */\ninterface BakedMap {\n texture: SurfaceTexture3D\n}\n\n/**\n * A globe: country boundaries on a lit sphere, flown by an orbit camera.\n *\n * <Globe width=\"fill\" height=\"fill\" orbit={20} elevation={25} zoom={2.6} />\n *\n * Like the Protein and unlike the Canvas 3D viewport, it draws **one subject**\n * derived from its own props rather than being a room the author fills. Four\n * things about it are worth knowing before reading the parts:\n *\n * **The map is a texture, drawn in 2D.** See `world-map.ts`: a WebGL line\n * ignores any width above one pixel, so borders drawn as 3D lines are hairlines\n * forever. Baked, a border is an ordinary Skia stroke at any weight.\n *\n * **That texture is cached against its style, and the cache is not an\n * optimisation.** motion-script re-rasterizes a surface every frame unless the\n * descriptor says otherwise, and re-rasterizing this one means redrawing ten\n * thousand paths, stalling on a GPU read-back and re-uploading a few megabytes —\n * sixty times a second, for an identical image. {@link bakedMap} holds one\n * descriptor per style and marks it `static`; the schema then refuses to animate\n * any field that style is made of, so an export cannot mint a raster per frame.\n *\n * **The camera is three tweenable numbers, and two of them are places.** `orbit`\n * is a longitude and `elevation` is a latitude — see `projection.ts`, which is\n * where that convention is established and defended. There is no `OrbitControls`\n * here for the reason the other 3D nodes have none: a rendered timeline has no\n * pointer, and every frame has to be reproducible under scrubbing and export.\n *\n * **Markers and arcs are real 3D, never baked.** They are the animated content;\n * putting them in the texture would run every frame of a marker's fade through a\n * full re-rasterize.\n */\n@node({\n key: \"globe\",\n parentKey: \"node\",\n forkable: true,\n layout: {\n children: \"freeform\",\n acceptsChildren: false,\n defaultWidthMode: \"fixed\",\n defaultHeightMode: \"fixed\",\n },\n seed: {\n width: 640,\n height: 640,\n },\n})\nexport class Globe extends Canvas3D<GlobeProps> {\n // ── The map ──\n //\n // Every prop in this group is part of the texture's cache key, and every one\n // of them is `animatable: false` in the appearance schema. They are plain\n // strings rather than resolved colours for the same reason: a tween would need\n // a mapper, and there is deliberately no tween to have.\n\n /**\n * Texture width in pixels; the height is half of it.\n *\n * Structural, and capped in the schema rather than here. The buffer is\n * re-uploaded to the GPU every frame even when its pixels are cached, so this\n * is a per-frame bandwidth number as much as a sharpness one — 2048 is 8 MB a\n * frame and already finer than the 110m boundaries it draws.\n */\n @property({ default: 2048, tween: snapValue }) declare resolution: number\n\n @property({ default: \"#0b1a2b\", tween: snapValue }) declare ocean: Color\n @property({ default: \"#2c3e50\", tween: snapValue }) declare land: Color\n /**\n * The colour of every coast and border.\n *\n * Alpha works. It did not while the country paths carried the stroke — a\n * border belongs to two countries, so it was drawn twice and came out at\n * double density beside the coastlines. `borders.ts` deduplicates the lines\n * and `world-map.ts` strokes them once.\n */\n @property({ default: \"#4a6076\", tween: snapValue }) declare border: Color\n @property({ default: 1.5, tween: snapValue }) declare borderWidth: number\n\n @property({ default: true, tween: snapFlag }) declare graticule: boolean\n @property({ default: \"#ffffff20\", tween: snapValue })\n declare graticuleColor: Color\n @property({ default: 15, tween: snapValue }) declare graticuleStep: number\n @property({ default: 1, tween: snapValue }) declare graticuleWidth: number\n\n // ── The camera ──\n\n /**\n * The camera's heading, in degrees, in exactly the sense every other 3D node\n * uses it — which is what keeps the canvas drag consistent with them.\n *\n * It is *not* a longitude: a camera at heading θ is centred over longitude −θ\n * (see `orbitForLongitude` in `projection.ts`). Unbounded, like every other\n * viewport's, because the drag wraps it into `[0, 360)` and a range here would\n * clamp half of them.\n */\n @property({ default: -10 }) declare orbit: number\n /**\n * Degrees above the equator, which on a globe *is* the latitude the camera\n * stands over — no conversion, unlike the heading. Held short of the poles by\n * the schema, as every orbit camera's is.\n */\n @property({ default: 25 }) declare elevation: number\n /** Distance from the centre, as a multiple of the globe's radius. */\n @property({ default: 2.8 }) declare zoom: number\n @property({ default: 45 }) declare fov: number\n\n // ── Lighting ──\n\n @property({ default: 0.55 }) declare ambientIntensity: number\n @property({ default: \"#ffffff\", mapper: resolveColor3D, tween: lerpColor3D })\n declare ambientColor: Color\n @property({ default: 1.9 }) declare keyIntensity: number\n @property({ default: \"#ffffff\", mapper: resolveColor3D, tween: lerpColor3D })\n declare keyColor: Color\n\n // ── The atmosphere ──\n //\n // Shading rather than pixels, so unlike the map group these all animate.\n\n @property({ default: true, tween: snapFlag }) declare atmosphere: boolean\n @property({ default: \"#4da3ff\", mapper: resolveColor3D, tween: lerpColor3D })\n declare atmosphereColor: Color\n /** The shell's radius as a multiple of the globe's. */\n @property({ default: 1.06 }) declare atmosphereSize: number\n /** How tightly the glow hugs the edge. Higher is a thinner rim. */\n @property({ default: 3 }) declare atmosphereFalloff: number\n @property({ default: 1.1 }) declare atmosphereIntensity: number\n\n // ── What is placed on it ──\n //\n // Serialized lists, as the graphs store their equations: an appearance value\n // is a number, a string or a boolean, so a list arrives as a string a mapper\n // reads. Parsing is in `places.ts` and is deliberately tolerant — the field is\n // invalid far more often than valid while somebody is typing into it.\n\n @property({ default: \"[]\", tween: snapValue }) declare markers: string\n @property({ default: \"[]\", tween: snapValue }) declare arcs: string\n\n constructor(props?: NodeConfig<Globe, GlobeProps>) {\n super(props as NodeConfig<Canvas3D<GlobeProps>, GlobeProps>)\n }\n\n /**\n * Frame the scene at a spherical camera placement. Every axis is optional,\n * so \"pull back\" and \"spin round\" stay separate intentions — see\n * {@link OrbitTarget}.\n */\n @command({\n args: [\n {\n key: \"target\", kind: \"orbit\", properties: {\n orbit: { kind: \"number\", step: 1, unit: \"°\" },\n elevation: { kind: \"number\", min: -89, max: 89, step: 1, unit: \"°\" },\n zoom: { kind: \"number\", min: 0.2, max: 24, step: 0.1, unit: \"×\" },\n },\n },\n ],\n })\n orbitTo(args: CommandArgs<{ target: OrbitTarget }> & { duration: number }): Command<GlobeProps> {\n return this.to({\n data: orbitProps(args.data?.target ?? {}) as Partial<GlobeProps>,\n duration: args.duration,\n easing: args.easing ?? easeInOut(),\n })\n }\n\n /**\n * Fly the camera to a place on the globe. `latitude`/`longitude` are the\n * point to bring under the camera and `framing` the distance to settle at.\n *\n * **`arc` is what makes it a flight rather than a pan** — above `0` the\n * distance bows outward at the midpoint by that fraction, so a long journey\n * rises off the surface and settles back down rather than scraping the\n * horizon the whole way. Longitude takes the **short way round**.\n */\n @command({ args: [{ key: \"latitude\", kind: \"number\", default: 0, min: -89, max: 89, step: 1, unit: \"°\" }, { key: \"longitude\", kind: \"number\", default: 0, min: -180, max: 180, step: 1, unit: \"°\" }, { key: \"framing\", kind: \"number\", default: 2.2, min: 1.05, max: 12, step: 0.1, unit: \"×\" }, { key: \"arc\", kind: \"number\", default: 0.35, min: 0, max: 3, step: 0.05, scale: 100, unit: \"%\" }] })\n flyTo(args: CommandArgs<{ latitude: number; longitude: number; framing?: number; arc?: number }> & { duration?: number }): Command<GlobeProps> {\n const data = args.data ?? { latitude: 0, longitude: 0 }\n const { latitude, longitude, framing = 2.2, arc = 0.35 } = data\n const duration = args.duration ?? 1.6\n const easing = args.easing ?? easeInOut()\n\n const fromOrbit = this.orbit\n const fromElevation = this.elevation\n const fromZoom = this.zoom\n\n // The globe spins under a fixed camera, so a longitude is reached by\n // orbiting to its negation — and the shortest signed turn is what keeps a\n // crossing of the antimeridian from unwinding the long way.\n const toOrbit = fromOrbit + shortestTurn(fromOrbit, -longitude)\n\n return driveCommand(duration, (t) => {\n const eased = easing(t)\n this.set({\n orbit: fromOrbit + (toOrbit - fromOrbit) * eased,\n elevation: fromElevation + (latitude - fromElevation) * eased,\n // The bow: a half-sine that is 0 at both ends, so the command still\n // lands exactly on `framing` however large `arc` is.\n zoom: (fromZoom + (framing - fromZoom) * eased) * (1 + arc * Math.sin(Math.PI * eased)),\n } as Partial<GlobeProps>)\n }) as Command<GlobeProps>\n }\n\n protected override buildScene3D(): Scene3D {\n const scene = new Scene3D()\n const distance = RADIUS * Math.max(1.02, this.zoom)\n\n // Cut to the globe rather than left to the camera's own derivation from the\n // scene bounds: the atmosphere shell is the outermost thing in the scene and\n // sizing the planes to it would spend depth precision on the halo. The near\n // plane has to survive `zoom` coming right down to the surface, which is\n // what the fraction of the gap is for.\n scene.perspective({\n fov: this.fov,\n near: Math.max(0.01, (distance - RADIUS) * 0.5),\n far: distance + RADIUS * 4,\n // Exactly what every other 3D viewport does — the quarter turn between\n // the stored zero and the camera's, and nothing else. Anything extra here\n // is a globe whose canvas drag runs backwards against every other node's;\n // the longitude convention is handled in the *geometry* instead. See\n // `projection.ts`.\n orbit: cameraOrbit(this.orbit),\n elevation: this.elevation,\n distance,\n })\n\n // The same rig the Protein and the 3D viewport use, at the globe's scale: a\n // key, a rim that is the key from the other side at a fraction of its\n // strength, and enough ambient that the night side is a planet rather than a\n // silhouette. The backdrop is the node's own Fills stack — a `Canvas3D`\n // composites its 3D pass over its 2D fill layers — so there is no space to\n // paint here and no clear colour to set.\n scene\n .light({\n type: \"ambient\",\n intensity: this.ambientIntensity,\n color: this.ambientColor,\n })\n .light(\n { type: \"directional\", intensity: this.keyIntensity, color: this.keyColor },\n { position: [RADIUS * 3, RADIUS * 2, RADIUS * 3] }\n )\n .light(\n {\n type: \"directional\",\n intensity: this.keyIntensity * 0.35,\n color: this.keyColor,\n },\n { position: [-RADIUS * 3, -RADIUS, -RADIUS * 2] }\n )\n\n const g3 = new Graphics3D()\n this.addPlanet(g3)\n this.addArcs(g3)\n this.addMarkers(g3)\n if (this.atmosphere) this.addAtmosphere(g3)\n\n scene.draw(g3)\n return scene\n }\n\n /** The sphere, wearing the baked map. */\n private addPlanet(g3: Graphics3D): void {\n g3.sphere({\n radius: RADIUS,\n // Longitude segments matter more than latitude: the silhouette is a\n // circle of longitude, and a coarse one shows as a faceted rim against\n // the atmosphere's own smooth curve.\n segments: [128, 64],\n fill: this.bakedMap().texture,\n // Land and sea are matte at this distance; a specular highlight on an\n // ocean this size reads as a lens flare rather than as water.\n roughness: 0.95,\n metalness: 0,\n })\n }\n\n /** The halo. A shell, kept for its back faces — see `atmosphere.ts`. */\n private addAtmosphere(g3: Graphics3D): void {\n g3.sphere({\n radius: RADIUS * Math.max(1.001, this.atmosphereSize),\n segments: [96, 48],\n material: atmosphereMaterial(\n this.atmosphereColor as unknown as NormalizedColor,\n this.atmosphereFalloff,\n this.atmosphereIntensity\n ),\n })\n }\n\n /**\n * The markers, as one instanced draw.\n *\n * Instanced rather than a mesh apiece because a marker list is the one thing\n * here with no ceiling — a network map is thousands of points, and a draw call\n * each would not keep up. One geometry, one material, one upload.\n *\n * Note the material carries **no** `vertexColors`: an instanced mesh that asks\n * for it makes the shader read a per-vertex `color` attribute the geometry does\n * not have, gets zeroes, and every marker renders black. The per-instance\n * colours ride the `colors` option instead, which is a different channel.\n */\n private addMarkers(g3: Graphics3D): void {\n const markers = drawableMarkers(this.markers)\n if (markers.length === 0) return\n\n const placements: Transform3D[] = []\n const colors: Color[] = []\n\n for (const marker of markers) {\n const size = marker.size * RADIUS\n placements.push({\n // Lifted by a fraction of its own size so a marker sits *on* the\n // surface rather than half-buried in it, at any size.\n position: latLonToPosition(marker, RADIUS + size * MARKER_LIFT),\n scale: size,\n })\n colors.push(marker.color)\n }\n\n g3.instances(\n Geo.sphere({ radius: 1, segments: [16, 12] }),\n // Unlit, and deliberately: a marker is a signal rather than an object, and\n // one shaded by the scene's key light would go dark exactly when it\n // rotated to the night side — which is where it most needs to be seen.\n Mat.basic({ transparent: true }),\n placements,\n { colors }\n )\n }\n\n /** The arcs, one swept tube each. */\n private addArcs(g3: Graphics3D): void {\n // Resolved against the marker list, because an end may be *pinned* to one —\n // which is what keeps an arc attached when the place it points at moves.\n for (const arc of drawableArcs(this.arcs, this.markers)) {\n const points = greatCircle(arc.from, arc.to, {\n radius: RADIUS,\n lift: arc.lift,\n segments: arcSegments(arc),\n })\n\n // `progress` trims the point list rather than scaling the geometry, so a\n // half-drawn arc is the first half of the real path — the same shape the\n // finished arc has, stopping early. Two points is the floor a tube can be\n // swept along.\n const drawn = Math.max(2, Math.round(points.length * arc.progress))\n\n g3.mesh(\n Geo.tube({\n points: points.slice(0, drawn),\n radius: arc.width * RADIUS,\n segments: [drawn, 8],\n }),\n // Unlit for the reason the markers are: an arc is an annotation, and one\n // that dimmed over the night side would vanish halfway across.\n Mat.basic({ color: arc.color, transparent: true })\n )\n }\n }\n\n // --- The map cache -------------------------------------------------------\n\n /**\n * The baked map, and the descriptor that lets it be baked once.\n *\n * Two caches are being kept in step here, and the key is what keeps them in\n * step. This one holds the `Graphics2D` and its descriptor so the node hands\n * the renderer the *same object* every frame — surface identity is object\n * identity, so a fresh one each frame would defeat the texture cache and\n * orphan a GPU texture per frame. The renderer's own `staticRasters` holds the\n * rasterized pixels against the `identity` string below.\n *\n * They share one key, which is the point: edit a colour and this cache misses\n * (a new `Graphics2D`) *and* that one misses (a new identity string). Derive\n * the identity from anything else — a counter, the node id — and a colour\n * change would serve the old pixels forever, because nothing invalidates\n * `staticRasters` short of tearing down the render context.\n *\n * The descriptor is written out rather than built with `Tex.surface` because\n * the builder's options do not include `static` or `identity`. Handing a bare\n * `Graphics2D` to `fill` instead takes `resolveFill3D`'s surface path, which\n * sets neither — and that is the per-frame read-back this whole arrangement\n * exists to avoid.\n */\n private cache: { key: string; map: BakedMap } | null = null\n\n private bakedMap(): BakedMap {\n const style = this.mapStyle()\n const key = [\n style.width,\n style.ocean,\n style.land,\n style.border,\n style.borderWidth,\n style.graticule,\n style.graticuleColor,\n style.graticuleStep,\n style.graticuleWidth,\n ].join(\"|\")\n\n const cached = this.cache\n if (cached?.key === key) return cached.map\n\n const map: BakedMap = {\n texture: {\n source: worldMapGraphics(style),\n width: style.width,\n height: mapHeight(style.width),\n static: true,\n identity: `globe:${key}`,\n },\n }\n this.cache = { key, map }\n return map\n }\n\n /** The style props as the one value the baker takes. Also the cache key. */\n private mapStyle(): WorldMapStyle {\n return {\n // Rounded to an even number so the 2:1 height is a whole one; a half-pixel\n // buffer height is rounded by the rasterizer and the map then samples a\n // fraction of a row off, which reads as a seam at the equator.\n width: Math.max(256, Math.round(this.resolution / 2) * 2),\n ocean: hexOf(this.ocean),\n land: hexOf(this.land),\n border: hexOf(this.border),\n borderWidth: this.borderWidth,\n graticule: this.graticule,\n graticuleColor: hexOf(this.graticuleColor),\n graticuleStep: this.graticuleStep,\n graticuleWidth: this.graticuleWidth,\n }\n }\n}\n\n/**\n * The signed turn from `from` to `to` that travels less than half a circle.\n *\n * Degrees. What stops a flight from 170° to −170° unwinding 340° the wrong way\n * when it could cross the antimeridian in 20°.\n */\nfunction shortestTurn(from: number, to: number): number {\n return ((((to - from) % 360) + 540) % 360) - 180\n}\n\n\n/**\n * A colour prop as the string the baker and the cache key both want.\n *\n * These props carry no mapper — they are not animatable, so there is no resolved\n * form to hold — but a caller writing JSX is still free to hand one a tuple, and\n * a tuple in a cache key would stringify to something that compares equal for\n * two different colours.\n */\nfunction hexOf(value: Color): string {\n if (typeof value === \"string\") return value\n const [r, g, b, a = 1] = value as unknown as NormalizedColor\n const byte = (channel: number) =>\n Math.round(Math.min(1, Math.max(0, channel)) * 255)\n return `rgba(${byte(r)}, ${byte(g)}, ${byte(b)}, ${a})`\n}\n", "/**\n * What an author places on a Globe — the marked points, and the arcs between\n * them — as the panel edits them and the stored field holds them.\n *\n * Beside `graph-equations.ts` and shaped like it, because it is the same\n * problem: an appearance value is `number | string | boolean`, so a *list* has\n * to arrive as one string that a mapper reads. What lives here is the authored\n * shape and its serialization, shared by the inspector's tiles and the node's\n * builder; what a frame actually draws is `nodes/globe/impl/places.ts`, which\n * resolves this into coordinates and clamps it to what the render can use.\n *\n * The split matters in one direction: **reading must be faithful and must not\n * mint identity**. The panel reads on every render and the builder on every\n * rebuild, so a random id here would be a different id every time — and two\n * things key off it (a tile's React key, and which arc endpoint points at which\n * marker). {@link createMarker} mints ids; the readers derive a positional one\n * and never invent.\n */\n\n/**\n * A marked point on the surface.\n *\n * `label` is **not drawn**. It names the tile in the inspector and the entries\n * in an arc's endpoint menus, which is the whole of its job today — a label\n * rendered against the globe is a separate problem (it has to face the camera,\n * hide when it rotates behind the planet, and not collide with its neighbours),\n * and storing the text now is what lets that arrive without a migration.\n */\nexport interface GlobeMarker {\n /** Identity across list edits — a tween matches like with like. */\n id: string\n /** A name for this place. Editor-facing only; see the note above. */\n label: string\n /** Degrees north, −90…90. */\n lat: number\n /** Degrees east, −180…180. */\n lon: number\n /** Any colour string the fill parser takes. Empty means the palette entry. */\n color: string\n /** Radius as a fraction of the globe's own. */\n size: number\n /** 0–1. A fade, unlike {@link enabled}, which is a switch. */\n opacity: number\n /** Whether it draws. Off keeps the tile in place, editable, with its colour. */\n enabled: boolean\n}\n\n/**\n * One end of an arc: a marker it is pinned to, or a place of its own.\n *\n * The pinned form is the one the tile offers first, and it is not merely\n * convenient — an arc between two *marked* places moves when the place does,\n * where a copied pair of coordinates silently stops matching the dot it was\n * drawn to. That is the same reasoning a state machine's connection names its\n * ends by state id rather than by position.\n *\n * The free form stays because not every end wants a dot on it, and because a\n * list written by hand or by an agent reaches for a coordinate pair first.\n */\nexport type ArcEnd =\n | { readonly kind: \"marker\"; readonly markerId: string }\n | { readonly kind: \"place\"; readonly lat: number; readonly lon: number }\n\n/** A great-circle path between two ends. */\nexport interface GlobeArc {\n id: string\n from: ArcEnd\n to: ArcEnd\n color: string\n /** Tube radius as a fraction of the globe's own. */\n width: number\n /** How far the middle lifts off the surface, as a fraction of the radius. */\n lift: number\n /**\n * How much of the path is drawn, 0–1 — a line that draws itself on.\n *\n * A fraction of the *path* rather than a time, so it means the same thing\n * whatever the arc's length and is the author's to tween from wherever they\n * like. Zero draws nothing and is not an error.\n */\n progress: number\n enabled: boolean\n}\n\n/**\n * The palette an uncoloured marker takes its colour from, by position.\n *\n * Warm-to-cool rather than a spectrum: markers are read against a dark ocean and\n * usually mean something ranked — the first is the subject and the rest are\n * context — so the order runs from the one that carries furthest to the one that\n * recedes. Six, then it wraps; a seventh place that has to stand out sets its\n * own colour.\n */\nexport const DEFAULT_MARKER_COLORS = [\n \"#ff3b30\",\n \"#ff9f0a\",\n \"#ffd60a\",\n \"#30d158\",\n \"#5ac8fa\",\n \"#bf5af2\",\n] as const\n\n/** The colour a marker at `index` is drawn in when it names none. */\nexport function markerColorAt(index: number): string {\n const palette = DEFAULT_MARKER_COLORS\n return palette[((index % palette.length) + palette.length) % palette.length]!\n}\n\n/** The colour an arc falls back to. */\nexport const DEFAULT_ARC_COLOR = \"#ffd60a\"\n\nconst DEFAULT_MARKER_SIZE = 0.02\nconst DEFAULT_ARC_WIDTH = 0.004\nconst DEFAULT_ARC_LIFT = 0.25\n\n/**\n * A fresh id for a tile.\n *\n * A counter plus a short random suffix rather than `crypto.randomUUID`, exactly\n * as `graph-equations.ts` explains: this package loads in a bare Node process\n * with no DOM and no assumed globals, and an id only has to be unique within one\n * node's list. The suffix is what stops two clients editing the same scene\n * colliding on `mk-3`.\n *\n * Never called during a build — only when an author adds a tile.\n */\nlet placeSeq = 0\nfunction nextId(prefix: string): string {\n placeSeq += 1\n return `${prefix}-${placeSeq}-${Math.random().toString(36).slice(2, 8)}`\n}\n\n/** A new marker tile: showing, opaque, and at the given place. */\nexport function createMarker(\n at: { lat: number; lon: number } = { lat: 0, lon: 0 }\n): GlobeMarker {\n return {\n id: nextId(\"mk\"),\n label: \"\",\n lat: at.lat,\n lon: at.lon,\n color: \"\",\n size: DEFAULT_MARKER_SIZE,\n opacity: 1,\n enabled: true,\n }\n}\n\n/** A new arc tile, between two ends. */\nexport function createArc(from: ArcEnd, to: ArcEnd): GlobeArc {\n return {\n id: nextId(\"arc\"),\n from,\n to,\n color: DEFAULT_ARC_COLOR,\n width: DEFAULT_ARC_WIDTH,\n lift: DEFAULT_ARC_LIFT,\n progress: 1,\n enabled: true,\n }\n}\n\n/** An end pinned to a marker. */\nexport function markerEnd(markerId: string): ArcEnd {\n return { kind: \"marker\", markerId }\n}\n\n/** An end at a place of its own. */\nexport function placeEnd(lat: number, lon: number): ArcEnd {\n return { kind: \"place\", lat, lon }\n}\n\n// --- Reading ---------------------------------------------------------------\n\n/**\n * Reads a stored marker list, defensively.\n *\n * Never throws, and drops only what it genuinely cannot place: the field is\n * edited a keystroke at a time by hand as well as through the tiles, so it is\n * invalid far more often than it is valid, and a reader that threw would blank\n * the canvas on the way from `[` to `[{`.\n *\n * A row with **no position at all** is the one thing that is dropped rather than\n * defaulted. Every other field has an honest default; a latitude does not, and\n * putting an unplaced marker on the equator would draw a dot somewhere nobody\n * asked for and call it the author's.\n */\nexport function markersOf(value: unknown): GlobeMarker[] {\n return rowsOf(value).flatMap((row, index) => {\n const lat = finite(row.lat ?? row.latitude)\n const lon = finite(row.lon ?? row.lng ?? row.longitude)\n if (lat === null || lon === null) return []\n return [\n {\n id: idOf(row.id, `mk:${index}`),\n label: text(row.label ?? row.name) ?? \"\",\n lat: clamp(lat, -90, 90),\n lon: wrapLongitude(lon),\n color: text(row.color) ?? \"\",\n size: positive(row.size, DEFAULT_MARKER_SIZE),\n opacity: unit(row.opacity),\n // Absent means on, as everywhere else a switch is stored: only an\n // explicit `false` turns a tile off.\n enabled: row.enabled !== false,\n },\n ]\n })\n}\n\n/** Reads a stored arc list, on the same terms as {@link markersOf}. */\nexport function arcsOf(value: unknown): GlobeArc[] {\n return rowsOf(value).flatMap((row, index) => {\n const from = endOf(row.from)\n const to = endOf(row.to)\n if (!from || !to) return []\n return [\n {\n id: idOf(row.id, `arc:${index}`),\n from,\n to,\n color: text(row.color) ?? DEFAULT_ARC_COLOR,\n width: positive(row.width, DEFAULT_ARC_WIDTH),\n lift: clamp(finite(row.lift) ?? DEFAULT_ARC_LIFT, 0, 4),\n progress: unit(row.progress),\n enabled: row.enabled !== false,\n },\n ]\n })\n}\n\n/** Serializes a marker list into the stored string form. */\nexport function markersToValue(markers: readonly GlobeMarker[]): string {\n return JSON.stringify(markers)\n}\n\n/**\n * Serializes an arc list, writing each end back in the shape it was authored in.\n *\n * A pinned end is a bare **string** and a free one a `[lat, lon]` **pair**,\n * rather than the tagged union this module works in. Two reasons, and the second\n * is the load-bearing one: those are the two shapes somebody writing this list\n * by hand reaches for, and a stored document is read by whatever version opens\n * it later — so the wire form is public API and a discriminant that only exists\n * to make the TypeScript convenient does not belong in it.\n */\nexport function arcsToValue(arcs: readonly GlobeArc[]): string {\n return JSON.stringify(\n arcs.map((arc) => ({ ...arc, from: endToValue(arc.from), to: endToValue(arc.to) }))\n )\n}\n\nfunction endToValue(end: ArcEnd): string | [number, number] {\n return end.kind === \"marker\" ? end.markerId : [end.lat, end.lon]\n}\n\n/**\n * One end, from any of the three shapes a stored list holds it in.\n *\n * A **string** is a marker id; a **pair** is `[lat, lon]`, which is how a\n * coordinate is written everywhere outside a program; an **object** with `lat`\n * and `lon` is the long form. Refusing any of them would make the field's most\n * obvious content its most surprising failure.\n */\nfunction endOf(value: unknown): ArcEnd | null {\n if (typeof value === \"string\") {\n return value.trim() === \"\" ? null : markerEnd(value)\n }\n if (Array.isArray(value)) {\n const lat = finite(value[0])\n const lon = finite(value[1])\n return lat === null || lon === null\n ? null\n : placeEnd(clamp(lat, -90, 90), wrapLongitude(lon))\n }\n if (typeof value !== \"object\" || value === null) return null\n const row = value as Record<string, unknown>\n if (typeof row.markerId === \"string\") return markerEnd(row.markerId)\n const lat = finite(row.lat ?? row.latitude)\n const lon = finite(row.lon ?? row.lng ?? row.longitude)\n return lat === null || lon === null\n ? null\n : placeEnd(clamp(lat, -90, 90), wrapLongitude(lon))\n}\n\n// --- Reading helpers -------------------------------------------------------\n\ntype Row = Record<string, unknown>\n\nfunction rowsOf(value: unknown): Row[] {\n if (typeof value !== \"string\" || value.trim() === \"\") return []\n try {\n const parsed: unknown = JSON.parse(value)\n if (!Array.isArray(parsed)) return []\n return parsed.filter(\n (row): row is Row => typeof row === \"object\" && row !== null\n )\n } catch {\n return []\n }\n}\n\n/**\n * A row's identity, or one derived from where it sits.\n *\n * Positional rather than random, and the difference is the whole point: a random\n * id here would be a different one on every read, and both the tile's React key\n * and an arc's pin to a marker would change under the author's hands.\n */\nfunction idOf(value: unknown, positional: string): string {\n return text(value) ?? positional\n}\n\nfunction text(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() !== \"\" ? value : null\n}\n\nfunction finite(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null\n}\n\n/** A stored 0–1 value; anything unreadable is fully on. */\nfunction unit(value: unknown): number {\n const n = finite(value)\n return n === null ? 1 : clamp(n, 0, 1)\n}\n\n/** A stored size, which must be above zero to draw at all. */\nfunction positive(value: unknown, fallback: number): number {\n const n = finite(value)\n return n === null || n <= 0 ? fallback : n\n}\n\n/**\n * A longitude into −180…180.\n *\n * Wrapped rather than clamped, unlike latitude: 190°E is a real place (170°W)\n * and clamping would put it on the antimeridian, where there is nothing north of\n * the north pole for a latitude to mean.\n *\n * A value already in range is returned untouched — the modulo round-trip is not\n * exact in binary floating point (139.7 comes back as 139.70000000000005), and a\n * stored longitude that differs from the one the author typed shows up later as\n * a diff nobody made.\n */\nfunction wrapLongitude(value: number): number {\n if (value >= -180 && value <= 180) return value\n return ((((value + 180) % 360) + 360) % 360) - 180\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value\n}\n", "/**\n * The marker and arc lists, resolved into the things a frame draws.\n *\n * The authored shape and its serialization live in `model/globe-places.ts`,\n * shared with the inspector's tiles. What is here is the other half: turning a\n * pinned arc end into a coordinate, dropping what cannot draw, and deciding how\n * finely a tube is swept. None of it is meaningful to the panel, and all of it\n * runs on every rebuild — which is why the two halves are separate modules\n * rather than one with a flag.\n */\n\nimport {\n arcsOf,\n markersOf,\n markerColorAt,\n type ArcEnd,\n type GlobeArc,\n type GlobeMarker,\n} from \"./globe-places\"\n\n/** A marker with everything the render needs decided. */\nexport interface DrawableMarker {\n id: string\n lat: number\n lon: number\n color: string\n size: number\n opacity: number\n}\n\n/** An arc with both ends resolved to real coordinates. */\nexport interface DrawableArc {\n id: string\n from: { lat: number; lon: number }\n to: { lat: number; lon: number }\n color: string\n width: number\n lift: number\n progress: number\n}\n\n/**\n * The markers a frame draws, in list order.\n *\n * The palette is applied **here** rather than left to the drawing code, so the\n * one place that decides what colour an uncoloured marker is also the place the\n * swatch in the panel reads — see `markerColorAt`. Position in the list is the\n * palette index, which is why a reorder recolours: the list is a ranking, and\n * the first place being the loudest is the point.\n */\nexport function drawableMarkers(value: string): DrawableMarker[] {\n return markersOf(value).flatMap((marker, index) =>\n marker.enabled && marker.opacity > 0\n ? [\n {\n id: marker.id,\n lat: marker.lat,\n lon: marker.lon,\n color: marker.color === \"\" ? markerColorAt(index) : marker.color,\n size: clamp(marker.size, 0.001, 0.5),\n opacity: marker.opacity,\n },\n ]\n : []\n )\n}\n\n/**\n * The arcs a frame draws, with pinned ends looked up in the marker list.\n *\n * An end pinned to a marker that is gone drops the whole arc rather than falling\n * back to the origin. A line to null island is a picture of something that is\n * not true, and it is *harder* to notice than a missing one: an arc that\n * vanishes when its endpoint is deleted reads as a consequence, where one that\n * swings to the Gulf of Guinea reads as a bug in the projection.\n *\n * A **disabled** marker still anchors an arc, deliberately. Switching a dot off\n * is about the dot; an arc that also wanted to go is switched off itself.\n */\nexport function drawableArcs(\n arcsValue: string,\n markersValue: string\n): DrawableArc[] {\n const byId = new Map<string, GlobeMarker>()\n for (const marker of markersOf(markersValue)) byId.set(marker.id, marker)\n\n return arcsOf(arcsValue).flatMap((arc) => {\n if (!arc.enabled || arc.progress <= 0) return []\n const from = resolveEnd(arc.from, byId)\n const to = resolveEnd(arc.to, byId)\n if (!from || !to) return []\n return [\n {\n id: arc.id,\n from,\n to,\n color: arc.color,\n width: clamp(arc.width, 0.0005, 0.1),\n lift: arc.lift,\n progress: arc.progress,\n },\n ]\n })\n}\n\nfunction resolveEnd(\n end: ArcEnd,\n markers: Map<string, GlobeMarker>\n): { lat: number; lon: number } | null {\n if (end.kind === \"place\") return { lat: end.lat, lon: end.lon }\n const marker = markers.get(end.markerId)\n return marker ? { lat: marker.lat, lon: marker.lon } : null\n}\n\n/**\n * How many segments an arc's tube is swept along.\n *\n * Proportional to how far it goes, so a hop between neighbours is not paying for\n * a pole-to-pole path's resolution and a long haul does not visibly chord. The\n * floor keeps a very short arc from degenerating into a two-point tube, which\n * three cannot frame.\n */\nexport function arcSegments(arc: Pick<GlobeArc | DrawableArc, \"from\" | \"to\">): number {\n const from = arc.from as { lat: number; lon: number }\n const to = arc.to as { lat: number; lon: number }\n const span = Math.abs(to.lat - from.lat) + Math.abs(to.lon - from.lon)\n return Math.max(8, Math.min(128, Math.round(span * 0.7)))\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value\n}\n", "/**\n * Where a latitude and a longitude are, in the three spaces the Globe works in:\n * the unit sphere it draws on, the equirectangular texture it paints, and the\n * orbit camera it is looked at through.\n *\n * All three are fixed by one decision, and it is the decision every other file\n * in this node depends on, so it is made here and nowhere else.\n *\n * ## The convention, and why it is not the obvious one\n *\n * Two things have to be true at once, and motion-script's camera lets you have\n * either but not both by default:\n *\n * 1. **The stored `orbit` field reads directly as a longitude.** That would let\n * the camera be three appearance numbers *and* the Fly To command be\n * arithmetic on two of them with nothing in between.\n * 2. **East is to the right.** Looking at the Atlantic from space, Africa is\n * right of Brazil. A globe that fails this is a mirrored Earth, which no\n * amount of convenience elsewhere pays for.\n *\n * The clash: `resolveCameraPlacement` puts a camera at azimuth `a` at\n * `(sin a, ·, cos a)`, and `cameraOrbit` (`view3d-kit/shared.ts`) feeds it\n * `90 - orbit`, so a camera at stored orbit θ sits at `(cos θ, ·, sin θ)` and its\n * screen-right is `-Z`. Increasing θ therefore swings the scene **rightward** —\n * measured, not reasoned: it is what every existing 3D node does, and the globe\n * has to match or it is the one viewport whose drag goes backwards.\n *\n * So (1) is what gives. Longitude runs the *other* way round the Y axis —\n * {@link latLonToVector} negates Z, which is what puts east on the right — and a\n * camera at heading θ is consequently centred over longitude −θ. The stored\n * field is a heading, labelled \"Orbit\" like every other viewport's, and\n * {@link orbitForLongitude} is the one place the two are converted.\n *\n * The Fly To command is where that conversion earns its keep: its arguments\n * genuinely are a latitude and a longitude, and it turns them into a heading\n * here rather than anywhere else.\n *\n * ## The texture\n *\n * Plain equirectangular, the orientation any world map image already has:\n * longitude −180…180 left to right, latitude +90…−90 top to bottom. That falls\n * out of the convention above rather than being chosen — see {@link latLonToUV},\n * which derives it from three's own sphere generator — and it is the strongest\n * evidence the convention is right: get the handedness wrong and the map that\n * wraps correctly is a mirrored one.\n */\n\n/** A point on the unit sphere. */\nexport interface Vec3 {\n x: number\n y: number\n z: number\n}\n\n/** A position on the globe, in degrees. */\nexport interface LatLon {\n /** Degrees north of the equator, −90…90. */\n lat: number\n /** Degrees east of the prime meridian, −180…180. */\n lon: number\n}\n\n/**\n * The bounding box every country path is centred against.\n *\n * A `Path` centres on its *own* bounding box unless it is given one, so drawing\n * the world as one path per country and leaving this off stacks all 177 of them\n * on the origin. Passing the same frame to each is what keeps them in place —\n * the same reason the LaTeX renderer passes whole-formula bounds to every glyph.\n */\nexport const WORLD_BOUNDS = [-180, -90, 180, 90] as const\n\nconst DEG = Math.PI / 180\n\n/**\n * The unit-sphere direction of a latitude and longitude.\n *\n * `z` is negated against the textbook spherical formula, which is the whole of\n * the convention above: it is what puts east on the right.\n */\nexport function latLonToVector({ lat, lon }: LatLon): Vec3 {\n const phi = lat * DEG\n const lambda = lon * DEG\n const ring = Math.cos(phi)\n return {\n x: ring * Math.cos(lambda),\n y: Math.sin(phi),\n z: -ring * Math.sin(lambda),\n }\n}\n\n/** {@link latLonToVector}, scaled off the surface — markers, arc endpoints. */\nexport function latLonToPosition(\n at: LatLon,\n radius: number\n): [number, number, number] {\n const { x, y, z } = latLonToVector(at)\n return [x * radius, y * radius, z * radius]\n}\n\n/**\n * Where a latitude and longitude land in the equirectangular texture, as `uv`\n * in `[0,1]²`.\n *\n * Derived rather than chosen, from the two pieces of machinery underneath:\n *\n * - three's `SphereGeometry` puts vertex `u` at `(-cos 2πu, ·, sin 2πu)` and\n * writes `uv = (u, 1 - v)`, with `v = 0` at the north pole.\n * - motion-script uploads a rasterized surface with `flipY = true`\n * (`skia-render/src/three/handlers/texture.ts`), so the buffer's **first row\n * is `uv.y = 1`**.\n *\n * Solving `(-cos 2πu, sin 2πu)` against {@link latLonToVector}'s `(x, z)` gives\n * `2πu = π + λ`, and the latitude falls straight out of `y = cos θ`. The result\n * is the ordinary world-map layout, which is the point.\n */\nexport function latLonToUV({ lat, lon }: LatLon): { u: number; v: number } {\n return { u: (lon + 180) / 360, v: 0.5 + lat / 180 }\n}\n\n/**\n * Where a latitude and longitude land in the **drawing space** of the baked\n * texture: pixels, **y upward**, origin at the buffer's centre.\n *\n * Two of motion-script's conventions meet here, and neither is guessable from a\n * picture that comes out wrong, so both are written down:\n *\n * - **The origin is the buffer's centre**, because `SkiaRenderContext.rasterize`\n * translates the offscreen canvas by half its size before handing it to the\n * source. Drawn from a top-left origin the map lands a quarter of the world\n * off the edge — and still wraps onto the sphere without complaint.\n * - **`y` is up.** A `PathCommand[]`, and a line's `points`, are authored y-up\n * and mirrored by the backend on the way to Skia (`flipPathY`, and the\n * `points` map beside it in `render-context.ts`). Drawn y-down the world is\n * simply upside down — and every continent still has its own shape, so it\n * reads as a texture flipped somewhere in the pipeline rather than as a sign\n * in the one function that decides.\n *\n * Deliberately *not* the raw buffer's own row order. The backend's flip lands\n * north on the first row, and `flipY` on the uploaded texture maps that row to\n * `uv.y = 1` — which is where {@link latLonToUV} independently puts the north\n * pole. A test ties the two together rather than trusting them to agree.\n */\nexport function latLonToCanvas(\n { lat, lon }: LatLon,\n width: number,\n height: number\n): { x: number; y: number } {\n return { x: (lon / 360) * width, y: (lat / 180) * height }\n}\n\n/**\n * The frame every country path is centred against, in that same space.\n *\n * See {@link WORLD_BOUNDS} for why passing it to each path matters.\n */\nexport function canvasBounds(\n width: number,\n height: number\n): [number, number, number, number] {\n return [-width / 2, -height / 2, width / 2, height / 2]\n}\n\n/**\n * The stored `orbit` heading that puts `lon` at the centre of the frame.\n *\n * **A negation, and it is the price of two things that matter more than the\n * field reading as a longitude.**\n *\n * `orbit` has to behave exactly as it does on every other 3D node: the canvas\n * drag adds to it (`orbitByDrag`), and increasing it must swing the scene the\n * same way it swings a molecule or a surface, or the globe is the one viewport\n * whose drag goes backwards. That pins `orbit` to `cameraOrbit` with no\n * conversion in between.\n *\n * East also has to be on the right, which pins {@link latLonToVector}'s sign.\n *\n * Those two together force the third: a camera at heading θ is centred over\n * longitude −θ. So the stored field is a **heading**, not a longitude — which is\n * why the panel labels it \"Orbit\" like every other viewport's, and why the Fly\n * To command, whose arguments genuinely are a latitude and a longitude,\n * converts through here.\n */\nexport function orbitForLongitude(lon: number): number {\n return -lon\n}\n\n/** The longitude a stored `orbit` heading is centred over. Its own inverse. */\nexport function longitudeForOrbit(orbit: number): number {\n return -orbit\n}\n\n/**\n * Points along the great circle from `from` to `to`, `segments` spans of them.\n *\n * Spherical linear interpolation rather than a lerp of the two lat/lons: the\n * latter is a rhumb line, which crosses the antimeridian the long way and bulges\n * badly at high latitudes — a \"London to Tokyo\" arc drawn that way runs through\n * Kazakhstan instead of over the pole, which is the one thing the picture exists\n * to show.\n *\n * `lift` raises the middle of the arc off the surface, as a fraction of the\n * radius, on a sine so both ends meet the sphere flush. Zero draws the path on\n * the ground.\n */\nexport function greatCircle(\n from: LatLon,\n to: LatLon,\n options: { radius?: number; lift?: number; segments?: number } = {}\n): [number, number, number][] {\n const radius = options.radius ?? 1\n const lift = options.lift ?? 0\n const segments = Math.max(1, Math.floor(options.segments ?? 64))\n\n const a = latLonToVector(from)\n const b = latLonToVector(to)\n\n const dot = clamp(a.x * b.x + a.y * b.y + a.z * b.z, -1, 1)\n const omega = Math.acos(dot)\n\n const points: [number, number, number][] = []\n for (let i = 0; i <= segments; i++) {\n const t = i / segments\n // Antipodal or coincident endpoints leave the plane of the circle\n // undefined; a straight blend is the honest answer for both, and\n // renormalising below puts it back on the sphere either way.\n const [wa, wb] =\n Math.abs(omega) < 1e-6\n ? [1 - t, t]\n : [\n Math.sin((1 - t) * omega) / Math.sin(omega),\n Math.sin(t * omega) / Math.sin(omega),\n ]\n\n const x = a.x * wa + b.x * wb\n const y = a.y * wa + b.y * wb\n const z = a.z * wa + b.z * wb\n const length = Math.hypot(x, y, z) || 1\n const scale = (radius * (1 + lift * Math.sin(Math.PI * t))) / length\n\n points.push([x * scale, y * scale, z * scale])\n }\n return points\n}\n\n/**\n * The signed turn from one heading to another, taking whichever way round is\n * shorter — so 170° to −170° is a 20° nudge east rather than 340° west.\n *\n * The same arithmetic `camera-kit`'s unused `shortestTurn` states; it is\n * duplicated rather than imported because that one is private to a module this\n * package's 3D nodes do not otherwise depend on, and because a Fly To that got\n * this wrong would be the command's single most visible failure.\n */\nexport function shortestTurn(from: number, to: number): number {\n return ((((to - from) % 360) + 540) % 360) - 180\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value\n}\n", "/**\n * The world as a flat drawing — the one `Graphics2D` that becomes the sphere's\n * texture.\n *\n * Baking the map in 2D rather than tessellating it in 3D is the node's central\n * decision, and it is not a shortcut. A WebGL line ignores any width above one\n * pixel (motion-script says so outright on `LineStroke3D`), so borders drawn as\n * 3D lines are hairlines at every zoom and every resolution, and the only way to\n * thicken one is to sweep a tube along it — three hundred tubes, for a picture\n * that is flat. Drawn here, a border is an ordinary stroke: any weight, any\n * colour, joined and antialiased by Skia, and it costs one rasterize rather than\n * one per frame.\n *\n * Everything here is therefore *style*, and the node's cache key is exactly the\n * arguments below. Nothing that moves — a marker, an arc, the camera — is drawn\n * into this, because baking something that moves would put every frame of its\n * animation through a full re-rasterize.\n *\n * ## One path per country, and this is the whole performance story\n *\n * The obvious shape is one `path` op holding all 289 rings — the nonzero fill\n * rule sorts out what is land, and it is one op instead of 177. **Do not do\n * that.** Skia's cost for filling and stroking a single path is badly\n * superlinear in its *contour* count, and the difference is not marginal:\n *\n * one path, 289 contours, 10,649 commands 10,691 ms\n * one path per country (177 of them) 205 ms\n *\n * Measured in the browser, on the same data, at the same resolution — a 52×\n * difference, and the reason adding a Globe to a scene used to lock the app for\n * ten seconds. It is also almost independent of the texture's resolution (256²\n * and 2048² are within 10% of each other), which is the tell that the cost is\n * geometry, not pixels, and that turning the map down would not have saved it.\n *\n * Splitting per country is safe for the fill: each country's rings — exterior\n * and holes together — stay in *its* path, so the nonzero rule still cuts\n * Lesotho out of South Africa, and Lesotho's own path paints it back.\n *\n * ## The lines are a separate pass, and have to be\n *\n * The country paths are filled and **not** stroked. Stroking them would draw\n * every international border twice — once from each side, since both countries\n * carry it — and a doubly-composited antialiased fringe reads as a line half\n * again as wide as the coastlines beside it. `borders.ts` deduplicates the\n * segments and stitches them into runs; this file strokes those instead, so\n * every line on the map is drawn exactly once at exactly one weight.\n */\n\nimport { Graphics2D, type PathCommand } from \"@motionscript/core\"\n\nimport { canvasBounds, latLonToCanvas } from \"./projection\"\nimport { borderLines } from \"./borders\"\nimport { world, type Ring } from \"./world\"\n\n/** Everything that changes the baked pixels. Also the node's cache key. */\nexport interface WorldMapStyle {\n /** Buffer width in pixels. Height is half of it — the equirectangular ratio. */\n width: number\n ocean: string\n land: string\n /**\n * The colour of every coast and border.\n *\n * Alpha is fine here, and that is worth saying because it briefly was not:\n * while the country paths were stroked, a shared border was drawn twice and a\n * translucent one came out at double density. `drawBoundaries` draws each line\n * exactly once, so the colour means what it says.\n */\n border: string\n borderWidth: number\n graticule: boolean\n graticuleColor: string\n /** Degrees between graticule lines. */\n graticuleStep: number\n graticuleWidth: number\n}\n\n/** The buffer's height for a given width — equirectangular is always 2:1. */\nexport function mapHeight(width: number): number {\n return Math.round(width / 2)\n}\n\n/**\n * The map, drawn.\n *\n * **Hoist the result.** motion-script identifies a surface texture by its source\n * object, so a fresh `Graphics2D` every frame misses the raster cache, redraws\n * ten thousand paths, reads the buffer back off the GPU and uploads it again —\n * sixty times a second, to produce the same image. `Globe` holds one against\n * this style; nothing else should call this.\n */\nexport function worldMapGraphics(style: WorldMapStyle): Graphics2D {\n const width = style.width\n const height = mapHeight(width)\n const bounds = canvasBounds(width, height)\n\n const g = new Graphics2D()\n\n // The ocean is the whole buffer rather than a sphere-coloured backdrop,\n // because the texture has to be opaque: the sphere is lit, and a transparent\n // texel would show the inside of the far side through it.\n g.rect({ width, height }).fill(style.ocean)\n\n // Land, filled and **not** stroked — see `drawBoundaries` for where the lines\n // come from and why they cannot come from here.\n //\n // One path per country, not one for the world: see the module note for what\n // that costs.\n for (const country of world().countries) {\n const commands: PathCommand[] = []\n for (const ring of country.rings) appendRing(commands, ring, width, height)\n if (commands.length === 0) continue\n g.path({ data: commands, centerBounds: bounds }).fill(style.land)\n }\n\n if (style.borderWidth > 0) drawBoundaries(g, style, width, height, bounds)\n\n // Last, and over the land. The graticule is reference rather than art\n // direction — the same reading the Canvas 3D viewport's grid takes — so it\n // reads as an overlay on whatever it crosses rather than as terrain.\n if (style.graticule) {\n for (const line of graticuleLines(style.graticuleStep, width, height)) {\n g.line({ points: line }).stroke({\n fill: style.graticuleColor,\n weight: style.graticuleWidth,\n })\n }\n }\n\n return g\n}\n\nfunction appendRing(\n commands: PathCommand[],\n ring: Ring,\n width: number,\n height: number\n): void {\n const count = ring.points.length / 2\n for (let i = 0; i < count; i++) {\n const { x, y } = latLonToCanvas(\n { lon: ring.points[i * 2]!, lat: ring.points[i * 2 + 1]! },\n width,\n height\n )\n commands.push(i === 0 ? { type: \"M\", x, y } : { type: \"L\", x, y })\n }\n // Closed explicitly: the ring's repeated last point was dropped when it was\n // vendored, so without this the stroke leaves a notch at every country's\n // starting vertex and the fill's last edge is implied rather than drawn.\n commands.push({ type: \"Z\" })\n}\n\n/**\n * Every coast and border, stroked once each.\n *\n * **One path per run**, for exactly the reason the countries are one path each:\n * a path's stroke cost is superlinear in its contour count. Gathering the 277\n * runs into two paths of ~200 contours put this straight back on the cliff the\n * countries were moved off — measured at 2.5 s of stall, against none at one\n * run per path.\n *\n * One-per-run rather than a tuned chunk size because there is no number to\n * defend: 277 paths is the same order as the 177 the countries already use, and\n * a constant here would be a knob whose safe range nobody could state.\n */\nfunction drawBoundaries(\n g: Graphics2D,\n style: WorldMapStyle,\n width: number,\n height: number,\n bounds: readonly [number, number, number, number]\n): void {\n const paint = { fill: style.border, weight: style.borderWidth }\n\n for (const line of borderLines()) {\n const count = line.length / 2\n if (count < 2) continue\n const commands: PathCommand[] = []\n for (let i = 0; i < count; i++) {\n const { x, y } = latLonToCanvas(\n { lon: line[i * 2]!, lat: line[i * 2 + 1]! },\n width,\n height\n )\n commands.push(i === 0 ? { type: \"M\", x, y } : { type: \"L\", x, y })\n }\n // Left open: a boundary run is a line, not a ring, and closing it would draw\n // a chord back to wherever the run happened to start.\n g.path({ data: commands, centerBounds: bounds }).stroke(paint)\n }\n}\n\n/**\n * The meridians and parallels, as polylines in drawing space.\n *\n * Straight lines, because an equirectangular projection is exactly the one where\n * meridians and parallels are straight — the grid is curved on the sphere only\n * because the sphere curves. Meridians run pole to pole and parallels edge to\n * edge, and both stop short of the poles by one step so the drawing does not\n * pile every meridian onto the same two points.\n */\nfunction graticuleLines(\n step: number,\n width: number,\n height: number\n): { x: number; y: number }[][] {\n const spacing = Math.max(5, Math.min(90, step))\n const lines: { x: number; y: number }[][] = []\n\n for (let lon = -180; lon <= 180; lon += spacing) {\n const meridian: { x: number; y: number }[] = []\n for (let lat = -90; lat <= 90; lat += 5) {\n meridian.push(latLonToCanvas({ lat, lon }, width, height))\n }\n lines.push(meridian)\n }\n\n for (let lat = -90 + spacing; lat <= 90 - spacing; lat += spacing) {\n lines.push([\n latLonToCanvas({ lat, lon: -180 }, width, height),\n latLonToCanvas({ lat, lon: 180 }, width, height),\n ])\n }\n\n return lines\n}\n", "import { GeoBorder } from \"./border\";\nimport { Globe } from \"./globe\";\n\n/**\n * Every node type this package publishes.\n *\n * A host registers these by handing the array to an engine —\n * `new Engine(platform, { nodes: NODES })` — which reads each class's `@node()`\n * key. The decorator only *declares* that key: nothing is registered by the mere\n * act of importing a module, so a registry holds exactly what its owner asked\n * for and two engines in one process can differ about it.\n *\n * Listing class **values** is also what survives bundling. This package declares\n * `sideEffects: false`, which licenses a bundler to drop a module nothing\n * imports a value from, and a document names a node type by string — so\n * `import \"./globe\"` for its side effect is exactly what gets shaken out, where an\n * array of bindings is a data dependency that cannot be.\n */\nexport const NODES = [Globe, GeoBorder];\n"],
5
- "mappings": "AACO,IAAMA,EAAN,KAAY,CACjB,aAAc,CACZ,KAAK,UAAY,IAAI,aAAa,EAAE,EACpC,KAAK,GAAK,CACZ,CACA,IAAIC,EAAG,CACL,IAAMC,EAAI,KAAK,UACXC,EAAI,EACR,QAASC,EAAI,EAAGA,EAAI,KAAK,IAAMA,EAAI,GAAIA,IAAK,CAC1C,IAAMC,EAAIH,EAAEE,CAAC,EACXE,EAAKL,EAAII,EACTE,EAAK,KAAK,IAAIN,CAAC,EAAI,KAAK,IAAII,CAAC,EAAIJ,GAAKK,EAAKD,GAAKA,GAAKC,EAAKL,GACxDM,IAAIL,EAAEC,GAAG,EAAII,GACjBN,EAAIK,CACN,CACA,OAAAJ,EAAEC,CAAC,EAAIF,EACP,KAAK,GAAKE,EAAI,EACP,IACT,CACA,SAAU,CACR,IAAMD,EAAI,KAAK,UACXM,EAAI,KAAK,GAAIP,EAAGI,EAAGE,EAAID,EAAK,EAChC,GAAIE,EAAI,EAAG,CAET,IADAF,EAAKJ,EAAE,EAAEM,CAAC,EACHA,EAAI,IACTP,EAAIK,EACJD,EAAIH,EAAE,EAAEM,CAAC,EACTF,EAAKL,EAAII,EACTE,EAAKF,GAAKC,EAAKL,GACX,CAAAM,IAAJ,CAEEC,EAAI,IAAOD,EAAK,GAAKL,EAAEM,EAAI,CAAC,EAAI,GAAOD,EAAK,GAAKL,EAAEM,EAAI,CAAC,EAAI,KAC9DH,EAAIE,EAAK,EACTN,EAAIK,EAAKD,EACLA,GAAKJ,EAAIK,IAAIA,EAAKL,GAE1B,CACA,OAAOK,CACT,CACF,ECxCA,SAAUG,GAAQC,EAAQ,CACxB,QAAWC,KAASD,EAClB,MAAOC,CAEX,CAEe,SAARC,GAAuBF,EAAQ,CACpC,OAAO,MAAM,KAAKD,GAAQC,CAAM,CAAC,CACnC,CCRO,IAAIG,EAAU,KACVC,GAAW,MACXC,EAAK,KAAK,GACVC,EAASD,EAAK,EACdE,GAAYF,EAAK,EACjBG,EAAMH,EAAK,EAEXI,EAAU,IAAMJ,EAChBK,EAAUL,EAAK,IAEfM,EAAM,KAAK,IACXC,GAAO,KAAK,KACZC,EAAQ,KAAK,MACbC,EAAM,KAAK,IAEf,IAAIC,GAAM,KAAK,IAGf,IAAIC,GAAM,KAAK,IAEf,IAAIC,EAAM,KAAK,IACXC,GAAO,KAAK,MAAQ,SAASC,EAAG,CAAE,OAAOA,EAAI,EAAI,EAAIA,EAAI,EAAI,GAAK,CAAG,EACrEC,EAAO,KAAK,KACZC,GAAM,KAAK,IAEf,SAASC,GAAKH,EAAG,CACtB,OAAOA,EAAI,EAAI,EAAIA,EAAI,GAAKI,EAAK,KAAK,KAAKJ,CAAC,CAC9C,CAEO,SAASK,EAAKL,EAAG,CACtB,OAAOA,EAAI,EAAIM,EAASN,EAAI,GAAK,CAACM,EAAS,KAAK,KAAKN,CAAC,CACxD,CC/Be,SAARO,GAAwB,CAAC,CCAhC,SAASC,GAAeC,EAAUC,EAAQ,CACpCD,GAAYE,GAAmB,eAAeF,EAAS,IAAI,GAC7DE,GAAmBF,EAAS,IAAI,EAAEA,EAAUC,CAAM,CAEtD,CAEA,IAAIE,GAAmB,CACrB,QAAS,SAASC,EAAQH,EAAQ,CAChCF,GAAeK,EAAO,SAAUH,CAAM,CACxC,EACA,kBAAmB,SAASG,EAAQH,EAAQ,CAE1C,QADII,EAAWD,EAAO,SAAUE,EAAI,GAAIC,EAAIF,EAAS,OAC9C,EAAEC,EAAIC,GAAGR,GAAeM,EAASC,CAAC,EAAE,SAAUL,CAAM,CAC7D,CACF,EAEIC,GAAqB,CACvB,OAAQ,SAASE,EAAQH,EAAQ,CAC/BA,EAAO,OAAO,CAChB,EACA,MAAO,SAASG,EAAQH,EAAQ,CAC9BG,EAASA,EAAO,YAChBH,EAAO,MAAMG,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,CAC9C,EACA,WAAY,SAASA,EAAQH,EAAQ,CAEnC,QADIO,EAAcJ,EAAO,YAAaE,EAAI,GAAIC,EAAIC,EAAY,OACvD,EAAEF,EAAIC,GAAGH,EAASI,EAAYF,CAAC,EAAGL,EAAO,MAAMG,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,CACvF,EACA,WAAY,SAASA,EAAQH,EAAQ,CACnCQ,GAAWL,EAAO,YAAaH,EAAQ,CAAC,CAC1C,EACA,gBAAiB,SAASG,EAAQH,EAAQ,CAExC,QADIO,EAAcJ,EAAO,YAAaE,EAAI,GAAIC,EAAIC,EAAY,OACvD,EAAEF,EAAIC,GAAGE,GAAWD,EAAYF,CAAC,EAAGL,EAAQ,CAAC,CACtD,EACA,QAAS,SAASG,EAAQH,EAAQ,CAChCS,GAAcN,EAAO,YAAaH,CAAM,CAC1C,EACA,aAAc,SAASG,EAAQH,EAAQ,CAErC,QADIO,EAAcJ,EAAO,YAAaE,EAAI,GAAIC,EAAIC,EAAY,OACvD,EAAEF,EAAIC,GAAGG,GAAcF,EAAYF,CAAC,EAAGL,CAAM,CACtD,EACA,mBAAoB,SAASG,EAAQH,EAAQ,CAE3C,QADIU,EAAaP,EAAO,WAAYE,EAAI,GAAIC,EAAII,EAAW,OACpD,EAAEL,EAAIC,GAAGR,GAAeY,EAAWL,CAAC,EAAGL,CAAM,CACtD,CACF,EAEA,SAASQ,GAAWD,EAAaP,EAAQW,EAAQ,CAC/C,IAAIN,EAAI,GAAIC,EAAIC,EAAY,OAASI,EAAQC,EAE7C,IADAZ,EAAO,UAAU,EACV,EAAEK,EAAIC,GAAGM,EAAaL,EAAYF,CAAC,EAAGL,EAAO,MAAMY,EAAW,CAAC,EAAGA,EAAW,CAAC,EAAGA,EAAW,CAAC,CAAC,EACrGZ,EAAO,QAAQ,CACjB,CAEA,SAASS,GAAcF,EAAaP,EAAQ,CAC1C,IAAIK,EAAI,GAAIC,EAAIC,EAAY,OAE5B,IADAP,EAAO,aAAa,EACb,EAAEK,EAAIC,GAAGE,GAAWD,EAAYF,CAAC,EAAGL,EAAQ,CAAC,EACpDA,EAAO,WAAW,CACpB,CAEe,SAARa,EAAiBV,EAAQH,EAAQ,CAClCG,GAAUD,GAAiB,eAAeC,EAAO,IAAI,EACvDD,GAAiBC,EAAO,IAAI,EAAEA,EAAQH,CAAM,EAE5CF,GAAeK,EAAQH,CAAM,CAEjC,CC/DO,IAAIc,GAAc,IAAIC,EAIzBC,GAAU,IAAID,EACdE,GACAC,GACAC,GACAC,GACAC,GAEOC,GAAa,CACtB,MAAOC,EACP,UAAWA,EACX,QAASA,EACT,aAAc,UAAW,CACvBT,GAAc,IAAIC,EAClBO,GAAW,UAAYE,GACvBF,GAAW,QAAUG,EACvB,EACA,WAAY,UAAW,CACrB,IAAIC,EAAW,CAACZ,GAChBE,GAAQ,IAAIU,EAAW,EAAIC,EAAMD,EAAWA,CAAQ,EACpD,KAAK,UAAY,KAAK,QAAU,KAAK,MAAQH,CAC/C,EACA,OAAQ,UAAW,CACjBP,GAAQ,IAAIW,CAAG,CACjB,CACF,EAEA,SAASH,IAAgB,CACvBF,GAAW,MAAQM,EACrB,CAEA,SAASH,IAAc,CACrBI,GAAUZ,GAAUC,EAAK,CAC3B,CAEA,SAASU,GAAeE,EAAQC,EAAK,CACnCT,GAAW,MAAQO,GACnBZ,GAAWa,EAAQZ,GAAQa,EAC3BD,GAAUE,EAASD,GAAOC,EAC1Bb,GAAUW,EAAQV,GAAUa,EAAIF,EAAMA,EAAM,EAAIG,EAAS,EAAGb,GAAUc,EAAIJ,CAAG,CAC/E,CAEA,SAASF,GAAUC,EAAQC,EAAK,CAC9BD,GAAUE,EAASD,GAAOC,EAC1BD,EAAMA,EAAM,EAAIG,GAKhB,IAAIE,EAAUN,EAASX,GACnBkB,EAAWD,GAAW,EAAI,EAAI,GAC9BE,EAAWD,EAAWD,EACtBG,EAASN,EAAIF,CAAG,EAChBS,EAASL,EAAIJ,CAAG,EAChBU,EAAIpB,GAAUmB,EACdE,EAAItB,GAAUmB,EAASE,EAAIR,EAAIK,CAAQ,EACvCK,EAAIF,EAAIJ,EAAWF,EAAIG,CAAQ,EACnCxB,GAAY,IAAI8B,EAAMD,EAAGD,CAAC,CAAC,EAG3BvB,GAAUW,EAAQV,GAAUmB,EAAQlB,GAAUmB,CAChD,CAEe,SAARK,GAAiBC,EAAQ,CAC9B,OAAA9B,GAAU,IAAID,EACdgC,EAAOD,EAAQxB,EAAU,EAClBN,GAAU,CACnB,CCzEO,SAASgC,GAAUC,EAAW,CACnC,MAAO,CAACC,EAAMD,EAAU,CAAC,EAAGA,EAAU,CAAC,CAAC,EAAGE,EAAKF,EAAU,CAAC,CAAC,CAAC,CAC/D,CAEO,SAASA,GAAUD,EAAW,CACnC,IAAII,EAASJ,EAAU,CAAC,EAAGK,EAAML,EAAU,CAAC,EAAGM,EAASC,EAAIF,CAAG,EAC/D,MAAO,CAACC,EAASC,EAAIH,CAAM,EAAGE,EAASE,EAAIJ,CAAM,EAAGI,EAAIH,CAAG,CAAC,CAC9D,CAEO,SAASI,GAAaC,EAAGC,EAAG,CACjC,OAAOD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,CAC/C,CAEO,SAASC,GAAeF,EAAGC,EAAG,CACnC,MAAO,CAACD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAGD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAGD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,CACzF,CAGO,SAASE,GAAoBH,EAAGC,EAAG,CACxCD,EAAE,CAAC,GAAKC,EAAE,CAAC,EAAGD,EAAE,CAAC,GAAKC,EAAE,CAAC,EAAGD,EAAE,CAAC,GAAKC,EAAE,CAAC,CACzC,CAEO,SAASG,GAAeC,EAAQC,EAAG,CACxC,MAAO,CAACD,EAAO,CAAC,EAAIC,EAAGD,EAAO,CAAC,EAAIC,EAAGD,EAAO,CAAC,EAAIC,CAAC,CACrD,CAGO,SAASC,GAA0BC,EAAG,CAC3C,IAAIC,EAAIC,EAAKF,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,CAAC,EACpDA,EAAE,CAAC,GAAKC,EAAGD,EAAE,CAAC,GAAKC,EAAGD,EAAE,CAAC,GAAKC,CAChC,CC1BA,IAAIE,EAASC,GAAMC,EAASC,GACxBC,GACAC,GAAUC,GACVC,GACAC,GACAC,GACAC,GAEAC,GAAe,CACjB,MAAOC,GACP,UAAWC,GACX,QAASC,GACT,aAAc,UAAW,CACvBH,GAAa,MAAQI,GACrBJ,GAAa,UAAYK,GACzBL,GAAa,QAAUM,GACvBT,GAAW,IAAIU,EACfC,GAAW,aAAa,CAC1B,EACA,WAAY,UAAW,CACrBA,GAAW,WAAW,EACtBR,GAAa,MAAQC,GACrBD,GAAa,UAAYE,GACzBF,GAAa,QAAUG,GACnBM,GAAc,GAAGpB,EAAU,EAAEE,EAAU,KAAMD,GAAO,EAAEE,GAAO,KACxDK,GAAWa,EAASlB,GAAO,GAC3BK,GAAW,CAACa,IAASpB,GAAO,KACrCS,GAAM,CAAC,EAAIV,EAASU,GAAM,CAAC,EAAIR,CACjC,EACA,OAAQ,UAAW,CACjBF,EAAU,EAAEE,EAAU,KAAMD,GAAO,EAAEE,GAAO,GAC9C,CACF,EAEA,SAASS,GAAYU,EAAQC,EAAK,CAChCd,GAAO,KAAKC,GAAQ,CAACV,EAAUsB,EAAQpB,EAAUoB,CAAM,CAAC,EACpDC,EAAMtB,KAAMA,GAAOsB,GACnBA,EAAMpB,KAAMA,GAAOoB,EACzB,CAEA,SAASC,GAAUF,EAAQC,EAAK,CAC9B,IAAIE,EAAIC,GAAU,CAACJ,EAASK,EAASJ,EAAMI,CAAO,CAAC,EACnD,GAAIpB,GAAI,CACN,IAAIqB,EAASC,GAAetB,GAAIkB,CAAC,EAC7BK,EAAa,CAACF,EAAO,CAAC,EAAG,CAACA,EAAO,CAAC,EAAG,CAAC,EACtCG,EAAaF,GAAeC,EAAYF,CAAM,EAClDI,GAA0BD,CAAU,EACpCA,EAAaE,GAAUF,CAAU,EACjC,IAAIG,EAAQZ,EAASlB,GACjB+B,EAAOD,EAAQ,EAAI,EAAI,GACvBE,EAAUL,EAAW,CAAC,EAAIM,EAAUF,EACpCG,EACAC,EAAeC,EAAIN,CAAK,EAAI,IAC5BK,GAAgBJ,EAAO/B,GAAUgC,GAAWA,EAAUD,EAAOb,IAC/DgB,EAAOP,EAAW,CAAC,EAAIM,EACnBC,EAAOnC,KAAMA,GAAOmC,KACfF,GAAWA,EAAU,KAAO,IAAM,IAAKG,GAAgBJ,EAAO/B,GAAUgC,GAAWA,EAAUD,EAAOb,IAC7GgB,EAAO,CAACP,EAAW,CAAC,EAAIM,EACpBC,EAAOrC,KAAMA,GAAOqC,KAEpBf,EAAMtB,KAAMA,GAAOsB,GACnBA,EAAMpB,KAAMA,GAAOoB,KAErBgB,EACEjB,EAASlB,GACPqC,GAAMzC,EAASsB,CAAM,EAAImB,GAAMzC,EAASE,CAAO,IAAGA,EAAUoB,GAE5DmB,GAAMnB,EAAQpB,CAAO,EAAIuC,GAAMzC,EAASE,CAAO,IAAGF,EAAUsB,GAG9DpB,GAAWF,GACTsB,EAAStB,IAASA,EAAUsB,GAC5BA,EAASpB,IAASA,EAAUoB,IAE5BA,EAASlB,GACPqC,GAAMzC,EAASsB,CAAM,EAAImB,GAAMzC,EAASE,CAAO,IAAGA,EAAUoB,GAE5DmB,GAAMnB,EAAQpB,CAAO,EAAIuC,GAAMzC,EAASE,CAAO,IAAGF,EAAUsB,EAIxE,MACEb,GAAO,KAAKC,GAAQ,CAACV,EAAUsB,EAAQpB,EAAUoB,CAAM,CAAC,EAEtDC,EAAMtB,KAAMA,GAAOsB,GACnBA,EAAMpB,KAAMA,GAAOoB,GACvBhB,GAAKkB,EAAGrB,GAAUkB,CACpB,CAEA,SAAST,IAAkB,CACzBF,GAAa,MAAQa,EACvB,CAEA,SAASV,IAAgB,CACvBJ,GAAM,CAAC,EAAIV,EAASU,GAAM,CAAC,EAAIR,EAC/BS,GAAa,MAAQC,GACrBL,GAAK,IACP,CAEA,SAASQ,GAAgBO,EAAQC,EAAK,CACpC,GAAIhB,GAAI,CACN,IAAI2B,EAAQZ,EAASlB,GACrBI,GAAS,IAAIgC,EAAIN,CAAK,EAAI,IAAMA,GAASA,EAAQ,EAAI,IAAM,MAAQA,CAAK,CAC1E,MACE7B,GAAWiB,EAAQhB,GAAQiB,EAE7BJ,GAAW,MAAMG,EAAQC,CAAG,EAC5BC,GAAUF,EAAQC,CAAG,CACvB,CAEA,SAASP,IAAkB,CACzBG,GAAW,UAAU,CACvB,CAEA,SAASF,IAAgB,CACvBF,GAAgBV,GAAUC,EAAK,EAC/Ba,GAAW,QAAQ,EACfqB,EAAIhC,EAAQ,EAAIa,IAASrB,EAAU,EAAEE,EAAU,MACnDQ,GAAM,CAAC,EAAIV,EAASU,GAAM,CAAC,EAAIR,EAC/BK,GAAK,IACP,CAKA,SAASkC,GAAMzC,EAASE,EAAS,CAC/B,OAAQA,GAAWF,GAAW,EAAIE,EAAU,IAAMA,CACpD,CAEA,SAASwC,GAAaC,EAAGC,EAAG,CAC1B,OAAOD,EAAE,CAAC,EAAIC,EAAE,CAAC,CACnB,CAEA,SAASC,GAAcnC,EAAOoC,EAAG,CAC/B,OAAOpC,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAIA,EAAM,CAAC,GAAKoC,GAAKA,GAAKpC,EAAM,CAAC,EAAIoC,EAAIpC,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAIoC,CAC5F,CAEe,SAARC,GAAiBC,EAAS,CAC/B,IAAIC,EAAGC,EAAGP,EAAGC,EAAGO,EAAQC,EAAUlB,EAOlC,GALA/B,GAAOD,EAAU,EAAEF,EAAUC,GAAO,KACpCQ,GAAS,CAAC,EACV4C,EAAOL,EAASrC,EAAY,EAGxBuC,EAAIzC,GAAO,OAAQ,CAIrB,IAHAA,GAAO,KAAKiC,EAAY,EAGnBO,EAAI,EAAGN,EAAIlC,GAAO,CAAC,EAAG0C,EAAS,CAACR,CAAC,EAAGM,EAAIC,EAAG,EAAED,EAChDL,EAAInC,GAAOwC,CAAC,EACRJ,GAAcF,EAAGC,EAAE,CAAC,CAAC,GAAKC,GAAcF,EAAGC,EAAE,CAAC,CAAC,GAC7CH,GAAME,EAAE,CAAC,EAAGC,EAAE,CAAC,CAAC,EAAIH,GAAME,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,IAAGA,EAAE,CAAC,EAAIC,EAAE,CAAC,GACjDH,GAAMG,EAAE,CAAC,EAAGD,EAAE,CAAC,CAAC,EAAIF,GAAME,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,IAAGA,EAAE,CAAC,EAAIC,EAAE,CAAC,IAErDO,EAAO,KAAKR,EAAIC,CAAC,EAMrB,IAAKQ,EAAW,KAAWF,EAAIC,EAAO,OAAS,EAAGF,EAAI,EAAGN,EAAIQ,EAAOD,CAAC,EAAGD,GAAKC,EAAGP,EAAIC,EAAG,EAAEK,EACvFL,EAAIO,EAAOF,CAAC,GACPf,EAAQO,GAAME,EAAE,CAAC,EAAGC,EAAE,CAAC,CAAC,GAAKQ,IAAUA,EAAWlB,EAAOlC,EAAU4C,EAAE,CAAC,EAAG1C,EAAUyC,EAAE,CAAC,EAE/F,CAEA,OAAAlC,GAASC,GAAQ,KAEVV,IAAY,KAAYC,KAAS,IAClC,CAAC,CAAC,IAAK,GAAG,EAAG,CAAC,IAAK,GAAG,CAAC,EACvB,CAAC,CAACD,EAASC,EAAI,EAAG,CAACC,EAASC,EAAI,CAAC,CACzC,CClLe,SAARmD,GAAiBC,EAAGC,EAAG,CAE5B,SAASC,EAAQC,EAAGC,EAAG,CACrB,OAAOD,EAAIH,EAAEG,EAAGC,CAAC,EAAGH,EAAEE,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAClC,CAEA,OAAIH,EAAE,QAAUC,EAAE,SAAQC,EAAQ,OAAS,SAASC,EAAGC,EAAG,CACxD,OAAOD,EAAIF,EAAE,OAAOE,EAAGC,CAAC,EAAGD,GAAKH,EAAE,OAAOG,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CACrD,GAEOD,CACT,CCRA,SAASG,GAAiBC,EAAQC,EAAK,CACrC,OAAIC,EAAIF,CAAM,EAAIG,IAAIH,GAAU,KAAK,MAAMA,EAASI,CAAG,EAAIA,GACpD,CAACJ,EAAQC,CAAG,CACrB,CAEAF,GAAiB,OAASA,GAEnB,SAASM,GAAcC,EAAaC,EAAUC,EAAY,CAC/D,OAAQF,GAAeF,GAAQG,GAAYC,EAAaC,GAAQC,GAAeJ,CAAW,EAAGK,GAAiBJ,EAAUC,CAAU,CAAC,EAC/HE,GAAeJ,CAAW,EACzBC,GAAYC,EAAaG,GAAiBJ,EAAUC,CAAU,EAC/DT,EACN,CAEA,SAASa,GAAsBN,EAAa,CAC1C,OAAO,SAASN,EAAQC,EAAK,CAC3B,OAAAD,GAAUM,EACNJ,EAAIF,CAAM,EAAIG,IAAIH,GAAU,KAAK,MAAMA,EAASI,CAAG,EAAIA,GACpD,CAACJ,EAAQC,CAAG,CACrB,CACF,CAEA,SAASS,GAAeJ,EAAa,CACnC,IAAIO,EAAWD,GAAsBN,CAAW,EAChD,OAAAO,EAAS,OAASD,GAAsB,CAACN,CAAW,EAC7CO,CACT,CAEA,SAASF,GAAiBJ,EAAUC,EAAY,CAC9C,IAAIM,EAAcC,EAAIR,CAAQ,EAC1BS,EAAcC,EAAIV,CAAQ,EAC1BW,EAAgBH,EAAIP,CAAU,EAC9BW,EAAgBF,EAAIT,CAAU,EAElC,SAASK,EAASb,EAAQC,EAAK,CAC7B,IAAImB,EAASL,EAAId,CAAG,EAChBoB,EAAIN,EAAIf,CAAM,EAAIoB,EAClBE,EAAIL,EAAIjB,CAAM,EAAIoB,EAClBG,EAAIN,EAAIhB,CAAG,EACXuB,EAAID,EAAIT,EAAcO,EAAIL,EAC9B,MAAO,CACLS,EAAMH,EAAIJ,EAAgBM,EAAIL,EAAeE,EAAIP,EAAcS,EAAIP,CAAW,EAC9EU,EAAKF,EAAIN,EAAgBI,EAAIH,CAAa,CAC5C,CACF,CAEA,OAAAN,EAAS,OAAS,SAASb,EAAQC,EAAK,CACtC,IAAImB,EAASL,EAAId,CAAG,EAChBoB,EAAIN,EAAIf,CAAM,EAAIoB,EAClBE,EAAIL,EAAIjB,CAAM,EAAIoB,EAClBG,EAAIN,EAAIhB,CAAG,EACXuB,EAAID,EAAIL,EAAgBI,EAAIH,EAChC,MAAO,CACLM,EAAMH,EAAIJ,EAAgBK,EAAIJ,EAAeE,EAAIP,EAAcU,EAAIR,CAAW,EAC9EU,EAAKF,EAAIV,EAAcO,EAAIL,CAAW,CACxC,CACF,EAEOH,CACT,CAEe,SAARc,GAAiBC,EAAQ,CAC9BA,EAASvB,GAAcuB,EAAO,CAAC,EAAIC,EAASD,EAAO,CAAC,EAAIC,EAASD,EAAO,OAAS,EAAIA,EAAO,CAAC,EAAIC,EAAU,CAAC,EAE5G,SAASC,EAAQC,EAAa,CAC5B,OAAAA,EAAcH,EAAOG,EAAY,CAAC,EAAIF,EAASE,EAAY,CAAC,EAAIF,CAAO,EAChEE,EAAY,CAAC,GAAKC,EAASD,EAAY,CAAC,GAAKC,EAASD,CAC/D,CAEA,OAAAD,EAAQ,OAAS,SAASC,EAAa,CACrC,OAAAA,EAAcH,EAAO,OAAOG,EAAY,CAAC,EAAIF,EAASE,EAAY,CAAC,EAAIF,CAAO,EACvEE,EAAY,CAAC,GAAKC,EAASD,EAAY,CAAC,GAAKC,EAASD,CAC/D,EAEOD,CACT,CCxEO,SAASG,GAAaC,EAAQC,EAAQC,EAAOC,EAAWC,EAAIC,EAAI,CACrE,GAAKH,EACL,KAAII,EAAYC,EAAIN,CAAM,EACtBO,EAAYC,EAAIR,CAAM,EACtBS,EAAOP,EAAYD,EACnBE,GAAM,MACRA,EAAKH,EAASE,EAAYQ,EAC1BN,EAAKJ,EAASS,EAAO,IAErBN,EAAKQ,GAAaN,EAAWF,CAAE,EAC/BC,EAAKO,GAAaN,EAAWD,CAAE,GAC3BF,EAAY,EAAIC,EAAKC,EAAKD,EAAKC,KAAID,GAAMD,EAAYQ,IAE3D,QAASE,EAAOC,EAAIV,EAAID,EAAY,EAAIW,EAAIT,EAAKS,EAAIT,EAAIS,GAAKJ,EAC5DG,EAAQE,GAAU,CAACT,EAAW,CAACE,EAAYD,EAAIO,CAAC,EAAG,CAACN,EAAYC,EAAIK,CAAC,CAAC,CAAC,EACvEd,EAAO,MAAMa,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAEnC,CAGA,SAASD,GAAaN,EAAWO,EAAO,CACtCA,EAAQG,GAAUH,CAAK,EAAGA,EAAM,CAAC,GAAKP,EACtCW,GAA0BJ,CAAK,EAC/B,IAAIZ,EAASiB,GAAK,CAACL,EAAM,CAAC,CAAC,EAC3B,QAAS,CAACA,EAAM,CAAC,EAAI,EAAI,CAACZ,EAASA,GAAUU,EAAMQ,GAAWR,CAChE,CC7Be,SAARS,IAAmB,CACxB,IAAIC,EAAQ,CAAC,EACTC,EACJ,MAAO,CACL,MAAO,SAASC,EAAGC,EAAGC,EAAG,CACvBH,EAAK,KAAK,CAACC,EAAGC,EAAGC,CAAC,CAAC,CACrB,EACA,UAAW,UAAW,CACpBJ,EAAM,KAAKC,EAAO,CAAC,CAAC,CACtB,EACA,QAASI,EACT,OAAQ,UAAW,CACbL,EAAM,OAAS,GAAGA,EAAM,KAAKA,EAAM,IAAI,EAAE,OAAOA,EAAM,MAAM,CAAC,CAAC,CACpE,EACA,OAAQ,UAAW,CACjB,IAAIM,EAASN,EACb,OAAAA,EAAQ,CAAC,EACTC,EAAO,KACAK,CACT,CACF,CACF,CCrBe,SAARC,GAAiBC,EAAGC,EAAG,CAC5B,OAAOC,EAAIF,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,EAAIE,GAAWD,EAAIF,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,EAAIE,CAC1D,CCDA,SAASC,GAAaC,EAAOC,EAAQC,EAAOC,EAAO,CACjD,KAAK,EAAIH,EACT,KAAK,EAAIC,EACT,KAAK,EAAIC,EACT,KAAK,EAAIC,EACT,KAAK,EAAI,GACT,KAAK,EAAI,KAAK,EAAI,IACpB,CAKe,SAARC,GAAiBC,EAAUC,EAAqBC,EAAaC,EAAaC,EAAQ,CACvF,IAAIC,EAAU,CAAC,EACXC,EAAO,CAAC,EACRC,EACAC,EAuBJ,GArBAR,EAAS,QAAQ,SAASS,EAAS,CACjC,GAAK,GAAAD,EAAIC,EAAQ,OAAS,IAAM,GAChC,KAAID,EAAGE,EAAKD,EAAQ,CAAC,EAAGE,EAAKF,EAAQD,CAAC,EAAGI,EAEzC,GAAIC,GAAWH,EAAIC,CAAE,EAAG,CACtB,GAAI,CAACD,EAAG,CAAC,GAAK,CAACC,EAAG,CAAC,EAAG,CAEpB,IADAP,EAAO,UAAU,EACZG,EAAI,EAAGA,EAAIC,EAAG,EAAED,EAAGH,EAAO,OAAOM,EAAKD,EAAQF,CAAC,GAAG,CAAC,EAAGG,EAAG,CAAC,CAAC,EAChEN,EAAO,QAAQ,EACf,MACF,CAEAO,EAAG,CAAC,GAAK,EAAIG,CACf,CAEAT,EAAQ,KAAKO,EAAI,IAAIlB,GAAagB,EAAID,EAAS,KAAM,EAAI,CAAC,EAC1DH,EAAK,KAAKM,EAAE,EAAI,IAAIlB,GAAagB,EAAI,KAAME,EAAG,EAAK,CAAC,EACpDP,EAAQ,KAAKO,EAAI,IAAIlB,GAAaiB,EAAIF,EAAS,KAAM,EAAK,CAAC,EAC3DH,EAAK,KAAKM,EAAE,EAAI,IAAIlB,GAAaiB,EAAI,KAAMC,EAAG,EAAI,CAAC,EACrD,CAAC,EAEG,EAACP,EAAQ,OAMb,KAJAC,EAAK,KAAKL,CAAmB,EAC7Bc,GAAKV,CAAO,EACZU,GAAKT,CAAI,EAEJC,EAAI,EAAGC,EAAIF,EAAK,OAAQC,EAAIC,EAAG,EAAED,EACpCD,EAAKC,CAAC,EAAE,EAAIL,EAAc,CAACA,EAO7B,QAJIc,EAAQX,EAAQ,CAAC,EACjBT,EACAD,IAEM,CAIR,QAFIsB,EAAUD,EACVE,EAAY,GACTD,EAAQ,GAAG,IAAKA,EAAUA,EAAQ,KAAOD,EAAO,OACvDpB,EAASqB,EAAQ,EACjBb,EAAO,UAAU,EACjB,EAAG,CAED,GADAa,EAAQ,EAAIA,EAAQ,EAAE,EAAI,GACtBA,EAAQ,EAAG,CACb,GAAIC,EACF,IAAKX,EAAI,EAAGC,EAAIZ,EAAO,OAAQW,EAAIC,EAAG,EAAED,EAAGH,EAAO,OAAOT,EAAQC,EAAOW,CAAC,GAAG,CAAC,EAAGZ,EAAM,CAAC,CAAC,OAExFQ,EAAYc,EAAQ,EAAGA,EAAQ,EAAE,EAAG,EAAGb,CAAM,EAE/Ca,EAAUA,EAAQ,CACpB,KAAO,CACL,GAAIC,EAEF,IADAtB,EAASqB,EAAQ,EAAE,EACdV,EAAIX,EAAO,OAAS,EAAGW,GAAK,EAAG,EAAEA,EAAGH,EAAO,OAAOT,EAAQC,EAAOW,CAAC,GAAG,CAAC,EAAGZ,EAAM,CAAC,CAAC,OAEtFQ,EAAYc,EAAQ,EAAGA,EAAQ,EAAE,EAAG,GAAIb,CAAM,EAEhDa,EAAUA,EAAQ,CACpB,CACAA,EAAUA,EAAQ,EAClBrB,EAASqB,EAAQ,EACjBC,EAAY,CAACA,CACf,OAAS,CAACD,EAAQ,GAClBb,EAAO,QAAQ,CACjB,EACF,CAEA,SAASW,GAAKI,EAAO,CACnB,GAAMX,EAAIW,EAAM,OAKhB,SAJIX,EACAD,EAAI,EACJa,EAAID,EAAM,CAAC,EACXE,EACG,EAAEd,EAAIC,GACXY,EAAE,EAAIC,EAAIF,EAAMZ,CAAC,EACjBc,EAAE,EAAID,EACNA,EAAIC,EAEND,EAAE,EAAIC,EAAIF,EAAM,CAAC,EACjBE,EAAE,EAAID,EACR,CClGA,SAASE,GAAUC,EAAO,CACxB,OAAOC,EAAID,EAAM,CAAC,CAAC,GAAKE,EAAKF,EAAM,CAAC,EAAIG,GAAKH,EAAM,CAAC,CAAC,IAAMC,EAAID,EAAM,CAAC,CAAC,EAAIE,GAAME,EAAMF,EACzF,CAEe,SAARG,GAAiBC,EAASN,EAAO,CACtC,IAAIO,EAASR,GAAUC,CAAK,EACxBQ,EAAMR,EAAM,CAAC,EACbS,EAASC,EAAIF,CAAG,EAChBG,EAAS,CAACD,EAAIH,CAAM,EAAG,CAACK,EAAIL,CAAM,EAAG,CAAC,EACtCM,EAAQ,EACRC,EAAU,EAEVC,EAAM,IAAIC,EAEVP,IAAW,EAAGD,EAAMS,EAASC,EACxBT,IAAW,KAAID,EAAM,CAACS,EAASC,GAExC,QAASC,EAAI,EAAGC,EAAId,EAAQ,OAAQa,EAAIC,EAAG,EAAED,EAC3C,GAAME,GAAKC,EAAOhB,EAAQa,CAAC,GAAG,OAS9B,QARIG,EACAD,EACAE,EAASD,EAAKD,EAAI,CAAC,EACnBG,EAAUzB,GAAUwB,CAAM,EAC1BE,EAAOF,EAAO,CAAC,EAAI,EAAIG,GACvBC,EAAUjB,EAAIe,CAAI,EAClBG,EAAUhB,EAAIa,CAAI,EAEbI,EAAI,EAAGA,EAAIR,EAAG,EAAEQ,EAAGL,EAAUM,EAASH,EAAUI,EAASH,EAAUI,EAAST,EAASU,EAAQ,CACpG,IAAIA,EAASX,EAAKO,CAAC,EACfC,EAAU/B,GAAUkC,CAAM,EAC1BC,EAAOD,EAAO,CAAC,EAAI,EAAIP,GACvBK,EAAUrB,EAAIwB,CAAI,EAClBF,EAAUpB,EAAIsB,CAAI,EAClBC,EAAQL,EAAUN,EAClBrB,EAAOgC,GAAS,EAAI,EAAI,GACxBC,EAAWjC,EAAOgC,EAClBE,EAAeD,EAAWlC,EAC1BoC,GAAIX,EAAUI,EAOlB,GALAhB,EAAI,IAAIwB,EAAMD,GAAInC,EAAOO,EAAI0B,CAAQ,EAAGR,EAAUI,EAAUM,GAAI1B,EAAIwB,CAAQ,CAAC,CAAC,EAC9EvB,GAASwB,EAAeF,EAAQhC,EAAOC,EAAM+B,EAIzCE,EAAeb,GAAWjB,EAASuB,GAAWvB,EAAQ,CACxD,IAAIiC,EAAMC,GAAeC,GAAUnB,CAAM,EAAGmB,GAAUT,CAAM,CAAC,EAC7DU,GAA0BH,CAAG,EAC7B,IAAII,EAAeH,GAAe9B,EAAQ6B,CAAG,EAC7CG,GAA0BC,CAAY,EACtC,IAAIC,GAAUR,EAAeF,GAAS,EAAI,GAAK,GAAKW,EAAKF,EAAa,CAAC,CAAC,GACpEpC,EAAMqC,GAAUrC,IAAQqC,IAAWL,EAAI,CAAC,GAAKA,EAAI,CAAC,MACpD1B,GAAWuB,EAAeF,GAAS,EAAI,EAAI,GAE/C,CACF,CAcF,OAAQtB,EAAQ,CAACK,GAAWL,EAAQK,GAAWH,EAAM,CAACgC,IAAajC,EAAU,CAC/E,CCnEe,SAARkC,GAAiBC,EAAcC,EAAUC,EAAaC,EAAO,CAClE,OAAO,SAASC,EAAM,CACpB,IAAIC,EAAOJ,EAASG,CAAI,EACpBE,EAAaC,GAAW,EACxBC,EAAWP,EAASK,CAAU,EAC9BG,EAAiB,GACjBC,EACAC,EACAC,EAEAC,EAAO,CACT,MAAOC,EACP,UAAWC,EACX,QAASC,EACT,aAAc,UAAW,CACvBH,EAAK,MAAQI,EACbJ,EAAK,UAAYK,EACjBL,EAAK,QAAUM,EACfR,EAAW,CAAC,EACZD,EAAU,CAAC,CACb,EACA,WAAY,UAAW,CACrBG,EAAK,MAAQC,EACbD,EAAK,UAAYE,EACjBF,EAAK,QAAUG,EACfL,EAAWS,GAAMT,CAAQ,EACzB,IAAIU,EAAcC,GAAgBZ,EAASP,CAAK,EAC5CQ,EAAS,QACNF,IAAgBL,EAAK,aAAa,EAAGK,EAAiB,IAC3Dc,GAAWZ,EAAUa,GAAqBH,EAAanB,EAAaE,CAAI,GAC/DiB,IACJZ,IAAgBL,EAAK,aAAa,EAAGK,EAAiB,IAC3DL,EAAK,UAAU,EACfF,EAAY,KAAM,KAAM,EAAGE,CAAI,EAC/BA,EAAK,QAAQ,GAEXK,IAAgBL,EAAK,WAAW,EAAGK,EAAiB,IACxDE,EAAWD,EAAU,IACvB,EACA,OAAQ,UAAW,CACjBN,EAAK,aAAa,EAClBA,EAAK,UAAU,EACfF,EAAY,KAAM,KAAM,EAAGE,CAAI,EAC/BA,EAAK,QAAQ,EACbA,EAAK,WAAW,CAClB,CACF,EAEA,SAASU,EAAMW,EAAQC,EAAK,CACtB1B,EAAayB,EAAQC,CAAG,GAAGtB,EAAK,MAAMqB,EAAQC,CAAG,CACvD,CAEA,SAASC,EAAUF,EAAQC,EAAK,CAC9BrB,EAAK,MAAMoB,EAAQC,CAAG,CACxB,CAEA,SAASX,GAAY,CACnBF,EAAK,MAAQc,EACbtB,EAAK,UAAU,CACjB,CAEA,SAASW,GAAU,CACjBH,EAAK,MAAQC,EACbT,EAAK,QAAQ,CACf,CAEA,SAASY,EAAUQ,EAAQC,EAAK,CAC9Bd,EAAK,KAAK,CAACa,EAAQC,CAAG,CAAC,EACvBlB,EAAS,MAAMiB,EAAQC,CAAG,CAC5B,CAEA,SAASR,GAAY,CACnBV,EAAS,UAAU,EACnBI,EAAO,CAAC,CACV,CAEA,SAASO,GAAU,CACjBF,EAAUL,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,EAChCJ,EAAS,QAAQ,EAEjB,IAAIoB,EAAQpB,EAAS,MAAM,EACvBqB,EAAevB,EAAW,OAAO,EACjCwB,EAAGC,EAAIF,EAAa,OAAQG,EAC5BC,EACAnB,EAMJ,GAJAF,EAAK,IAAI,EACTF,EAAQ,KAAKE,CAAI,EACjBA,EAAO,KAEH,EAACmB,EAGL,IAAIH,EAAQ,EAAG,CAEb,GADAK,EAAUJ,EAAa,CAAC,GACnBG,EAAIC,EAAQ,OAAS,GAAK,EAAG,CAGhC,IAFKxB,IAAgBL,EAAK,aAAa,EAAGK,EAAiB,IAC3DL,EAAK,UAAU,EACV0B,EAAI,EAAGA,EAAIE,EAAG,EAAEF,EAAG1B,EAAK,OAAOU,EAAQmB,EAAQH,CAAC,GAAG,CAAC,EAAGhB,EAAM,CAAC,CAAC,EACpEV,EAAK,QAAQ,CACf,CACA,MACF,CAII2B,EAAI,GAAKH,EAAQ,GAAGC,EAAa,KAAKA,EAAa,IAAI,EAAE,OAAOA,EAAa,MAAM,CAAC,CAAC,EAEzFlB,EAAS,KAAKkB,EAAa,OAAOK,EAAY,CAAC,EACjD,CAEA,OAAOrB,CACT,CACF,CAEA,SAASqB,GAAaD,EAAS,CAC7B,OAAOA,EAAQ,OAAS,CAC1B,CAIA,SAAST,GAAoBW,EAAGC,EAAG,CACjC,QAASD,EAAIA,EAAE,GAAG,CAAC,EAAI,EAAIA,EAAE,CAAC,EAAIE,EAASC,EAAUD,EAASF,EAAE,CAAC,KACxDC,EAAIA,EAAE,GAAG,CAAC,EAAI,EAAIA,EAAE,CAAC,EAAIC,EAASC,EAAUD,EAASD,EAAE,CAAC,EACnE,CC/HA,IAAOG,GAAQC,GACb,UAAW,CAAE,MAAO,EAAM,EAC1BC,GACAC,GACA,CAAC,CAACC,EAAI,CAACC,CAAM,CACf,EAKA,SAASH,GAAqBI,EAAQ,CACpC,IAAIC,EAAU,IACVC,EAAO,IACPC,EAAQ,IACRC,EAEJ,MAAO,CACL,UAAW,UAAW,CACpBJ,EAAO,UAAU,EACjBI,EAAQ,CACV,EACA,MAAO,SAASC,EAASC,EAAM,CAC7B,IAAIC,EAAQF,EAAU,EAAIP,EAAK,CAACA,EAC5BU,EAAQC,EAAIJ,EAAUJ,CAAO,EAC7BQ,EAAID,EAAQV,CAAE,EAAIY,GACpBV,EAAO,MAAMC,EAASC,GAAQA,EAAOI,GAAQ,EAAI,EAAIP,EAAS,CAACA,CAAM,EACrEC,EAAO,MAAMG,EAAOD,CAAI,EACxBF,EAAO,QAAQ,EACfA,EAAO,UAAU,EACjBA,EAAO,MAAMO,EAAOL,CAAI,EACxBF,EAAO,MAAMK,EAASH,CAAI,EAC1BE,EAAQ,GACCD,IAAUI,GAASC,GAASV,IACjCW,EAAIR,EAAUE,CAAK,EAAIO,IAAST,GAAWE,EAAQO,GACnDD,EAAIJ,EAAUE,CAAK,EAAIG,IAASL,GAAWE,EAAQG,GACvDR,EAAOS,GAA0BV,EAASC,EAAMG,EAASC,CAAI,EAC7DN,EAAO,MAAMG,EAAOD,CAAI,EACxBF,EAAO,QAAQ,EACfA,EAAO,UAAU,EACjBA,EAAO,MAAMO,EAAOL,CAAI,EACxBE,EAAQ,GAEVJ,EAAO,MAAMC,EAAUI,EAASH,EAAOI,CAAI,EAC3CH,EAAQI,CACV,EACA,QAAS,UAAW,CAClBP,EAAO,QAAQ,EACfC,EAAUC,EAAO,GACnB,EACA,MAAO,UAAW,CAChB,MAAO,GAAIE,CACb,CACF,CACF,CAEA,SAASO,GAA0BV,EAASC,EAAMG,EAASC,EAAM,CAC/D,IAAIM,EACAC,EACAC,EAAoBC,EAAId,EAAUI,CAAO,EAC7C,OAAOI,EAAIK,CAAiB,EAAIJ,EAC1BM,IAAMD,EAAIb,CAAI,GAAKW,EAAUI,EAAIX,CAAI,GAAKS,EAAIV,CAAO,EACjDU,EAAIT,CAAI,GAAKM,EAAUK,EAAIf,CAAI,GAAKa,EAAId,CAAO,IAC9CW,EAAUC,EAAUC,EAAkB,GAC1CZ,EAAOI,GAAQ,CACxB,CAEA,SAAST,GAA4BqB,EAAMC,EAAIC,EAAWpB,EAAQ,CAChE,IAAIqB,EACJ,GAAIH,GAAQ,KACVG,EAAMD,EAAYrB,EAClBC,EAAO,MAAM,CAACF,EAAIuB,CAAG,EACrBrB,EAAO,MAAM,EAAGqB,CAAG,EACnBrB,EAAO,MAAMF,EAAIuB,CAAG,EACpBrB,EAAO,MAAMF,EAAI,CAAC,EAClBE,EAAO,MAAMF,EAAI,CAACuB,CAAG,EACrBrB,EAAO,MAAM,EAAG,CAACqB,CAAG,EACpBrB,EAAO,MAAM,CAACF,EAAI,CAACuB,CAAG,EACtBrB,EAAO,MAAM,CAACF,EAAI,CAAC,EACnBE,EAAO,MAAM,CAACF,EAAIuB,CAAG,UACZZ,EAAIS,EAAK,CAAC,EAAIC,EAAG,CAAC,CAAC,EAAIT,EAAS,CACzC,IAAIY,EAASJ,EAAK,CAAC,EAAIC,EAAG,CAAC,EAAIrB,EAAK,CAACA,EACrCuB,EAAMD,EAAYE,EAAS,EAC3BtB,EAAO,MAAM,CAACsB,EAAQD,CAAG,EACzBrB,EAAO,MAAM,EAAGqB,CAAG,EACnBrB,EAAO,MAAMsB,EAAQD,CAAG,CAC1B,MACErB,EAAO,MAAMmB,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,CAE7B,CCrFe,SAARI,GAAiBC,EAAQ,CAC9B,IAAIC,EAAKC,EAAIF,CAAM,EACfG,EAAQ,EAAIC,EACZC,EAAcJ,EAAK,EACnBK,EAAgBC,EAAIN,CAAE,EAAIO,EAE9B,SAASC,EAAYC,EAAMC,EAAIC,EAAWC,EAAQ,CAChDC,GAAaD,EAAQb,EAAQG,EAAOS,EAAWF,EAAMC,CAAE,CACzD,CAEA,SAASI,EAAQC,EAAQC,EAAK,CAC5B,OAAOf,EAAIc,CAAM,EAAId,EAAIe,CAAG,EAAIhB,CAClC,CAMA,SAASiB,EAASL,EAAQ,CACxB,IAAIM,EACAC,EACAC,EACAC,EACAC,EACJ,MAAO,CACL,UAAW,UAAW,CACpBD,EAAMD,EAAK,GACXE,EAAQ,CACV,EACA,MAAO,SAASP,EAAQC,EAAK,CAC3B,IAAIO,EAAS,CAACR,EAAQC,CAAG,EACrBQ,EACAC,EAAIX,EAAQC,EAAQC,CAAG,EACvBU,EAAItB,EACAqB,EAAI,EAAIE,EAAKZ,EAAQC,CAAG,EACxBS,EAAIE,EAAKZ,GAAUA,EAAS,EAAIa,EAAK,CAACA,GAAKZ,CAAG,EAAI,EAO1D,GANI,CAACE,IAAWG,EAAMD,EAAKK,IAAIb,EAAO,UAAU,EAC5Ca,IAAML,IACRI,EAASK,EAAUX,EAAQK,CAAM,GAC7B,CAACC,GAAUM,GAAWZ,EAAQM,CAAM,GAAKM,GAAWP,EAAQC,CAAM,KACpED,EAAO,CAAC,EAAI,IAEZE,IAAML,EACRE,EAAQ,EACJG,GAEFb,EAAO,UAAU,EACjBY,EAASK,EAAUN,EAAQL,CAAM,EACjCN,EAAO,MAAMY,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,IAGjCA,EAASK,EAAUX,EAAQK,CAAM,EACjCX,EAAO,MAAMY,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAG,CAAC,EACpCZ,EAAO,QAAQ,GAEjBM,EAASM,UACAnB,GAAiBa,GAAUd,EAAcqB,EAAG,CACrD,IAAIM,EAGA,EAAEL,EAAIP,KAAQY,EAAIF,EAAUN,EAAQL,EAAQ,EAAI,KAClDI,EAAQ,EACJlB,GACFQ,EAAO,UAAU,EACjBA,EAAO,MAAMmB,EAAE,CAAC,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7BnB,EAAO,MAAMmB,EAAE,CAAC,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7BnB,EAAO,QAAQ,IAEfA,EAAO,MAAMmB,EAAE,CAAC,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7BnB,EAAO,QAAQ,EACfA,EAAO,UAAU,EACjBA,EAAO,MAAMmB,EAAE,CAAC,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAE,CAAC,EAAG,CAAC,GAGtC,CACIN,IAAM,CAACP,GAAU,CAACY,GAAWZ,EAAQK,CAAM,IAC7CX,EAAO,MAAMW,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAEnCL,EAASK,EAAQH,EAAKK,EAAGN,EAAKO,CAChC,EACA,QAAS,UAAW,CACdN,GAAIR,EAAO,QAAQ,EACvBM,EAAS,IACX,EAGA,MAAO,UAAW,CAChB,OAAOI,GAAUD,GAAOD,IAAO,CACjC,CACF,CACF,CAGA,SAASS,EAAUG,EAAGC,EAAGC,EAAK,CAC5B,IAAIC,EAAKC,GAAUJ,CAAC,EAChBK,EAAKD,GAAUH,CAAC,EAIhBK,EAAK,CAAC,EAAG,EAAG,CAAC,EACbC,EAAKC,GAAeL,EAAIE,CAAE,EAC1BI,EAAOC,GAAaH,EAAIA,CAAE,EAC1BI,EAAOJ,EAAG,CAAC,EACXK,EAAcH,EAAOE,EAAOA,EAGhC,GAAI,CAACC,EAAa,MAAO,CAACV,GAAOF,EAEjC,IAAIa,EAAM7C,EAAKyC,EAAOG,EAClBE,EAAK,CAAC9C,EAAK2C,EAAOC,EAClBG,EAAQP,GAAeF,EAAIC,CAAE,EAC7BS,EAAIC,GAAeX,EAAIO,CAAE,EACzBK,EAAID,GAAeV,EAAIO,CAAE,EAC7BK,GAAoBH,EAAGE,CAAC,EAGxB,IAAIE,EAAIL,EACJM,EAAIX,GAAaM,EAAGI,CAAC,EACrBE,EAAKZ,GAAaU,EAAGA,CAAC,EACtBG,GAAKF,EAAIA,EAAIC,GAAMZ,GAAaM,EAAGA,CAAC,EAAI,GAE5C,GAAI,EAAAO,GAAK,GAET,KAAIxB,EAAIyB,EAAKD,EAAE,EACXE,EAAIR,GAAeG,GAAI,CAACC,EAAItB,GAAKuB,CAAE,EAIvC,GAHAH,GAAoBM,EAAGT,CAAC,EACxBS,EAAIC,GAAUD,CAAC,EAEX,CAACvB,EAAK,OAAOuB,EAGjB,IAAIE,EAAU3B,EAAE,CAAC,EACb4B,EAAU3B,EAAE,CAAC,EACb4B,EAAO7B,EAAE,CAAC,EACV8B,GAAO7B,EAAE,CAAC,EACV8B,GAEAH,EAAUD,IAASI,GAAIJ,EAASA,EAAUC,EAASA,EAAUG,IAEjE,IAAI7D,GAAQ0D,EAAUD,EAClBK,GAAQ1D,EAAIJ,GAAQ0B,CAAE,EAAIrB,EAC1B0D,GAAWD,IAAS9D,GAAQK,EAKhC,GAHI,CAACyD,IAASF,GAAOD,IAAME,GAAIF,EAAMA,EAAOC,GAAMA,GAAOC,IAGrDE,GACED,GACEH,EAAOC,GAAO,EAAIL,EAAE,CAAC,GAAKnD,EAAImD,EAAE,CAAC,EAAIE,CAAO,EAAIpD,EAAUsD,EAAOC,IACjED,GAAQJ,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAKK,GAC1B5D,GAAQ0B,GAAM+B,GAAWF,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAKG,GAAU,CACvD,IAAIM,GAAKjB,GAAeG,GAAI,CAACC,EAAItB,GAAKuB,CAAE,EACxC,OAAAH,GAAoBe,GAAIlB,CAAC,EAClB,CAACS,EAAGC,GAAUQ,EAAE,CAAC,CAC1B,EACF,CAIA,SAASvC,EAAKZ,EAAQC,EAAK,CACzB,IAAImD,EAAI/D,EAAcL,EAAS6B,EAAK7B,EAChC4B,EAAO,EACX,OAAIZ,EAAS,CAACoD,EAAGxC,GAAQ,EAChBZ,EAASoD,IAAGxC,GAAQ,GACzBX,EAAM,CAACmD,EAAGxC,GAAQ,EACbX,EAAMmD,IAAGxC,GAAQ,GACnBA,CACT,CAEA,OAAOyC,GAAKtD,EAASG,EAAUT,EAAaJ,EAAc,CAAC,EAAG,CAACL,CAAM,EAAI,CAAC,CAAC6B,EAAI7B,EAAS6B,CAAE,CAAC,CAC7F,CChLe,SAARyC,GAAiBC,EAAGC,EAAGC,EAAIC,EAAIC,EAAIC,EAAI,CAC5C,IAAIC,EAAKN,EAAE,CAAC,EACRO,EAAKP,EAAE,CAAC,EACRQ,EAAKP,EAAE,CAAC,EACRQ,EAAKR,EAAE,CAAC,EACRS,EAAK,EACLC,EAAK,EACLC,EAAKJ,EAAKF,EACVO,EAAKJ,EAAKF,EACVO,EAGJ,GADAA,EAAIZ,EAAKI,EACL,GAACM,GAAME,EAAI,GAEf,IADAA,GAAKF,EACDA,EAAK,EAAG,CACV,GAAIE,EAAIJ,EAAI,OACRI,EAAIH,IAAIA,EAAKG,EACnB,SAAWF,EAAK,EAAG,CACjB,GAAIE,EAAIH,EAAI,OACRG,EAAIJ,IAAIA,EAAKI,EACnB,CAGA,GADAA,EAAIV,EAAKE,EACL,GAACM,GAAME,EAAI,GAEf,IADAA,GAAKF,EACDA,EAAK,EAAG,CACV,GAAIE,EAAIH,EAAI,OACRG,EAAIJ,IAAIA,EAAKI,EACnB,SAAWF,EAAK,EAAG,CACjB,GAAIE,EAAIJ,EAAI,OACRI,EAAIH,IAAIA,EAAKG,EACnB,CAGA,GADAA,EAAIX,EAAKI,EACL,GAACM,GAAMC,EAAI,GAEf,IADAA,GAAKD,EACDA,EAAK,EAAG,CACV,GAAIC,EAAIJ,EAAI,OACRI,EAAIH,IAAIA,EAAKG,EACnB,SAAWD,EAAK,EAAG,CACjB,GAAIC,EAAIH,EAAI,OACRG,EAAIJ,IAAIA,EAAKI,EACnB,CAGA,GADAA,EAAIT,EAAKE,EACL,GAACM,GAAMC,EAAI,GAEf,IADAA,GAAKD,EACDA,EAAK,EAAG,CACV,GAAIC,EAAIH,EAAI,OACRG,EAAIJ,IAAIA,EAAKI,EACnB,SAAWD,EAAK,EAAG,CACjB,GAAIC,EAAIJ,EAAI,OACRI,EAAIH,IAAIA,EAAKG,EACnB,CAEA,OAAIJ,EAAK,IAAGV,EAAE,CAAC,EAAIM,EAAKI,EAAKE,EAAIZ,EAAE,CAAC,EAAIO,EAAKG,EAAKG,GAC9CF,EAAK,IAAGV,EAAE,CAAC,EAAIK,EAAKK,EAAKC,EAAIX,EAAE,CAAC,EAAIM,EAAKI,EAAKE,GAC3C,MACT,CCpDA,IAAIE,GAAU,IAAKC,GAAU,CAACD,GAKf,SAARE,GAA+BC,EAAIC,EAAIC,EAAIC,EAAI,CAEpD,SAASC,EAAQC,EAAGC,EAAG,CACrB,OAAON,GAAMK,GAAKA,GAAKH,GAAMD,GAAMK,GAAKA,GAAKH,CAC/C,CAEA,SAASI,EAAYC,EAAMC,EAAIC,EAAWC,EAAQ,CAChD,IAAIC,EAAI,EAAGC,EAAK,EAChB,GAAIL,GAAQ,OACJI,EAAIE,EAAON,EAAME,CAAS,MAAQG,EAAKC,EAAOL,EAAIC,CAAS,IAC5DK,EAAaP,EAAMC,CAAE,EAAI,EAAIC,EAAY,EAC9C,GAAGC,EAAO,MAAMC,IAAM,GAAKA,IAAM,EAAIZ,EAAKE,EAAIU,EAAI,EAAIT,EAAKF,CAAE,SACrDW,GAAKA,EAAIF,EAAY,GAAK,KAAOG,QAEzCF,EAAO,MAAMF,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,CAE7B,CAEA,SAASK,EAAOE,EAAGN,EAAW,CAC5B,OAAOO,EAAID,EAAE,CAAC,EAAIhB,CAAE,EAAIkB,EAAUR,EAAY,EAAI,EAAI,EAChDO,EAAID,EAAE,CAAC,EAAId,CAAE,EAAIgB,EAAUR,EAAY,EAAI,EAAI,EAC/CO,EAAID,EAAE,CAAC,EAAIf,CAAE,EAAIiB,EAAUR,EAAY,EAAI,EAAI,EAC/CA,EAAY,EAAI,EAAI,CAC5B,CAEA,SAASS,EAAoBP,EAAGQ,EAAG,CACjC,OAAOL,EAAaH,EAAE,EAAGQ,EAAE,CAAC,CAC9B,CAEA,SAASL,EAAaH,EAAGQ,EAAG,CAC1B,IAAIC,EAAKP,EAAOF,EAAG,CAAC,EAChBU,EAAKR,EAAOM,EAAG,CAAC,EACpB,OAAOC,IAAOC,EAAKD,EAAKC,EAClBD,IAAO,EAAID,EAAE,CAAC,EAAIR,EAAE,CAAC,EACrBS,IAAO,EAAIT,EAAE,CAAC,EAAIQ,EAAE,CAAC,EACrBC,IAAO,EAAIT,EAAE,CAAC,EAAIQ,EAAE,CAAC,EACrBA,EAAE,CAAC,EAAIR,EAAE,CAAC,CAClB,CAEA,OAAO,SAASD,EAAQ,CACtB,IAAIY,EAAeZ,EACfa,EAAeC,GAAW,EAC1BC,EACAC,EACAC,EACAC,EAAKC,EAAKC,EACVC,EAAIC,EAAIC,EACRC,EACAC,EAEAC,EAAa,CACf,MAAOC,EACP,UAAWC,GACX,QAASC,EACT,aAAcC,EACd,WAAYC,CACd,EAEA,SAASJ,EAAMjC,EAAGC,EAAG,CACfF,EAAQC,EAAGC,CAAC,GAAGiB,EAAa,MAAMlB,EAAGC,CAAC,CAC5C,CAEA,SAASqC,GAAgB,CAGvB,QAFIC,EAAU,EAELC,EAAI,EAAGC,EAAInB,EAAQ,OAAQkB,EAAIC,EAAG,EAAED,EAC3C,QAASjB,GAAOD,EAAQkB,CAAC,EAAGE,GAAI,EAAGC,GAAIpB,GAAK,OAAQU,GAAQV,GAAK,CAAC,EAAGqB,GAAIpC,GAAIqC,GAAKZ,GAAM,CAAC,EAAGa,GAAKb,GAAM,CAAC,EAAGS,GAAIC,GAAG,EAAED,GAClHE,GAAKC,GAAIrC,GAAKsC,GAAIb,GAAQV,GAAKmB,EAAC,EAAGG,GAAKZ,GAAM,CAAC,EAAGa,GAAKb,GAAM,CAAC,EAC1DzB,IAAMV,EAAUgD,GAAKhD,IAAO+C,GAAKD,KAAO9C,EAAKU,KAAOsC,GAAKtC,KAAOb,EAAKiD,KAAK,EAAEL,EACrEO,IAAMhD,IAAO+C,GAAKD,KAAO9C,EAAKU,KAAOsC,GAAKtC,KAAOb,EAAKiD,KAAK,EAAEL,EAI5E,OAAOA,CACT,CAGA,SAASH,GAAe,CACtBlB,EAAeC,EAAcE,EAAW,CAAC,EAAGC,EAAU,CAAC,EAAGS,EAAQ,EACpE,CAEA,SAASM,GAAa,CACpB,IAAIU,EAAcT,EAAc,EAC5BU,EAAcjB,GAASgB,EACvBhD,GAAWsB,EAAW4B,GAAM5B,CAAQ,GAAG,QACvC2B,GAAejD,KACjBO,EAAO,aAAa,EAChB0C,IACF1C,EAAO,UAAU,EACjBJ,EAAY,KAAM,KAAM,EAAGI,CAAM,EACjCA,EAAO,QAAQ,GAEbP,GACFmD,GAAW7B,EAAUP,EAAqBiC,EAAa7C,EAAaI,CAAM,EAE5EA,EAAO,WAAW,GAEpBY,EAAeZ,EAAQe,EAAWC,EAAUC,EAAO,IACrD,CAEA,SAASW,IAAY,CACnBF,EAAW,MAAQmB,EACf7B,GAASA,EAAQ,KAAKC,EAAO,CAAC,CAAC,EACnCO,EAAQ,GACRD,EAAK,GACLF,EAAKC,EAAK,GACZ,CAKA,SAASO,GAAU,CACbd,IACF8B,EAAU3B,EAAKC,CAAG,EACdC,GAAOG,GAAIV,EAAa,OAAO,EACnCE,EAAS,KAAKF,EAAa,OAAO,CAAC,GAErCa,EAAW,MAAQC,EACfJ,GAAIX,EAAa,QAAQ,CAC/B,CAEA,SAASiC,EAAUnD,EAAGC,EAAG,CACvB,IAAImD,EAAIrD,EAAQC,EAAGC,CAAC,EAEpB,GADIqB,GAASC,EAAK,KAAK,CAACvB,EAAGC,CAAC,CAAC,EACzB6B,EACFN,EAAMxB,EAAGyB,EAAMxB,EAAGyB,EAAM0B,EACxBtB,EAAQ,GACJsB,IACFlC,EAAa,UAAU,EACvBA,EAAa,MAAMlB,EAAGC,CAAC,WAGrBmD,GAAKvB,EAAIX,EAAa,MAAMlB,EAAGC,CAAC,MAC/B,CACH,IAAIM,GAAI,CAACoB,EAAK,KAAK,IAAIlC,GAAS,KAAK,IAAID,GAASmC,CAAE,CAAC,EAAGC,EAAK,KAAK,IAAInC,GAAS,KAAK,IAAID,GAASoC,CAAE,CAAC,CAAC,EACjGb,GAAI,CAACf,EAAI,KAAK,IAAIP,GAAS,KAAK,IAAID,GAASQ,CAAC,CAAC,EAAGC,EAAI,KAAK,IAAIR,GAAS,KAAK,IAAID,GAASS,CAAC,CAAC,CAAC,EAC7FoD,GAAS9C,GAAGQ,GAAGpB,EAAIC,EAAIC,EAAIC,CAAE,GAC1B+B,IACHX,EAAa,UAAU,EACvBA,EAAa,MAAMX,GAAE,CAAC,EAAGA,GAAE,CAAC,CAAC,GAE/BW,EAAa,MAAMH,GAAE,CAAC,EAAGA,GAAE,CAAC,CAAC,EACxBqC,GAAGlC,EAAa,QAAQ,EAC7Ba,EAAQ,IACCqB,IACTlC,EAAa,UAAU,EACvBA,EAAa,MAAMlB,EAAGC,CAAC,EACvB8B,EAAQ,GAEZ,CAEFJ,EAAK3B,EAAG4B,EAAK3B,EAAG4B,EAAKuB,CACvB,CAEA,OAAOpB,CACT,CACF,CCvKA,IAAOsB,GAAQC,GAAKA,ECIpB,IAAIC,GAAU,IAAIC,EACdC,GAAc,IAAID,EAClBE,GACAC,GACAC,GACAC,GAEAC,GAAa,CACf,MAAOC,EACP,UAAWA,EACX,QAASA,EACT,aAAc,UAAW,CACvBD,GAAW,UAAYE,GACvBF,GAAW,QAAUG,EACvB,EACA,WAAY,UAAW,CACrBH,GAAW,UAAYA,GAAW,QAAUA,GAAW,MAAQC,EAC/DR,GAAQ,IAAIW,EAAIT,EAAW,CAAC,EAC5BA,GAAc,IAAID,CACpB,EACA,OAAQ,UAAW,CACjB,IAAIW,EAAOZ,GAAU,EACrB,OAAAA,GAAU,IAAIC,EACPW,CACT,CACF,EAEA,SAASH,IAAgB,CACvBF,GAAW,MAAQM,EACrB,CAEA,SAASA,GAAeC,EAAGC,EAAG,CAC5BR,GAAW,MAAQS,GACnBb,GAAME,GAAKS,EAAGV,GAAME,GAAKS,CAC3B,CAEA,SAASC,GAAUF,EAAGC,EAAG,CACvBb,GAAY,IAAII,GAAKQ,EAAIT,GAAKU,CAAC,EAC/BV,GAAKS,EAAGR,GAAKS,CACf,CAEA,SAASL,IAAc,CACrBM,GAAUb,GAAKC,EAAG,CACpB,CAEA,IAAOa,GAAQV,GC/Cf,IAAIW,GAAK,IACLC,GAAKD,GACLE,GAAK,CAACF,GACNG,GAAKD,GAELE,GAAe,CACjB,MAAOC,GACP,UAAWC,EACX,QAASA,EACT,aAAcA,EACd,WAAYA,EACZ,OAAQ,UAAW,CACjB,IAAIC,EAAS,CAAC,CAACP,GAAIC,EAAE,EAAG,CAACC,GAAIC,EAAE,CAAC,EAChC,OAAAD,GAAKC,GAAK,EAAEF,GAAKD,GAAK,KACfO,CACT,CACF,EAEA,SAASF,GAAYG,EAAGC,EAAG,CACrBD,EAAIR,KAAIA,GAAKQ,GACbA,EAAIN,KAAIA,GAAKM,GACbC,EAAIR,KAAIA,GAAKQ,GACbA,EAAIN,KAAIA,GAAKM,EACnB,CAEA,IAAOC,GAAQN,GCvBf,IAAIO,GAAK,EACLC,GAAK,EACLC,GAAK,EACLC,GAAK,EACLC,GAAK,EACLC,GAAK,EACLC,GAAK,EACLC,GAAK,EACLC,GAAK,EACLC,GACAC,GACAC,GACAC,GAEAC,GAAiB,CACnB,MAAOC,GACP,UAAWC,GACX,QAASC,GACT,aAAc,UAAW,CACvBH,GAAe,UAAYI,GAC3BJ,GAAe,QAAUK,EAC3B,EACA,WAAY,UAAW,CACrBL,GAAe,MAAQC,GACvBD,GAAe,UAAYE,GAC3BF,GAAe,QAAUG,EAC3B,EACA,OAAQ,UAAW,CACjB,IAAIG,EAAWX,GAAK,CAACF,GAAKE,GAAID,GAAKC,EAAE,EAC/BH,GAAK,CAACF,GAAKE,GAAID,GAAKC,EAAE,EACtBH,GAAK,CAACF,GAAKE,GAAID,GAAKC,EAAE,EACtB,CAAC,IAAK,GAAG,EACf,OAAAF,GAAKC,GAAKC,GACVC,GAAKC,GAAKC,GACVC,GAAKC,GAAKC,GAAK,EACRW,CACT,CACF,EAEA,SAASL,GAAcM,EAAGC,EAAG,CAC3BrB,IAAMoB,EACNnB,IAAMoB,EACN,EAAEnB,EACJ,CAEA,SAASa,IAAoB,CAC3BF,GAAe,MAAQS,EACzB,CAEA,SAASA,GAAuBF,EAAGC,EAAG,CACpCR,GAAe,MAAQU,GACvBT,GAAcH,GAAKS,EAAGR,GAAKS,CAAC,CAC9B,CAEA,SAASE,GAAkBH,EAAGC,EAAG,CAC/B,IAAIG,EAAKJ,EAAIT,GAAIc,EAAKJ,EAAIT,GAAIc,EAAIC,EAAKH,EAAKA,EAAKC,EAAKA,CAAE,EACxDtB,IAAMuB,GAAKf,GAAKS,GAAK,EACrBhB,IAAMsB,GAAKd,GAAKS,GAAK,EACrBhB,IAAMqB,EACNZ,GAAcH,GAAKS,EAAGR,GAAKS,CAAC,CAC9B,CAEA,SAASL,IAAkB,CACzBH,GAAe,MAAQC,EACzB,CAEA,SAASG,IAAoB,CAC3BJ,GAAe,MAAQe,EACzB,CAEA,SAASV,IAAkB,CACzBW,GAAkBpB,GAAKC,EAAG,CAC5B,CAEA,SAASkB,GAAuBR,EAAGC,EAAG,CACpCR,GAAe,MAAQgB,GACvBf,GAAcL,GAAME,GAAKS,EAAGV,GAAME,GAAKS,CAAC,CAC1C,CAEA,SAASQ,GAAkBT,EAAGC,EAAG,CAC/B,IAAIG,EAAKJ,EAAIT,GACTc,EAAKJ,EAAIT,GACTc,EAAIC,EAAKH,EAAKA,EAAKC,EAAKA,CAAE,EAE9BtB,IAAMuB,GAAKf,GAAKS,GAAK,EACrBhB,IAAMsB,GAAKd,GAAKS,GAAK,EACrBhB,IAAMqB,EAENA,EAAId,GAAKQ,EAAIT,GAAKU,EAClBf,IAAMoB,GAAKf,GAAKS,GAChBb,IAAMmB,GAAKd,GAAKS,GAChBb,IAAMkB,EAAI,EACVZ,GAAcH,GAAKS,EAAGR,GAAKS,CAAC,CAC9B,CAEA,IAAOS,GAAQjB,GChGA,SAARkB,GAA6BC,EAAS,CAC3C,KAAK,SAAWA,CAClB,CAEAD,GAAY,UAAY,CACtB,QAAS,IACT,YAAa,SAASE,EAAG,CACvB,OAAO,KAAK,QAAUA,EAAG,IAC3B,EACA,aAAc,UAAW,CACvB,KAAK,MAAQ,CACf,EACA,WAAY,UAAW,CACrB,KAAK,MAAQ,GACf,EACA,UAAW,UAAW,CACpB,KAAK,OAAS,CAChB,EACA,QAAS,UAAW,CACd,KAAK,QAAU,GAAG,KAAK,SAAS,UAAU,EAC9C,KAAK,OAAS,GAChB,EACA,MAAO,SAASC,EAAGC,EAAG,CACpB,OAAQ,KAAK,OAAQ,CACnB,IAAK,GAAG,CACN,KAAK,SAAS,OAAOD,EAAGC,CAAC,EACzB,KAAK,OAAS,EACd,KACF,CACA,IAAK,GAAG,CACN,KAAK,SAAS,OAAOD,EAAGC,CAAC,EACzB,KACF,CACA,QAAS,CACP,KAAK,SAAS,OAAOD,EAAI,KAAK,QAASC,CAAC,EACxC,KAAK,SAAS,IAAID,EAAGC,EAAG,KAAK,QAAS,EAAGC,CAAG,EAC5C,KACF,CACF,CACF,EACA,OAAQC,CACV,ECxCA,IAAIC,GAAY,IAAIC,EAChBC,GACAC,GACAC,GACAC,GACAC,GAEAC,GAAe,CACjB,MAAOC,EACP,UAAW,UAAW,CACpBD,GAAa,MAAQE,EACvB,EACA,QAAS,UAAW,CACdP,IAAYQ,GAAYP,GAAKC,EAAG,EACpCG,GAAa,MAAQC,CACvB,EACA,aAAc,UAAW,CACvBN,GAAa,EACf,EACA,WAAY,UAAW,CACrBA,GAAa,IACf,EACA,OAAQ,UAAW,CACjB,IAAIS,EAAS,CAACX,GACd,OAAAA,GAAY,IAAIC,EACTU,CACT,CACF,EAEA,SAASF,GAAiBG,EAAGC,EAAG,CAC9BN,GAAa,MAAQG,GACrBP,GAAME,GAAKO,EAAGR,GAAME,GAAKO,CAC3B,CAEA,SAASH,GAAYE,EAAGC,EAAG,CACzBR,IAAMO,EAAGN,IAAMO,EACfb,GAAU,IAAIc,EAAKT,GAAKA,GAAKC,GAAKA,EAAE,CAAC,EACrCD,GAAKO,EAAGN,GAAKO,CACf,CAEA,IAAOE,GAAQR,GC3Cf,IAAIS,GAAaC,GAAaC,GAAaC,GAEtBC,GAArB,KAAgC,CAC9B,YAAYC,EAAQ,CAClB,KAAK,QAAUA,GAAU,KAAOC,GAASC,GAAYF,CAAM,EAC3D,KAAK,QAAU,IACf,KAAK,EAAI,EACX,CACA,YAAYG,EAAG,CACb,YAAK,QAAU,CAACA,EACT,IACT,CACA,cAAe,CACb,KAAK,MAAQ,CACf,CACA,YAAa,CACX,KAAK,MAAQ,GACf,CACA,WAAY,CACV,KAAK,OAAS,CAChB,CACA,SAAU,CACJ,KAAK,QAAU,IAAG,KAAK,GAAK,KAChC,KAAK,OAAS,GAChB,CACA,MAAMC,EAAGC,EAAG,CACV,OAAQ,KAAK,OAAQ,CACnB,IAAK,GAAG,CACN,KAAK,WAAWD,CAAC,IAAIC,CAAC,GACtB,KAAK,OAAS,EACd,KACF,CACA,IAAK,GAAG,CACN,KAAK,WAAWD,CAAC,IAAIC,CAAC,GACtB,KACF,CACA,QAAS,CAEP,GADA,KAAK,WAAWD,CAAC,IAAIC,CAAC,GAClB,KAAK,UAAYR,IAAe,KAAK,UAAYD,GAAa,CAChE,IAAM,EAAI,KAAK,QACTU,EAAI,KAAK,EACf,KAAK,EAAI,GACT,KAAK,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAI,CAAC,IAC1ET,GAAc,EACdD,GAAc,KAAK,QACnBE,GAAc,KAAK,EACnB,KAAK,EAAIQ,CACX,CACA,KAAK,GAAKR,GACV,KACF,CACF,CACF,CACA,QAAS,CACP,IAAMS,EAAS,KAAK,EACpB,YAAK,EAAI,GACFA,EAAO,OAASA,EAAS,IAClC,CACF,EAEA,SAASN,GAAOO,EAAS,CACvB,IAAIC,EAAI,EACR,KAAK,GAAKD,EAAQ,CAAC,EACnB,QAAWE,EAAIF,EAAQ,OAAQC,EAAIC,EAAG,EAAED,EACtC,KAAK,GAAK,UAAUA,CAAC,EAAID,EAAQC,CAAC,CAEtC,CAEA,SAASP,GAAYF,EAAQ,CAC3B,IAAMW,EAAI,KAAK,MAAMX,CAAM,EAC3B,GAAI,EAAEW,GAAK,GAAI,MAAM,IAAI,WAAW,mBAAmBX,CAAM,EAAE,EAC/D,GAAIW,EAAI,GAAI,OAAOV,GACnB,GAAIU,IAAMhB,GAAa,CACrB,IAAMiB,EAAI,IAAMD,EAChBhB,GAAcgB,EACdf,GAAc,SAAgBY,EAAS,CACrC,IAAI,EAAI,EACR,KAAK,GAAKA,EAAQ,CAAC,EACnB,QAAWE,EAAIF,EAAQ,OAAQ,EAAIE,EAAG,EAAE,EACtC,KAAK,GAAK,KAAK,MAAM,UAAU,CAAC,EAAIE,CAAC,EAAIA,EAAIJ,EAAQ,CAAC,CAE1D,CACF,CACA,OAAOZ,EACT,CC5Ee,SAARiB,GAAiBC,EAAYC,EAAS,CAC3C,IAAIC,EAAS,EACTC,EAAc,IACdC,EACAC,EAEJ,SAASC,EAAKC,EAAQ,CACpB,OAAIA,IACE,OAAOJ,GAAgB,YAAYE,EAAc,YAAY,CAACF,EAAY,MAAM,KAAM,SAAS,CAAC,EACpGK,EAAOD,EAAQH,EAAiBC,CAAa,CAAC,GAEzCA,EAAc,OAAO,CAC9B,CAEA,OAAAC,EAAK,KAAO,SAASC,EAAQ,CAC3B,OAAAC,EAAOD,EAAQH,EAAiBK,EAAQ,CAAC,EAClCA,GAAS,OAAO,CACzB,EAEAH,EAAK,QAAU,SAASC,EAAQ,CAC9B,OAAAC,EAAOD,EAAQH,EAAiBM,EAAW,CAAC,EACrCA,GAAY,OAAO,CAC5B,EAEAJ,EAAK,OAAS,SAASC,EAAQ,CAC7B,OAAAC,EAAOD,EAAQH,EAAiBO,EAAU,CAAC,EACpCA,GAAW,OAAO,CAC3B,EAEAL,EAAK,SAAW,SAASC,EAAQ,CAC/B,OAAAC,EAAOD,EAAQH,EAAiBQ,EAAY,CAAC,EACtCA,GAAa,OAAO,CAC7B,EAEAN,EAAK,WAAa,SAASO,EAAG,CAC5B,OAAK,UAAU,QACfT,EAAmBS,GAAK,MAAQb,EAAa,KAAMc,KAAad,EAAaa,GAAG,OACzEP,GAFuBN,CAGhC,EAEAM,EAAK,QAAU,SAASO,EAAG,CACzB,OAAK,UAAU,QACfR,EAAgBQ,GAAK,MAAQZ,EAAU,KAAM,IAAIc,GAAWb,CAAM,GAAK,IAAIc,GAAYf,EAAUY,CAAC,EAC9F,OAAOV,GAAgB,YAAYE,EAAc,YAAYF,CAAW,EACrEG,GAHuBL,CAIhC,EAEAK,EAAK,YAAc,SAASO,EAAG,CAC7B,OAAK,UAAU,QACfV,EAAc,OAAOU,GAAM,WAAaA,GAAKR,EAAc,YAAY,CAACQ,CAAC,EAAG,CAACA,GACtEP,GAFuBH,CAGhC,EAEAG,EAAK,OAAS,SAASO,EAAG,CACxB,GAAI,CAAC,UAAU,OAAQ,OAAOX,EAC9B,GAAIW,GAAK,KAAMX,EAAS,SACnB,CACH,IAAMe,EAAI,KAAK,MAAMJ,CAAC,EACtB,GAAI,EAAEI,GAAK,GAAI,MAAM,IAAI,WAAW,mBAAmBJ,CAAC,EAAE,EAC1DX,EAASe,CACX,CACA,OAAIhB,IAAY,OAAMI,EAAgB,IAAIU,GAAWb,CAAM,GACpDI,CACT,EAEOA,EAAK,WAAWN,CAAU,EAAE,OAAOE,CAAM,EAAE,QAAQD,CAAO,CACnE,CCrEO,SAASiB,GAAYC,EAAS,CACnC,OAAO,SAASC,EAAQ,CACtB,IAAIC,EAAI,IAAIC,GACZ,QAASC,KAAOJ,EAASE,EAAEE,CAAG,EAAIJ,EAAQI,CAAG,EAC7C,OAAAF,EAAE,OAASD,EACJC,CACT,CACF,CAEA,SAASC,IAAkB,CAAC,CAE5BA,GAAgB,UAAY,CAC1B,YAAaA,GACb,MAAO,SAASE,EAAGC,EAAG,CAAE,KAAK,OAAO,MAAMD,EAAGC,CAAC,CAAG,EACjD,OAAQ,UAAW,CAAE,KAAK,OAAO,OAAO,CAAG,EAC3C,UAAW,UAAW,CAAE,KAAK,OAAO,UAAU,CAAG,EACjD,QAAS,UAAW,CAAE,KAAK,OAAO,QAAQ,CAAG,EAC7C,aAAc,UAAW,CAAE,KAAK,OAAO,aAAa,CAAG,EACvD,WAAY,UAAW,CAAE,KAAK,OAAO,WAAW,CAAG,CACrD,ECtBA,SAASC,GAAIC,EAAYC,EAAWC,EAAQ,CAC1C,IAAIC,EAAOH,EAAW,YAAcA,EAAW,WAAW,EAC1D,OAAAA,EAAW,MAAM,GAAG,EAAE,UAAU,CAAC,EAAG,CAAC,CAAC,EAClCG,GAAQ,MAAMH,EAAW,WAAW,IAAI,EAC5CI,EAAUF,EAAQF,EAAW,OAAOK,EAAY,CAAC,EACjDJ,EAAUI,GAAa,OAAO,CAAC,EAC3BF,GAAQ,MAAMH,EAAW,WAAWG,CAAI,EACrCH,CACT,CAEO,SAASM,GAAUN,EAAYO,EAAQL,EAAQ,CACpD,OAAOH,GAAIC,EAAY,SAASQ,EAAG,CACjC,IAAIC,EAAIF,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EAC9BG,EAAIH,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EAC9BI,EAAI,KAAK,IAAIF,GAAKD,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,GAAIE,GAAKF,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,EAAE,EAC7DI,EAAI,CAACL,EAAO,CAAC,EAAE,CAAC,GAAKE,EAAIE,GAAKH,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,IAAM,EACpDK,EAAI,CAACN,EAAO,CAAC,EAAE,CAAC,GAAKG,EAAIC,GAAKH,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,IAAM,EACxDR,EAAW,MAAM,IAAMW,CAAC,EAAE,UAAU,CAACC,EAAGC,CAAC,CAAC,CAC5C,EAAGX,CAAM,CACX,CAEO,SAASY,GAAQd,EAAYe,EAAMb,EAAQ,CAChD,OAAOI,GAAUN,EAAY,CAAC,CAAC,EAAG,CAAC,EAAGe,CAAI,EAAGb,CAAM,CACrD,CAEO,SAASc,GAAShB,EAAYiB,EAAOf,EAAQ,CAClD,OAAOH,GAAIC,EAAY,SAASQ,EAAG,CACjC,IAAIC,EAAI,CAACQ,EACLN,EAAIF,GAAKD,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,GACzBI,GAAKH,EAAIE,GAAKH,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,IAAM,EACpCK,EAAI,CAACF,EAAIH,EAAE,CAAC,EAAE,CAAC,EACnBR,EAAW,MAAM,IAAMW,CAAC,EAAE,UAAU,CAACC,EAAGC,CAAC,CAAC,CAC5C,EAAGX,CAAM,CACX,CAEO,SAASgB,GAAUlB,EAAYmB,EAAQjB,EAAQ,CACpD,OAAOH,GAAIC,EAAY,SAASQ,EAAG,CACjC,IAAIE,EAAI,CAACS,EACLR,EAAID,GAAKF,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,GACzBI,EAAI,CAACD,EAAIH,EAAE,CAAC,EAAE,CAAC,EACfK,GAAKH,EAAIC,GAAKH,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,IAAM,EACxCR,EAAW,MAAM,IAAMW,CAAC,EAAE,UAAU,CAACC,EAAGC,CAAC,CAAC,CAC5C,EAAGX,CAAM,CACX,CC1CA,IAAIkB,GAAW,GACXC,GAAiBC,EAAI,GAAKC,CAAO,EAEtB,SAARC,GAAiBC,EAASC,EAAQ,CACvC,MAAO,CAACA,EAASC,GAASF,EAASC,CAAM,EAAIE,GAAaH,CAAO,CACnE,CAEA,SAASG,GAAaH,EAAS,CAC7B,OAAOI,GAAY,CACjB,MAAO,SAASC,EAAGC,EAAG,CACpBD,EAAIL,EAAQK,EAAGC,CAAC,EAChB,KAAK,OAAO,MAAMD,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAC9B,CACF,CAAC,CACH,CAEA,SAASH,GAASF,EAASC,EAAQ,CAEjC,SAASM,EAAeC,EAAIC,EAAIC,EAASC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAASC,EAAIC,EAAIC,EAAIC,EAAOC,EAAQ,CAC/F,IAAIC,EAAKR,EAAKN,EACVe,EAAKR,EAAKN,EACVe,EAAKF,EAAKA,EAAKC,EAAKA,EACxB,GAAIC,EAAK,EAAIvB,GAAUmB,IAAS,CAC9B,IAAIK,EAAId,EAAKM,EACTS,EAAId,EAAKM,EACTS,EAAId,EAAKM,EACTS,EAAIC,EAAKJ,EAAIA,EAAIC,EAAIA,EAAIC,EAAIA,CAAC,EAC9BG,EAAOC,EAAKJ,GAAKC,CAAC,EAClBI,EAAUC,EAAIA,EAAIN,CAAC,EAAI,CAAC,EAAIO,GAAWD,EAAIvB,EAAUM,CAAO,EAAIkB,GAAWxB,EAAUM,GAAW,EAAImB,EAAMT,EAAGD,CAAC,EAC9GW,EAAIpC,EAAQgC,EAASF,CAAI,EACzBO,EAAKD,EAAE,CAAC,EACRE,GAAKF,EAAE,CAAC,EACRG,EAAMF,EAAK7B,EACXgC,EAAMF,GAAK7B,EACXgC,EAAKlB,EAAKgB,EAAMjB,EAAKkB,GACrBC,EAAKA,EAAKjB,EAAKvB,GACZgC,GAAKX,EAAKiB,EAAMhB,EAAKiB,GAAOhB,EAAK,EAAG,EAAI,IACxCb,EAAKM,EAAKL,EAAKM,EAAKL,EAAKM,EAAKvB,MACnCW,EAAeC,EAAIC,EAAIC,EAASC,EAAIC,EAAIC,EAAIwB,EAAIC,GAAIN,EAASP,GAAKG,EAAGF,GAAKE,EAAGD,EAAGP,EAAOC,CAAM,EAC7FA,EAAO,MAAMgB,EAAIC,EAAE,EACnB/B,EAAe8B,EAAIC,GAAIN,EAASP,EAAGC,EAAGC,EAAGb,EAAIC,EAAIC,EAASC,EAAIC,EAAIC,EAAIC,EAAOC,CAAM,EAEvF,CACF,CACA,OAAO,SAASA,EAAQ,CACtB,IAAIqB,EAAUC,EAAKC,EAAKC,EAAKC,EAAKC,EAC9BrC,EAASF,EAAIC,EAAIE,EAAIC,EAAIC,EAEzBmC,EAAiB,CACnB,MAAOC,EACP,UAAWC,EACX,QAASC,EACT,aAAc,UAAW,CAAE9B,EAAO,aAAa,EAAG2B,EAAe,UAAYI,CAAW,EACxF,WAAY,UAAW,CAAE/B,EAAO,WAAW,EAAG2B,EAAe,UAAYE,CAAW,CACtF,EAEA,SAASD,EAAM5C,EAAGC,EAAG,CACnBD,EAAIL,EAAQK,EAAGC,CAAC,EAChBe,EAAO,MAAMhB,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CACzB,CAEA,SAAS6C,GAAY,CACnB1C,EAAK,IACLwC,EAAe,MAAQK,EACvBhC,EAAO,UAAU,CACnB,CAEA,SAASgC,EAAUC,EAAQC,EAAK,CAC9B,IAAI5B,EAAI6B,GAAU,CAACF,EAAQC,CAAG,CAAC,EAAGnB,EAAIpC,EAAQsD,EAAQC,CAAG,EACzDhD,EAAeC,EAAIC,EAAIC,EAASC,EAAIC,EAAIC,EAAIL,EAAK4B,EAAE,CAAC,EAAG3B,EAAK2B,EAAE,CAAC,EAAG1B,EAAU4C,EAAQ3C,EAAKgB,EAAE,CAAC,EAAGf,EAAKe,EAAE,CAAC,EAAGd,EAAKc,EAAE,CAAC,EAAGhC,GAAU0B,CAAM,EACrIA,EAAO,MAAMb,EAAIC,CAAE,CACrB,CAEA,SAAS0C,GAAU,CACjBH,EAAe,MAAQC,EACvB5B,EAAO,QAAQ,CACjB,CAEA,SAAS+B,GAAY,CACnBF,EAAU,EACVF,EAAe,MAAQS,EACvBT,EAAe,QAAUU,CAC3B,CAEA,SAASD,EAAUH,EAAQC,EAAK,CAC9BF,EAAUX,EAAWY,EAAQC,CAAG,EAAGZ,EAAMnC,EAAIoC,EAAMnC,EAAIoC,EAAMlC,EAAImC,EAAMlC,EAAImC,EAAMlC,EACjFmC,EAAe,MAAQK,CACzB,CAEA,SAASK,GAAU,CACjBnD,EAAeC,EAAIC,EAAIC,EAASC,EAAIC,EAAIC,EAAI8B,EAAKC,EAAKF,EAAUG,EAAKC,EAAKC,EAAKpD,GAAU0B,CAAM,EAC/F2B,EAAe,QAAUG,EACzBA,EAAQ,CACV,CAEA,OAAOH,CACT,CACF,CC1FA,IAAIW,GAAmBC,GAAY,CACjC,MAAO,SAASC,EAAGC,EAAG,CACpB,KAAK,OAAO,MAAMD,EAAIE,EAASD,EAAIC,CAAO,CAC5C,CACF,CAAC,EAED,SAASC,GAAgBC,EAAQ,CAC/B,OAAOL,GAAY,CACjB,MAAO,SAASC,EAAGC,EAAG,CACpB,IAAI,EAAIG,EAAOJ,EAAGC,CAAC,EACnB,OAAO,KAAK,OAAO,MAAM,EAAE,CAAC,EAAG,EAAE,CAAC,CAAC,CACrC,CACF,CAAC,CACH,CAEA,SAASI,GAAeC,EAAGC,EAAIC,EAAIC,EAAIC,EAAI,CACzC,SAASC,EAAUX,EAAGC,EAAG,CACvB,OAAAD,GAAKS,EAAIR,GAAKS,EACP,CAACH,EAAKD,EAAIN,EAAGQ,EAAKF,EAAIL,CAAC,CAChC,CACA,OAAAU,EAAU,OAAS,SAASX,EAAGC,EAAG,CAChC,MAAO,EAAED,EAAIO,GAAMD,EAAIG,GAAKD,EAAKP,GAAKK,EAAII,CAAE,CAC9C,EACOC,CACT,CAEA,SAASC,GAAqBN,EAAGC,EAAIC,EAAIC,EAAIC,EAAIG,EAAO,CACtD,GAAI,CAACA,EAAO,OAAOR,GAAeC,EAAGC,EAAIC,EAAIC,EAAIC,CAAE,EACnD,IAAII,EAAWC,EAAIF,CAAK,EACpBG,EAAWC,EAAIJ,CAAK,EACpBK,EAAIJ,EAAWR,EACfa,EAAIH,EAAWV,EACfc,EAAKN,EAAWR,EAChBe,EAAKL,EAAWV,EAChBgB,GAAMN,EAAWR,EAAKM,EAAWP,GAAMD,EACvCiB,GAAMP,EAAWT,EAAKO,EAAWN,GAAMF,EAC3C,SAASK,EAAUX,EAAG,EAAG,CACvB,OAAAA,GAAKS,EAAI,GAAKC,EACP,CAACQ,EAAIlB,EAAImB,EAAI,EAAIZ,EAAIC,EAAKW,EAAInB,EAAIkB,EAAI,CAAC,CAChD,CACA,OAAAP,EAAU,OAAS,SAASX,EAAG,EAAG,CAChC,MAAO,CAACS,GAAMW,EAAKpB,EAAIqB,EAAK,EAAIC,GAAKZ,GAAMa,EAAKF,EAAKrB,EAAIoB,EAAK,EAAE,CAClE,EACOT,CACT,CAEe,SAARa,GAA4BC,EAAS,CAC1C,OAAOC,GAAkB,UAAW,CAAE,OAAOD,CAAS,CAAC,EAAE,CAC3D,CAEO,SAASC,GAAkBC,EAAW,CAC3C,IAAIF,EACAnB,EAAI,IACJN,EAAI,IAAKC,EAAI,IACb2B,EAAS,EAAGC,EAAM,EAClBC,EAAc,EAAGC,EAAW,EAAGC,EAAa,EAAG5B,EAC/CS,EAAQ,EACRJ,EAAK,EACLC,EAAK,EACLuB,EAAQ,KAAMC,EAAUC,GACxBC,EAAK,KAAMC,EAAIC,EAAIC,EAAIC,EAAWC,GAClCC,EAAS,GACTC,EACAC,EACAC,EACAC,EACAC,EAEJ,SAASvB,EAAWwB,EAAO,CACzB,OAAOH,EAAuBG,EAAM,CAAC,EAAI9C,EAAS8C,EAAM,CAAC,EAAI9C,CAAO,CACtE,CAEA,SAAS+C,GAAOD,EAAO,CACrB,OAAAA,EAAQH,EAAuB,OAAOG,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACjDA,GAAS,CAACA,EAAM,CAAC,EAAIE,EAASF,EAAM,CAAC,EAAIE,CAAO,CACzD,CAEA1B,EAAW,OAAS,SAAS2B,EAAQ,CACnC,OAAOL,GAASC,IAAgBI,EAASL,EAAQA,EAAQhD,GAAiBK,GAAgBC,CAAM,EAAE8B,EAAQS,EAAgBH,EAASO,EAAcI,CAAM,CAAC,CAAC,CAAC,CAAC,CAC7J,EAEA3B,EAAW,QAAU,SAAS4B,EAAG,CAC/B,OAAO,UAAU,QAAUlB,EAAUkB,EAAGnB,EAAQ,OAAWoB,EAAM,GAAKnB,CACxE,EAEAV,EAAW,SAAW,SAAS4B,EAAG,CAChC,OAAO,UAAU,QAAUZ,EAAWY,EAAGhB,EAAKC,EAAKC,EAAKC,EAAK,KAAMc,EAAM,GAAKb,CAChF,EAEAhB,EAAW,UAAY,SAAS4B,EAAG,CACjC,OAAO,UAAU,QAAUlB,EAAU,CAACkB,EAAIE,GAAWrB,EAAQmB,EAAIlD,CAAO,GAAK+B,EAAQ,KAAME,IAAmBkB,EAAM,GAAKpB,EAAQiB,CACnI,EAEA1B,EAAW,WAAa,SAAS4B,EAAG,CAClC,OAAO,UAAU,QAAUZ,EAAWY,GAAK,MAAQhB,EAAKC,EAAKC,EAAKC,EAAK,KAAME,IAAYc,GAAcnB,EAAK,CAACgB,EAAE,CAAC,EAAE,CAAC,EAAGf,EAAK,CAACe,EAAE,CAAC,EAAE,CAAC,EAAGd,EAAK,CAACc,EAAE,CAAC,EAAE,CAAC,EAAGb,EAAK,CAACa,EAAE,CAAC,EAAE,CAAC,CAAC,EAAGC,EAAM,GAAKjB,GAAM,KAAO,KAAO,CAAC,CAACA,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,CAAC,CACxN,EAEAf,EAAW,MAAQ,SAAS4B,EAAG,CAC7B,OAAO,UAAU,QAAU9C,EAAI,CAAC8C,EAAGI,EAAS,GAAKlD,CACnD,EAEAkB,EAAW,UAAY,SAAS4B,EAAG,CACjC,OAAO,UAAU,QAAUpD,EAAI,CAACoD,EAAE,CAAC,EAAGnD,EAAI,CAACmD,EAAE,CAAC,EAAGI,EAAS,GAAK,CAACxD,EAAGC,CAAC,CACtE,EAEAuB,EAAW,OAAS,SAAS4B,EAAG,CAC9B,OAAO,UAAU,QAAUxB,EAASwB,EAAE,CAAC,EAAI,IAAMlD,EAAS2B,EAAMuB,EAAE,CAAC,EAAI,IAAMlD,EAASsD,EAAS,GAAK,CAAC5B,EAASsB,EAASrB,EAAMqB,CAAO,CACtI,EAEA1B,EAAW,OAAS,SAAS4B,EAAG,CAC9B,OAAO,UAAU,QAAUtB,EAAcsB,EAAE,CAAC,EAAI,IAAMlD,EAAS6B,EAAWqB,EAAE,CAAC,EAAI,IAAMlD,EAAS8B,EAAaoB,EAAE,OAAS,EAAIA,EAAE,CAAC,EAAI,IAAMlD,EAAU,EAAGsD,EAAS,GAAK,CAAC1B,EAAcoB,EAASnB,EAAWmB,EAASlB,EAAakB,CAAO,CACtO,EAEA1B,EAAW,MAAQ,SAAS4B,EAAG,CAC7B,OAAO,UAAU,QAAUvC,EAAQuC,EAAI,IAAMlD,EAASsD,EAAS,GAAK3C,EAAQqC,CAC9E,EAEA1B,EAAW,SAAW,SAAS4B,EAAG,CAChC,OAAO,UAAU,QAAU3C,EAAK2C,EAAI,GAAK,EAAGI,EAAS,GAAK/C,EAAK,CACjE,EAEAe,EAAW,SAAW,SAAS4B,EAAG,CAChC,OAAO,UAAU,QAAU1C,EAAK0C,EAAI,GAAK,EAAGI,EAAS,GAAK9C,EAAK,CACjE,EAEAc,EAAW,UAAY,SAAS4B,EAAG,CACjC,OAAO,UAAU,QAAUT,EAAkBc,GAASb,EAAkBF,EAASU,EAAIA,CAAC,EAAGC,EAAM,GAAKK,EAAKhB,CAAM,CACjH,EAEAlB,EAAW,UAAY,SAASmC,EAAQC,EAAQ,CAC9C,OAAOC,GAAUrC,EAAYmC,EAAQC,CAAM,CAC7C,EAEApC,EAAW,QAAU,SAASsC,EAAMF,EAAQ,CAC1C,OAAOG,GAAQvC,EAAYsC,EAAMF,CAAM,CACzC,EAEApC,EAAW,SAAW,SAASwC,EAAOJ,EAAQ,CAC5C,OAAOK,GAASzC,EAAYwC,EAAOJ,CAAM,CAC3C,EAEApC,EAAW,UAAY,SAAS0C,EAAQN,EAAQ,CAC9C,OAAOO,GAAU3C,EAAY0C,EAAQN,CAAM,CAC7C,EAEA,SAASJ,GAAW,CAClB,IAAIY,EAASxD,GAAqBN,EAAG,EAAG,EAAGG,EAAIC,EAAIG,CAAK,EAAE,MAAM,KAAMY,EAAQG,EAAQC,CAAG,CAAC,EACtFlB,EAAYC,GAAqBN,EAAGN,EAAIoE,EAAO,CAAC,EAAGnE,EAAImE,EAAO,CAAC,EAAG3D,EAAIC,EAAIG,CAAK,EACnF,OAAAT,EAASiE,GAAcvC,EAAaC,EAAUC,CAAU,EACxDY,EAAmB0B,GAAQ7C,EAASd,CAAS,EAC7CkC,EAAyByB,GAAQlE,EAAQwC,CAAgB,EACzDD,EAAkBc,GAASb,EAAkBF,CAAM,EAC5CW,EAAM,CACf,CAEA,SAASA,GAAQ,CACf,OAAAP,EAAQC,EAAc,KACfvB,CACT,CAEA,OAAO,UAAW,CAChB,OAAAC,EAAUE,EAAU,MAAM,KAAM,SAAS,EACzCH,EAAW,OAASC,EAAQ,QAAUwB,GAC/BO,EAAS,CAClB,CACF,CC7KO,SAASe,GAAgBC,EAAW,CACzC,IAAIC,EAAO,EACPC,EAAOC,EAAK,EACZC,EAAIC,GAAkBL,CAAS,EAC/BM,EAAIF,EAAEH,EAAMC,CAAI,EAEpB,OAAAI,EAAE,UAAY,SAASC,EAAG,CACxB,OAAO,UAAU,OAASH,EAAEH,EAAOM,EAAE,CAAC,EAAIC,EAASN,EAAOK,EAAE,CAAC,EAAIC,CAAO,EAAI,CAACP,EAAOQ,EAASP,EAAOO,CAAO,CAC7G,EAEOH,CACT,CCZO,SAASI,GAAwBC,EAAM,CAC5C,IAAIC,EAAUC,EAAIF,CAAI,EAEtB,SAASG,EAAQC,EAAQC,EAAK,CAC5B,MAAO,CAACD,EAASH,EAASK,EAAID,CAAG,EAAIJ,CAAO,CAC9C,CAEA,OAAAE,EAAQ,OAAS,SAASI,EAAGC,EAAG,CAC9B,MAAO,CAACD,EAAIN,EAASQ,EAAKD,EAAIP,CAAO,CAAC,CACxC,EAEOE,CACT,CCVO,SAASO,GAAkBC,EAAIC,EAAI,CACxC,IAAIC,EAAMC,EAAIH,CAAE,EAAGI,GAAKF,EAAMC,EAAIF,CAAE,GAAK,EAGzC,GAAII,EAAID,CAAC,EAAIE,EAAS,OAAOC,GAAwBP,CAAE,EAEvD,IAAIQ,EAAI,EAAIN,GAAO,EAAIE,EAAIF,GAAMO,EAAKC,EAAKF,CAAC,EAAIJ,EAEhD,SAASO,EAAQC,EAAGC,EAAG,CACrB,IAAIC,EAAIJ,EAAKF,EAAI,EAAIJ,EAAID,EAAIU,CAAC,CAAC,EAAIT,EACnC,MAAO,CAACU,EAAIX,EAAIS,GAAKR,CAAC,EAAGK,EAAKK,EAAIC,EAAIH,CAAC,CAAC,CAC1C,CAEA,OAAAD,EAAQ,OAAS,SAASC,EAAGC,EAAG,CAC9B,IAAIG,EAAMP,EAAKI,EACXI,EAAIC,EAAMN,EAAGP,EAAIW,CAAG,CAAC,EAAIG,GAAKH,CAAG,EACrC,OAAIA,EAAMZ,EAAI,IACZa,GAAKG,EAAKD,GAAKP,CAAC,EAAIO,GAAKH,CAAG,GACvB,CAACC,EAAIb,EAAGiB,GAAMb,GAAKI,EAAIA,EAAII,EAAMA,GAAOZ,EAAIA,IAAM,EAAIA,EAAE,CAAC,CAClE,EAEOO,CACT,CAEe,SAARW,IAAmB,CACxB,OAAOC,GAAgBxB,EAAiB,EACnC,MAAM,OAAO,EACb,OAAO,CAAC,EAAG,OAAO,CAAC,CAC1B,CCjBO,SAASyB,GAAgBC,EAAO,CACrC,OAAO,SAASC,EAAGC,EAAG,CACpB,IAAIC,EAAIC,EAAKH,EAAIA,EAAIC,EAAIA,CAAC,EACtBG,EAAIL,EAAMG,CAAC,EACXG,EAAKC,EAAIF,CAAC,EACVG,EAAKC,EAAIJ,CAAC,EACd,MAAO,CACLK,EAAMT,EAAIK,EAAIH,EAAIK,CAAE,EACpBG,EAAKR,GAAKD,EAAII,EAAKH,CAAC,CACtB,CACF,CACF,CCtBO,SAASS,GAAYC,EAAQC,EAAK,CACvC,MAAO,CAACD,EAAQE,GAAIC,IAAKC,EAASH,GAAO,CAAC,CAAC,CAAC,CAC9C,CAEAF,GAAY,OAAS,SAASM,EAAGC,EAAG,CAClC,MAAO,CAACD,EAAG,EAAIE,GAAKC,GAAIF,CAAC,CAAC,EAAIF,CAAM,CACtC,EAEe,SAARK,IAAmB,CACxB,OAAOC,GAAmBX,EAAW,EAChC,MAAM,IAAMY,CAAG,CACtB,CAEO,SAASD,GAAmBE,EAAS,CAC1C,IAAIC,EAAIC,GAAWF,CAAO,EACtBG,EAASF,EAAE,OACXG,EAAQH,EAAE,MACVI,EAAYJ,EAAE,UACdK,EAAaL,EAAE,WACfM,EAAK,KAAMC,EAAIC,EAAIC,EAEvBT,EAAE,MAAQ,SAASU,EAAG,CACpB,OAAO,UAAU,QAAUP,EAAMO,CAAC,EAAGC,EAAO,GAAKR,EAAM,CACzD,EAEAH,EAAE,UAAY,SAASU,EAAG,CACxB,OAAO,UAAU,QAAUN,EAAUM,CAAC,EAAGC,EAAO,GAAKP,EAAU,CACjE,EAEAJ,EAAE,OAAS,SAASU,EAAG,CACrB,OAAO,UAAU,QAAUR,EAAOQ,CAAC,EAAGC,EAAO,GAAKT,EAAO,CAC3D,EAEAF,EAAE,WAAa,SAASU,EAAG,CACzB,OAAO,UAAU,QAAWA,GAAK,KAAOJ,EAAKC,EAAKC,EAAKC,EAAK,MAAQH,EAAK,CAACI,EAAE,CAAC,EAAE,CAAC,EAAGH,EAAK,CAACG,EAAE,CAAC,EAAE,CAAC,EAAGF,EAAK,CAACE,EAAE,CAAC,EAAE,CAAC,EAAGD,EAAK,CAACC,EAAE,CAAC,EAAE,CAAC,GAAKC,EAAO,GAAKL,GAAM,KAAO,KAAO,CAAC,CAACA,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,CAAC,CACvL,EAEA,SAASE,GAAS,CAChB,IAAIC,EAAIC,EAAKV,EAAM,EACfW,EAAId,EAAEe,GAASf,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAG,CAAC,CAAC,CAAC,EAC7C,OAAOK,EAAWC,GAAM,KAClB,CAAC,CAACQ,EAAE,CAAC,EAAIF,EAAGE,EAAE,CAAC,EAAIF,CAAC,EAAG,CAACE,EAAE,CAAC,EAAIF,EAAGE,EAAE,CAAC,EAAIF,CAAC,CAAC,EAAIb,IAAYb,GAC3D,CAAC,CAAC,KAAK,IAAI4B,EAAE,CAAC,EAAIF,EAAGN,CAAE,EAAGC,CAAE,EAAG,CAAC,KAAK,IAAIO,EAAE,CAAC,EAAIF,EAAGJ,CAAE,EAAGC,CAAE,CAAC,EAC3D,CAAC,CAACH,EAAI,KAAK,IAAIQ,EAAE,CAAC,EAAIF,EAAGL,CAAE,CAAC,EAAG,CAACC,EAAI,KAAK,IAAIM,EAAE,CAAC,EAAIF,EAAGH,CAAE,CAAC,CAAC,CAAC,CACpE,CAEA,OAAOE,EAAO,CAChB,CCjDO,SAASK,GAAmBC,EAAQC,EAAK,CAC9C,MAAO,CAACD,EAAQC,CAAG,CACrB,CAEAF,GAAmB,OAASA,GAEb,SAARG,IAAmB,CACxB,OAAOC,GAAWJ,EAAkB,EAC/B,MAAM,MAAM,CACnB,CCPO,SAASK,GAAgBC,EAAGC,EAAG,CACpC,MAAO,CAACC,EAAID,CAAC,EAAIE,EAAIH,CAAC,EAAGG,EAAIF,CAAC,CAAC,CACjC,CAEAF,GAAgB,OAASK,GAAgBC,CAAI,EAE9B,SAARC,IAAmB,CACxB,OAAOC,GAAWR,EAAe,EAC5B,MAAM,KAAK,EACX,UAAU,GAAKS,CAAO,CAC7B,CCXO,IAAMC,GAAkB,EA0E/B,SAASC,GAAUC,EAAmBC,EAAa,CAACC,EAAIC,CAAE,EAAqB,CAACC,EAAIC,CAAE,EAAmB,CACrG,IAAMC,EAAQN,EAAQ,OAAS,EACzBO,EAAS,IAAI,aAAaD,EAAQ,CAAC,EACnCE,EAAU,IAAI,WAAWF,CAAK,EAChCG,EAAI,EACJC,EAAI,EACR,QAASC,EAAI,EAAGA,EAAIL,EAAOK,IACvBF,GAAKT,EAAQW,EAAI,CAAC,EAClBD,GAAKV,EAAQW,EAAI,EAAI,CAAC,EACtBJ,EAAOI,EAAI,CAAC,EAAIF,EAAIP,EAAKE,EACzBG,EAAOI,EAAI,EAAI,CAAC,EAAID,EAAIP,EAAKE,EAC7BG,EAAQG,CAAC,EAAIX,EAAQW,EAAI,EAAI,CAAC,EAElC,MAAO,CAAE,IAAAV,EAAK,OAAAM,EAAQ,QAAAC,CAAO,CACjC,CAEM,SAAUI,GAAgBC,EAA2B,CACvD,IAAMC,EAA0B,CAAA,EAChC,OAAW,CAAE,IAAAC,EAAK,SAAAC,CAAQ,IAAMH,EAAM,CAClC,IAAMI,EAAIF,EAAI,QAAQ,OACtB,QAASG,EAAIJ,EAAI,SAAW,EAAI,EAAI,EAAGI,EAAID,EAAGC,IAAK,CAC/C,IAAMP,EAAIK,EAAWC,EAAI,EAAIC,EAAIA,EACjCJ,EAAI,KAAK,CAACC,EAAI,OAAOJ,EAAI,CAAC,EAAGI,EAAI,OAAOJ,EAAI,EAAI,CAAC,CAAC,CAAC,CACvD,CACJ,CACA,OAAOG,CACX,CAGM,SAAUK,GAASN,EAA2B,CAChD,IAAMO,EAAcR,GAAgBC,CAAI,EACxC,GAAIO,EAAY,OAAS,EAAG,MAAO,GACnC,IAAMC,EAAOC,GAAQ,CAAE,KAAM,UAAW,YAAa,CAACF,CAAW,CAAC,CAAE,EACpE,OAAOC,EAAO,EAAI,KAAK,GAAK,EAAI,KAAK,GAAKA,EAAOA,CACrD,CAEM,SAAUE,GAAcC,EAAiB,CAC3C,GAAIA,EAAK,SAAW1B,GAChB,MAAM,IAAI,MAAM,mBAAmB0B,EAAK,MAAM,+BAA+B1B,EAAe,GAAG,EAEnG,IAAM2B,EAAOD,EAAK,KAAK,IAAI,CAACxB,EAAS,IACjCD,GAAUC,EAASwB,EAAK,OAAO,CAAC,EAAGA,EAAK,UAAU,MAAOA,EAAK,UAAU,SAAS,CAAC,EAEhFE,EAAOC,GACTA,EAAQ,EAAI,CAAE,IAAKF,EAAK,CAACE,CAAK,EAAG,SAAU,EAAI,EAAK,CAAE,IAAKF,EAAKE,CAAK,EAAG,SAAU,EAAK,EAErFC,EAAW,IAAI,IACrB,QAAWC,KAAKL,EAAK,SAAU,CAC3B,IAAMM,EAAWD,EAAE,SAAW,IAAI,IAAIA,EAAE,QAAQ,EAAI,KACpDD,EAAS,IAAIC,EAAE,KAAM,CACjB,KAAMA,EAAE,KACR,KAAMA,EAAE,KACR,OAAQA,EAAE,QAAUA,EAAE,KACtB,OAAQA,EAAE,OACV,MAAOA,EAAE,MACT,OAAQA,EAAE,OACV,OAAQA,EAAE,SAAW,GACrB,SAAUA,EAAE,SAAS,IAAI,CAACE,EAAOpB,IAAK,CAClC,IAAMqB,EAAWD,EAAM,IAAKlB,GAASA,EAAK,IAAIa,CAAG,CAAC,EAClD,MAAO,CACH,MAAOM,EACP,UAAWA,EAAS,IAAI,CAACnB,EAAMoB,IAAOA,IAAM,EAAIJ,EAAE,MAAMlB,CAAC,EAAIQ,GAASN,CAAI,CAAE,EAC5E,KAAMgB,EAAE,MAAMlB,CAAC,EACf,SAAUmB,IAAa,MAAQA,EAAS,IAAInB,CAAC,EAErD,CAAC,EACJ,CACL,CACA,MAAO,CAAE,SAAAiB,CAAQ,CACrB,CClJA,OACI,QAAAM,GACA,cAAAC,GACA,aAAAC,GACA,QAAAC,GACA,YAAAC,OASG,qBACP,OAAS,aAAAC,OAAiB,+BCoC1B,IAAMC,GAAM,KAMNC,GAAa,EACbC,GAAc,EACdC,GAAe,IACfC,GAAgB,EAEhBC,GAAWC,GAAmBA,EAAQ,EAAI,EAAIA,EAAQ,EAAIA,EAAQ,EAGlE,SAAUC,GAAiBC,EAAgBC,EAAY,CACzD,GAAID,GAAU,GAAK,EAAEC,EAAO,GAAI,MAAO,KACvC,IAAMC,EAAYD,EAAO,IAAM,EAAER,GAAaC,GAAcG,GAAQG,CAAM,GAC1E,OAAO,KAAK,MAAM,GAAK,KAAK,KAAKE,CAAS,CAAC,CAC/C,CAGM,SAAUC,GAAiBH,EAAgBC,EAAY,CACzD,OAAID,GAAU,EAAU,EACjBC,EAAO,IAAM,EAAEN,GAAeC,GAAgBC,GAAQG,CAAM,EACvE,CAEA,SAASI,GAAQC,EAAiCC,EAAe,CAC7D,IAAMC,EAAgB,CAAA,EACtB,QAAWC,KAAWH,EAAU,CAC5B,IAAMI,EAAWH,IAAU,WAAaE,EAAQ,SAAS,OAAQE,GAAMA,EAAE,QAAQ,EAAI,CAAA,EAC/EC,EAAWF,EAAS,OAAS,EAAIA,EAAWD,EAAQ,SACtDI,EAA6B,KACjC,QAAWC,KAAWF,GAAc,CAACC,GAAWC,EAAQ,KAAOD,EAAQ,QAAMA,EAAUC,GACvF,QAAWA,KAAWF,EAAUJ,EAAM,KAAK,CAAE,QAAAM,EAAS,QAASA,IAAYD,CAAO,CAAE,CACxF,CACA,OAAOL,CACX,CAEA,SAASO,GAAgBC,EAAcC,EAAY,CAC/C,GAAID,GAAQC,EAAM,OAAQD,EAAOC,GAAQ,EACzC,IAAMC,GAAOF,EAAOC,EAAO,KAAO,EAClC,OAAOC,EAAM,IAAMA,EAAM,IAAMA,CACnC,CAEA,SAASC,GAAeC,EAAyBJ,EAAcK,EAAeJ,EAAcK,EAAa,CACrG,IAAMC,EAAMR,GAAgBC,EAAMC,CAAI,EAChCO,GAAOH,EAAQC,GAAS,EAC9B,OAAQF,EAAM,CACV,IAAK,WACD,OAAOK,GAAW,EAAG,OAAO,CAAC,CAACF,EAAK,CAAC,CAAC,EACzC,IAAK,kBACD,OAAOG,GAAkB,EAAG,OAAO,CAAC,CAACH,EAAK,CAAC,CAAC,EAChD,IAAK,eACD,OAAOI,GAAe,EAAG,OAAO,CAAC,CAACJ,EAAK,CAACC,CAAG,CAAC,EAChD,IAAK,QAAS,CACV,IAAMI,EAAON,EAAQD,EACrB,OAAOQ,GAAiB,EACnB,OAAO,CAAC,CAACN,EAAK,CAAC,CAAC,EAChB,OAAO,CAAC,EAAGC,CAAG,CAAC,EACf,UAAU,CAACH,EAAQO,EAAO,EAAGN,EAAQM,EAAO,CAAC,CAAC,CACvD,CACJ,CACJ,CAEA,SAASE,GAASV,EAAyBZ,EAAsB,CAC7D,GAAIA,EAAM,SAAW,EAAG,OAAO,KAC/B,IAAMuB,EAAQ,CACV,KAAM,eACN,YAAavB,EAAM,IAAI,CAAC,CAAE,QAAAM,CAAO,IAAO,CAACkB,GAAgBlB,EAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,GAEzE,CAAC,CAACE,EAAMK,CAAK,EAAG,CAACJ,EAAMK,CAAK,CAAC,EAAIW,GAAUF,CAAK,EAEtD,QAAWG,IAAa,CAACd,EAAM,iBAAiB,EAAY,CACxD,IAAMe,EAAahB,GAAee,EAAWlB,EAAMK,EAAOJ,EAAMK,CAAK,EAAE,QAAQ,CAAC7B,GAAKA,EAAG,EAAGsC,CAAK,EAC1F,CAAC,CAACK,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,CAAC,EAAIC,GAAQL,CAAU,EAAE,OAAOJ,CAAK,EACvDU,EAAO,KAAK,IAAIH,EAAKF,EAAIG,EAAKF,CAAE,EACtC,GAAI,GAAC,OAAO,SAASI,CAAI,GAAKA,GAAQ,GACtC,MAAO,CACH,WAAAN,EACA,SAAUC,EAAKE,GAAM,EACrB,SAAUD,EAAKE,GAAM,EACrB,KAAAE,EACA,OAAQH,EAAKF,GAAMK,EACnB,QAASF,EAAKF,GAAMI,EAE5B,CACA,OAAO,IACX,CAEA,SAASC,GAAQnC,EAAcoC,EAA+BC,EAAe,CACzE,IAAMC,EAAyB,CAAA,EAC3BC,EAA2B,KACzB,CAAE,QAAAC,EAAS,QAAAC,EAAS,KAAAP,CAAI,EAAKlC,EAC7B0C,EAAO,CACT,MAAMC,EAAWC,EAAS,CACtBL,GAAS,MAAMI,EAAIH,GAAWN,EAAM,EAAEU,EAAIH,GAAWP,CAAI,CAC7D,EACA,WAAS,CACLK,EAAU,CAAA,CACd,EACA,SAAO,CACH,IAAMM,EAAON,EAEb,GADAA,EAAU,KACN,CAACM,GAAQA,EAAK,OAAS,EAAG,OAC9B,IAAIC,EAAWT,EACf,GAAI,CAACA,EAAQ,CACT,IAAMU,EAAIF,EAAK,OACXA,EAAK,CAAC,IAAMA,EAAKE,EAAI,CAAC,GAAKF,EAAK,CAAC,IAAMA,EAAKE,EAAI,CAAC,GAAKA,GAAK,IAC3DF,EAAK,OAASE,EAAI,EAClBD,EAAW,GAEnB,CACA,IAAME,EAAS,aAAa,KAAKH,CAAI,EACrCP,EAAS,KAAK,CAAE,OAAAU,EAAQ,OAAQF,EAAU,OAAQG,GAAcD,EAAQF,CAAQ,CAAC,CAAE,CACvF,EACA,cAAY,CAAI,EAChB,YAAU,CAAI,EACd,QAAM,CAAI,GAEd,OAAAI,EAAUd,EAAQpC,EAAM,WAAW,OAAO0C,CAAI,CAAC,EACxCJ,CACX,CAEA,SAASW,GAAcD,EAAsBX,EAAe,CACxD,IAAIc,EAAS,EACPJ,EAAIC,EAAO,OAAS,EAC1B,QAASI,EAAI,EAAGA,EAAIL,EAAGK,IACnBD,GAAU,KAAK,MAAMH,EAAOI,EAAI,CAAC,EAAIJ,EAAOI,EAAI,EAAI,CAAC,EAAGJ,EAAOI,EAAI,EAAI,CAAC,EAAIJ,EAAOI,EAAI,EAAI,CAAC,CAAC,EAEjG,OAAIf,GAAUU,EAAI,IAAGI,GAAU,KAAK,MAAMH,EAAO,CAAC,EAAIA,EAAOD,EAAI,EAAI,CAAC,EAAGC,EAAO,CAAC,EAAIA,EAAOD,EAAI,EAAI,CAAC,CAAC,GAC/FI,CACX,CAKA,IAAME,GAAmB,GAKzB,SAASC,GAASC,EAAaC,EAAa,CACxC,IAAMT,EAAIQ,EAAI,QAAQ,OAChBE,EAAO,IAAI,WAAWV,CAAC,EACzBW,EAAUH,EAAI,OAAO,CAAC,EACtBI,EAAUJ,EAAI,OAAO,CAAC,EAC1B,QAASH,EAAI,EAAGA,EAAIL,EAAGK,IAAK,CACxB,IAAMpC,EAAMuC,EAAI,OAAOH,EAAI,CAAC,EACtBnC,EAAMsC,EAAI,OAAOH,EAAI,EAAI,CAAC,EAC5BQ,EAAM,GACV,GAAIL,EAAI,QAAQH,CAAC,EAAII,EAAO,CACxB,IAAIK,EAAO,KAAK,IAAI7C,EAAM0C,CAAO,EAC7BG,EAAO,MAAKA,EAAO,IAAMA,GAC7BD,EAAM,KAAK,IAAI3C,EAAM0C,CAAO,EAAIN,IAAoBQ,EAAO,KAAK,IAAK5C,EAAM,KAAK,GAAM,GAAG,EAAIoC,EACjG,EACIE,EAAI,QAAQH,CAAC,GAAKI,GAASI,KAC3BH,EAAKL,CAAC,EAAI,EACVM,EAAU1C,EACV2C,EAAU1C,EAElB,CACA,OAAOwC,CACX,CAEA,SAASK,GAAeC,EAA6BC,EAAgB,CACjE,IAAMC,EAA0B,CAAA,EAChC,OAAW,CAAE,IAAAV,EAAK,SAAAW,CAAQ,IAAMH,EAAM,CAClC,IAAMhB,EAAIQ,EAAI,QAAQ,OAChBE,EAAOO,EAAQT,CAAG,EACxB,QAASY,EAAIF,EAAI,SAAW,EAAI,EAAI,EAAGE,EAAIpB,EAAGoB,IAAK,CAC/C,IAAMf,EAAIc,EAAWnB,EAAI,EAAIoB,EAAIA,EAC7BV,EAAKL,CAAC,GAAGa,EAAI,KAAK,CAACV,EAAI,OAAOH,EAAI,CAAC,EAAGG,EAAI,OAAOH,EAAI,EAAI,CAAC,CAAC,CAAC,CACpE,CACJ,CACA,OAAOa,CACX,CAGA,SAASG,GAAUC,EAA6Bb,EAAa,CACzD,IAAIc,EAAO,EACX,OAAW,CAAE,IAAAf,CAAG,IAAMc,EAClB,QAAS,EAAI,EAAG,EAAId,EAAI,QAAQ,OAAS,EAAG,IAASA,EAAI,QAAQ,CAAC,GAAKC,GAAOc,IAElF,GAAIA,GAAQ,EAAG,OAAOd,EACtB,IAAMe,EAAoB,CAAA,EAC1B,OAAW,CAAE,IAAAhB,CAAG,IAAMc,EAAM,QAAS,EAAI,EAAG,EAAId,EAAI,QAAQ,OAAS,EAAG,IAAKgB,EAAQ,KAAKhB,EAAI,QAAQ,CAAC,CAAC,EACxG,OAAAgB,EAAQ,KAAK,CAACC,EAAGC,IAAMD,EAAIC,CAAC,EACrB,KAAK,IAAIjB,EAAOe,EAAQ,KAAK,IAAI,EAAGA,EAAQ,OAAS,CAAC,CAAC,GAAKf,CAAK,CAC5E,CAOA,SAASkB,GAAgBL,EAA0BM,EAAiB,CAChE,OAAIN,EAAK,OAAS,EAAU,GACXO,GAAQ,CAAE,KAAM,UAAW,YAAa,CAACP,CAAI,CAAC,CAAE,EAAI,EAAI,KAAK,KAC1DM,CACxB,CAOA,IAAME,GAAS,CAACtB,EAAauB,IAAiB,CAC1C,IAAM1B,EAAI0B,EAAOvB,EAAI,QAAQ,OAAS,EAAI,EAC1C,MAAO,GAAGA,EAAI,OAAOH,EAAI,CAAC,CAAC,IAAIG,EAAI,OAAOH,EAAI,EAAI,CAAC,CAAC,EACxD,EAGA,SAAS2B,GAAUC,EAAuB,CACtC,IAAMC,EAAS,IAAI,IACnB,QAAW1B,KAAOyB,EACd,QAAWE,IAAO,CAACL,GAAOtB,EAAK,EAAK,EAAGsB,GAAOtB,EAAK,EAAI,CAAC,EAAG,CACvD,IAAM4B,EAAOF,EAAO,IAAIC,CAAG,EACvBC,EAAMA,EAAK,KAAK5B,CAAG,EAClB0B,EAAO,IAAIC,EAAK,CAAC3B,CAAG,CAAC,CAC9B,CAEJ,IAAM6B,EAAU,IAAI,IACdC,EAAkB,CAAA,EAClBC,EAAW,CAAC,CAAE,IAAA/B,EAAK,SAAAW,CAAQ,IAAmBW,GAAOtB,EAAKW,CAAQ,EAClEqB,EAAS,CAAC,CAAE,IAAAhC,EAAK,SAAAW,CAAQ,IAAmBW,GAAOtB,EAAK,CAACW,CAAQ,EACjEsB,EAAUC,GAA+B,CAC3C,IAAMN,EAAOF,EAAO,IAAIQ,CAAI,EAC5B,OAAIN,EAAK,SAAW,EAAU,KACvBA,EAAK,KAAM5B,GAAQ,CAAC6B,EAAQ,IAAI7B,CAAG,CAAC,GAAK,IACpD,EAEA,QAAWA,KAAOyB,EAAM,CACpB,GAAII,EAAQ,IAAI7B,CAAG,EAAG,SACtB6B,EAAQ,IAAI7B,CAAG,EACf,IAAMQ,EAAqB,CAAC,CAAE,IAAAR,EAAK,SAAU,EAAK,CAAE,EACpD,QAASmC,EAAOF,EAAOD,EAAOxB,EAAKA,EAAK,OAAS,CAAC,CAAC,CAAC,EAAG2B,EAAMA,EAAOF,EAAOD,EAAOxB,EAAKA,EAAK,OAAS,CAAC,CAAC,CAAC,EACpGqB,EAAQ,IAAIM,CAAI,EAChB3B,EAAK,KAAK,CAAE,IAAK2B,EAAM,SAAUb,GAAOa,EAAM,EAAK,IAAMH,EAAOxB,EAAKA,EAAK,OAAS,CAAC,CAAC,CAAC,CAAE,EAE5F,QAAS4B,EAAOH,EAAOF,EAASvB,EAAK,CAAC,CAAC,CAAC,EAAG4B,EAAMA,EAAOH,EAAOF,EAASvB,EAAK,CAAC,CAAC,CAAC,EAC5EqB,EAAQ,IAAIO,CAAI,EAChB5B,EAAK,QAAQ,CAAE,IAAK4B,EAAM,SAAUd,GAAOc,EAAM,EAAI,IAAML,EAASvB,EAAK,CAAC,CAAC,CAAC,CAAE,EAElFsB,EAAO,KAAK,CAAE,KAAAtB,EAAM,OAAQuB,EAASvB,EAAK,CAAC,CAAC,IAAMwB,EAAOxB,EAAKA,EAAK,OAAS,CAAC,CAAC,CAAC,CAAE,CACrF,CACA,OAAOsB,CACX,CAEA,SAASO,GACL7F,EACAC,EACA6F,EACAC,EACApG,EAAc,CAEd,IAAMO,EAAQH,GAAQC,EAAUC,CAAK,EAC/BL,EAAOM,EAAM,OAAO,CAAC8F,EAAK,CAAE,QAAAxF,CAAO,IAAOwF,EAAMxF,EAAQ,KAAM,CAAC,EAC/DyF,EAAavG,GAAiBC,EAAQC,CAAI,EAC1CsG,EAAepG,GAAiBH,EAAQC,CAAI,EAE5C2E,EAAyB,CAAA,EAC/B,OAAW,CAAE,QAAA/D,EAAS,QAAAD,CAAO,IAAML,EAC3B,CAACK,GAAWC,EAAQ,KAAO0F,GAC/B3B,EAAK,KAAK/D,EAAQ,MAAM,OAAO,CAAC2F,EAAG9C,IAAMA,IAAM,GAAK7C,EAAQ,UAAU6C,CAAC,GAAK6C,CAAY,CAAC,EAG7F,IAAME,EAAS,IAAI,IACbC,EAAQ,IAAI,IAClB,QAAWC,KAAS/B,EAChB,QAAWD,KAAQgC,EAAO,CACtB,IAAM7C,EAAQY,GAAUC,EAAM2B,CAAU,EACxC,OAAW,CAAE,IAAAzC,CAAG,IAAMc,EAAM,CACxB8B,EAAO,IAAI5C,EAAI,IAAK,KAAK,IAAI4C,EAAO,IAAI5C,EAAI,GAAG,GAAK,EAAGC,CAAK,CAAC,EAC7D,IAAM8C,EAAMF,EAAM,IAAI7C,EAAI,GAAG,EACzB+C,EAAKA,EAAI,QACRF,EAAM,IAAI7C,EAAI,IAAK,CAAE,IAAAA,EAAK,MAAO,CAAC,CAAE,CAC7C,CACJ,CAGJ,IAAMgD,EAAQ,IAAI,IACZvC,EAAoBT,GAAO,CAC7B,IAAIE,EAAO8C,EAAM,IAAIhD,EAAI,GAAG,EAC5B,OAAKE,IACDA,EAAOH,GAASC,EAAK4C,EAAO,IAAI5C,EAAI,GAAG,GAAK,GAAG,EAC/CgD,EAAM,IAAIhD,EAAI,IAAKE,CAAI,GAEpBA,CACX,EAEA,GAAIuC,EAAa,IACb,QAAWK,KAAS/B,EAChB+B,EAAM,QAAQ,CAAChC,EAAMmC,IAAS,CAC1B,IAAIhD,EAAQ,KAAK,IAAI,GAAGa,EAAK,IAAI,CAAC,CAAE,IAAAd,CAAG,IAAO4C,EAAO,IAAI5C,EAAI,GAAG,GAAKyC,CAAU,CAAC,EAChF,KAAOxC,EAAQ,KAAO,CAACkB,GAAgBZ,GAAeO,EAAML,CAAO,EAAGwC,IAAU,CAAC,GAAG,CAChFhD,EAAQ,KAAK,IAAI,IAAKA,EAAQ,CAAC,EAC/B,OAAW,CAAE,IAAAD,CAAG,IAAMc,EAClB8B,EAAO,IAAI5C,EAAI,IAAK,KAAK,IAAI4C,EAAO,IAAI5C,EAAI,GAAG,GAAK,EAAGC,CAAK,CAAC,EAC7D+C,EAAM,OAAOhD,EAAI,GAAG,CAE5B,CACJ,CAAC,EAIT,IAAMkD,EAAQtE,GACV0D,EACA,CACI,KAAM,eACN,YAAavB,EAAK,QAAS+B,GAAS,CAChC,GAAM,CAAC1B,EAAU,GAAG+B,CAAK,EAAIL,EAAM,IAAKhC,GAASP,GAAeO,EAAML,CAAO,CAAC,EAC9E,OAAOW,EAAS,OAAS,EAAI,CAAA,EAAK,CAAC,CAACA,EAAU,GAAG+B,EAAM,OAAQC,GAASA,EAAK,QAAU,CAAC,CAAC,CAAC,CAC9F,CAAC,GAEL,EAAI,EAGFC,EAAW,CAAC,GAAGR,EAAM,OAAM,CAAE,EAAE,OAAO,CAAC,CAAE,MAAAS,CAAK,IAAOf,IAAY,OAASe,IAAU,CAAC,EAAE,IAAI,CAAC,CAAE,IAAAtD,CAAG,IAAOA,CAAG,EAC3GuD,EAAsB,CAAA,EAC5B,QAAWC,KAAShC,GAAU6B,CAAQ,EAClCE,EAAM,KACF,GAAG3E,GAAQ0D,EAAQ,CAAE,KAAM,aAAc,YAAa/B,GAAeiD,EAAM,KAAM/C,CAAO,CAAC,EAA6B,EAAK,CAAC,EAIpI,IAAM+B,EAAOzD,GAA2BA,EAAS,OAAO,CAAC0E,EAAOC,IAAMD,EAAQC,EAAE,OAAQ,CAAC,EACnFC,EAAQ,CAAC,GAAGT,EAAO,GAAGK,CAAK,EAAE,OAAO,CAACE,EAAOC,IAAMD,EAAQC,EAAE,OAAO,WAAa,GAAI,CAAC,EAC3F,MAAO,CACH,MAAOpB,EAAO,MACd,OAAQA,EAAO,OACf,MAAAY,EACA,MAAAK,EACA,WAAYf,EAAIU,CAAK,EACrB,WAAYV,EAAIe,CAAK,EACrB,MAAAI,EAER,CAEA,IAAMC,GAAN,KAAe,CAIkB,QAHrB,SAAW,IAAI,IACf,OAAS,EAEjB,YAA6BC,EAAe,CAAf,KAAA,QAAAA,CAAkB,CAE/C,IAAIlC,EAAW,CACX,IAAM1F,EAAQ,KAAK,SAAS,IAAI0F,CAAG,EACnC,OAAI1F,IACA,KAAK,SAAS,OAAO0F,CAAG,EACxB,KAAK,SAAS,IAAIA,EAAK1F,CAAK,GAEzBA,CACX,CAEA,IAAI0F,EAAa1F,EAAQ,CACrB,IAAM6H,EAAW,KAAK,SAAS,IAAInC,CAAG,EAClCmC,IAAU,KAAK,QAAUA,EAAS,OACtC,KAAK,SAAS,OAAOnC,CAAG,EACxB,KAAK,SAAS,IAAIA,EAAK1F,CAAK,EAC5B,KAAK,QAAUA,EAAM,MACrB,OAAW,CAAC8H,EAAQC,CAAK,IAAK,KAAK,SAAU,CACzC,GAAI,KAAK,QAAU,KAAK,SAAW,KAAK,SAAS,MAAQ,EAAG,MAC5D,KAAK,SAAS,OAAOD,CAAM,EAC3B,KAAK,QAAUC,EAAM,KACzB,CACJ,CAEA,OAAK,CACD,KAAK,SAAS,MAAK,EACnB,KAAK,OAAS,CAClB,GAGEC,GAAS,IAAIL,GAAqC,EAAE,EACpDM,GAAa,IAAIN,GAAuB,GAAK,KAAO,IAAI,EAgBxD,SAAUO,GAAYC,EAA2B,CACnD,IAAMjI,EAAS,KAAK,MAAMH,GAAQoI,EAAQ,MAAM,EAAI,GAAG,EAAI,IACrDC,EAAW,GAAGD,EAAQ,YAAY,IAAIA,EAAQ,UAAU,GACxDzC,EAAM,GAAG0C,CAAQ,IAAID,EAAQ,OAAO,IAAIjI,CAAM,GAC9CmI,EAASJ,GAAW,IAAIvC,CAAG,EACjC,GAAI2C,EAAQ,OAAOA,EAEnB,IAAIhC,EAA4B2B,GAAO,IAAII,CAAQ,EACnD,GAAI,CAAC/B,EAAQ,CACT,IAAMiC,EAAOvG,GAASoG,EAAQ,WAAY7H,GAAQ6H,EAAQ,SAAUA,EAAQ,KAAK,CAAC,EAClF,GAAI,CAACG,EAAM,OAAO,KAClBjC,EAASiC,EACTN,GAAO,IAAII,EAAU,CAAE,GAAGE,EAAM,MAAO,CAAC,CAAE,CAC9C,CACA,IAAMC,EAAWnC,GAAc+B,EAAQ,SAAUA,EAAQ,MAAO9B,EAAQ8B,EAAQ,QAASjI,CAAM,EAC/F,OAAA+H,GAAW,IAAIvC,EAAK6C,CAAQ,EACrBA,CACX,CAEM,SAAUC,IAAgB,CAC5BR,GAAO,MAAK,EACZC,GAAW,MAAK,CACpB,CCrcM,SAAUQ,GAAYC,EAAoB,CAC5C,IAAMC,EAAID,EAAO,OAAS,EACpBE,EAAU,IAAI,WAAWD,CAAC,EAChC,GAAIA,EAAI,EAAG,OAAOC,EAElB,IAAMC,EAAU,KAAK,GAAK,IACpBC,EAAS,IAAI,aAAaH,CAAC,EAC3BI,EAAO,IAAI,WAAWJ,CAAC,EACvBK,EAAO,IAAI,WAAWL,CAAC,EAC7B,QAASM,EAAI,EAAGA,EAAIN,EAAGM,IACnBF,EAAKE,CAAC,EAAIA,EAAI,EACdD,EAAKC,CAAC,EAAIA,EAAI,EAGlB,IAAMC,EAAO,CAACC,EAAWC,EAAWC,IAAqB,CACrD,IAAMC,EAAM,KAAK,IAAIZ,EAAOU,EAAI,EAAI,CAAC,EAAIP,CAAO,EAC1CU,EAAKb,EAAOS,EAAI,CAAC,EAAIG,EAAKE,EAAKd,EAAOS,EAAI,EAAI,CAAC,EAC/CM,EAAKf,EAAOU,EAAI,CAAC,EAAIE,EAAKI,EAAKhB,EAAOU,EAAI,EAAI,CAAC,EAC/CO,EAAKjB,EAAOW,EAAI,CAAC,EAAIC,EAAKM,EAAKlB,EAAOW,EAAI,EAAI,CAAC,EACrD,OAAQ,KAAK,KAAKI,EAAKF,IAAOK,EAAKJ,IAAOG,EAAKJ,IAAOG,EAAKF,EAAG,EAAI,EAAKX,EAAUA,CACrF,EAEMgB,EAAiB,CAAA,EACjBC,EAAW,IAAI,WAAWnB,CAAC,EAAE,KAAK,EAAE,EACpCoB,EAAO,CAACd,EAAWe,IAAclB,EAAOe,EAAKZ,CAAC,CAAC,EAAIH,EAAOe,EAAKG,CAAC,CAAC,EACjEC,EAAO,CAAChB,EAAWe,IAAa,CACjC,CAACH,EAAKZ,CAAC,EAAGY,EAAKG,CAAC,CAAC,EAAI,CAACH,EAAKG,CAAC,EAAGH,EAAKZ,CAAC,CAAC,EACvCa,EAASD,EAAKZ,CAAC,CAAC,EAAIA,EACpBa,EAASD,EAAKG,CAAC,CAAC,EAAIA,CACxB,EACME,EAAMjB,GAAa,CACrB,KAAOA,EAAI,GAAG,CACV,IAAMkB,EAAUlB,EAAI,GAAM,EAC1B,GAAI,CAACc,EAAKd,EAAGkB,CAAM,EAAG,MACtBF,EAAKhB,EAAGkB,CAAM,EACdlB,EAAIkB,CACR,CACJ,EACMC,EAAQnB,GAAa,CACvB,OAAS,CACL,IAAMoB,EAAI,EAAIpB,EAAI,EACZqB,EAAID,EAAI,EACVE,EAAWtB,EAGf,GAFIoB,EAAIR,EAAK,QAAUE,EAAKM,EAAGE,CAAQ,IAAGA,EAAWF,GACjDC,EAAIT,EAAK,QAAUE,EAAKO,EAAGC,CAAQ,IAAGA,EAAWD,GACjDC,IAAatB,EAAG,OACpBgB,EAAKhB,EAAGsB,CAAQ,EAChBtB,EAAIsB,CACR,CACJ,EACMC,EAAQvB,GAAa,CACvBa,EAASb,CAAC,EAAIY,EAAK,OACnBA,EAAK,KAAKZ,CAAC,EACXiB,EAAGL,EAAK,OAAS,CAAC,CACtB,EACMY,EAAUxB,GAAa,CACzB,IAAMyB,EAAKZ,EAASb,CAAC,EACf0B,EAAOd,EAAK,IAAG,EACrBC,EAASb,CAAC,EAAI,GACVyB,EAAKb,EAAK,SACVA,EAAKa,CAAE,EAAIC,EACXb,EAASa,CAAI,EAAID,EACjBR,EAAGQ,CAAE,EACLN,EAAKN,EAASa,CAAI,CAAC,EAE3B,EAEA,QAAS1B,EAAI,EAAGA,EAAIN,EAAI,EAAGM,IACvBH,EAAOG,CAAC,EAAIC,EAAKD,EAAI,EAAGA,EAAGA,EAAI,CAAC,EAChCuB,EAAKvB,CAAC,EAGV,IAAI2B,EAAQ,EACNC,EAAQ,IAAI,aAAalC,CAAC,EAEhC,IADAkC,EAAM,CAAC,EAAIA,EAAMlC,EAAI,CAAC,EAAI,IACnBkB,EAAK,OAAS,GAAG,CACpB,IAAMZ,EAAIY,EAAK,CAAC,EAChBY,EAAOxB,CAAC,EACR2B,EAAQ,KAAK,IAAIA,EAAO9B,EAAOG,CAAC,CAAC,EACjC4B,EAAM5B,CAAC,EAAI2B,EACX,IAAME,EAAI/B,EAAKE,CAAC,EACV8B,EAAI/B,EAAKC,CAAC,EACZ6B,GAAK,IAAG9B,EAAK8B,CAAC,EAAIC,GAClBA,EAAIpC,IAAGI,EAAKgC,CAAC,EAAID,GACrB,QAAWd,IAAK,CAACc,EAAGC,CAAC,EACbf,GAAK,GAAKA,GAAKrB,EAAI,GAAKmB,EAASE,CAAC,EAAI,IAC1CS,EAAOT,CAAC,EACRlB,EAAOkB,CAAC,EAAId,EAAKH,EAAKiB,CAAC,EAAGA,EAAGhB,EAAKgB,CAAC,CAAC,EACpCQ,EAAKR,CAAC,EAEd,CAEA,QAASf,EAAI,EAAGA,EAAIN,EAAGM,IAAKL,EAAQK,CAAC,EAAI+B,GAAaH,EAAM5B,CAAC,CAAC,EAC9D,OAAOL,CACX,CAEM,SAAUoC,GAAalC,EAAc,CACvC,OAAIA,IAAW,IAAiB,EAC1BA,EAAS,EACR,KAAK,IAAI,IAAK,KAAK,IAAI,EAAG,KAAK,MAAM,GAAK,KAAK,KAAKA,CAAM,CAAC,CAAC,CAAC,EAD1C,GAE9B,CChGO,IAAMmC,GAAmB,IAAIC,EAAe,GAwB7C,SAAUC,GAAaC,EAA0CC,EAAkB,CACrF,MAAO,OAAOC,GAAO,CACjB,IAAMC,EAAM,OAAOH,GAAS,WAAaA,EAAKE,CAAG,EAAI,GAAGF,EAAK,QAAQ,OAAQ,EAAE,CAAC,IAAIE,CAAG,QACjFE,EAAW,MAAM,MAAMD,EAAKF,CAAI,EAEtC,GAAIG,EAAS,SAAW,KAAOA,EAAS,SAAW,IAAK,OAAO,KAC/D,GAAI,CAACA,EAAS,GAAI,MAAM,IAAI,MAAM,GAAGD,CAAG,gBAAWC,EAAS,MAAM,EAAE,EACpE,OAAOA,EAAS,KAAI,CACxB,CACJ,CAGM,SAAUC,GACZC,EAA6F,CAE7F,MAAO,OAAOJ,GAAO,CACjB,IAAMK,EAAQ,MAAMD,EAAKJ,CAAG,EAC5B,OAAIK,GAAS,KAAa,KACtB,OAAOA,GAAU,SAAiB,KAAK,MAAMA,CAAK,EAClDA,aAAiB,aAAeA,aAAiB,WAC1C,KAAK,MAAM,IAAI,YAAW,EAAG,OAAOA,CAAK,CAAC,EAE9CA,CACX,CACJ,CAEA,SAASC,GAAeC,EAAcC,EAA2BC,EAAc,CAC3E,IAAMC,EAAQF,EAAW,MAAM,OAAS,UAAYA,EAAW,MAAM,SAAWA,EAAW,MACrFG,EAAUH,EAAW,MAAM,OAAS,UAAYA,EAAW,MAAQ,KACnEI,EACFF,EAAM,OAAS,UAAY,CAACA,EAAM,WAAW,EAAIA,EAAM,YACvDG,EAAW,EAETC,EAAUC,GAAyC,CAErD,IAAMC,EADSD,EAAK,OAAS,GAAKA,EAAK,CAAC,EAAE,CAAC,IAAMA,EAAKA,EAAK,OAAS,CAAC,EAAE,CAAC,GAAKA,EAAK,CAAC,EAAE,CAAC,IAAMA,EAAKA,EAAK,OAAS,CAAC,EAAE,CAAC,EACtFA,EAAO,CAAC,GAAGA,EAAMA,EAAK,CAAC,CAAC,EAC/CE,EAAS,IAAI,aAAaD,EAAY,OAAS,CAAC,EACtD,OAAAA,EAAY,QAAQ,CAAC,CAACE,EAAKC,CAAG,EAAGC,IAAK,CAClCH,EAAOG,EAAI,CAAC,EAAIF,EAChBD,EAAOG,EAAI,EAAI,CAAC,EAAID,CACxB,CAAC,EACM,CAAE,IAAK,CAAE,IAAK,UAAUV,CAAM,IAAIF,CAAI,IAAIM,GAAU,GAAI,OAAAI,EAAQ,QAASI,GAAYJ,CAAM,CAAC,EAAI,SAAU,EAAK,CAC1H,EAEMK,EAAyBV,EAAS,IAAKW,GAAS,CAClD,IAAMC,EAAWD,EAAM,IAAKR,GAAS,CAACD,EAAOC,CAAI,CAAC,CAAC,EAC7CU,EAAYF,EAAM,IAAKR,GAAQ,CACjC,IAAMW,EAAOC,GAAQ,CAAE,KAAM,UAAW,YAAa,CAACZ,CAA0B,CAAC,CAAE,EACnF,OAAOW,EAAO,EAAI,KAAK,GAAK,EAAI,KAAK,GAAKA,EAAOA,CACrD,CAAC,EACKA,EAAO,KAAK,IAAI,EAAGD,EAAU,CAAC,EAAIA,EAAU,MAAM,CAAC,EAAE,OAAO,CAACG,EAAG,IAAMA,EAAI,EAAG,CAAC,CAAC,EACrF,MAAO,CAAE,MAAOJ,EAAU,UAAAC,EAAW,KAAAC,EAAM,SAAU,EAAI,CAC7D,CAAC,EAEKG,EAAOrB,EAAW,MAAQG,GAAS,YAAY,MAAQJ,EAC7D,MAAO,CACH,KAAAA,EACA,KAAAsB,EACA,OAAQA,EACR,OAAQrB,EAAW,SAAWD,EAAK,SAAS,GAAG,EAAIA,EAAK,MAAM,EAAG,CAAC,EAAI,MACtE,MAAO,GACP,OAAQ,GACR,OAAQ,GACR,SAAUe,EAElB,CAEA,IAAMQ,GAAN,KAAiB,CACL,SAAwB,CAAA,EACxB,SAAW,IAAI,IACf,YAAc,EACd,QAAU,EAGlB,IAAI,YAAU,CACV,OAAO,KAAK,WAChB,CAEA,IAAI,YAAU,CACV,OAAO,KAAK,SAAS,OAAS,CAClC,CAGA,IAAIC,EAAiB,CACjB,YAAK,SAAS,KAAKA,CAAM,EACzB,KAAK,cACE,IAAK,CACR,IAAMX,EAAI,KAAK,SAAS,QAAQW,CAAM,EAClCX,EAAI,IACR,KAAK,SAAS,OAAOA,EAAG,CAAC,EACzB,KAAK,cACT,CACJ,CAMA,OAAOY,EAAgD,CACnD,IAAMvB,EAAS,EAAE,KAAK,QAChBwB,EAAQ,OAAO,QAAQD,CAAM,EAAE,IAAI,CAAC,CAACE,EAAS7B,CAAK,IAAK,CAC1D,IAAME,EAAO2B,EAAQ,KAAI,EAAG,YAAW,EACjC1B,EAAa,UAAWH,EAAQA,EAAQ,CAAE,MAAOA,CAAK,EAC5D,YAAK,SAAS,IAAIE,EAAM,CAAE,OAAAE,EAAQ,QAASH,GAAeC,EAAMC,EAAYC,CAAM,CAAC,CAAE,EAC9EF,CACX,CAAC,EACD,YAAK,cACE,IAAK,CACR,QAAWA,KAAQ0B,EACX,KAAK,SAAS,IAAI1B,CAAI,GAAG,SAAWE,GAAQ,KAAK,SAAS,OAAOF,CAAI,EAE7E,KAAK,aACT,CACJ,CAEA,QAAQA,EAAY,CAChB,OAAO,KAAK,SAAS,IAAIA,CAAI,GAAG,OACpC,CAGA,OAAK,CACD,KAAK,SAAW,CAAA,EAChB,KAAK,SAAS,MAAK,EACnB,KAAK,aACT,CAMA,MAAM,QAAQP,EAAW,CACrB,GAAI,KAAK,SAAS,SAAW,EACzB,MAAM,IAAI,MAAM,uGAA6F,EAEjH,IAAImC,EAAmB,KACvB,QAAWJ,IAAU,CAAC,GAAG,KAAK,QAAQ,EAClC,GAAI,CACA,IAAM1B,EAAQ,MAAM0B,EAAO/B,CAAG,EAC9B,GAAIK,GAAS,KAAM,OAAOA,CAC9B,OAAS+B,EAAO,CACZD,IAAYC,CAChB,CAEJ,GAAID,EAAS,MAAMA,EACnB,OAAO,IACX,CAGA,MAAM,OAAK,CACP,OAAQ,MAAM,KAAK,QAAQ,GAAGxC,EAAgB,QAAQ,CAC1D,GAGS0C,GAAc,IAAIP,GCpL/B,IAAMQ,GAAU,IAAI,IACdC,GAAW,IAAI,IACfC,GAAU,IAAI,IACdC,GAAS,IAAI,IACfC,GAAU,EAER,SAAUC,GAAeC,EAAY,CACvC,MAAO,GAAGC,EAAgB,cAAcD,CAAI,EAChD,CAEM,SAAUE,GAAcC,EAAe,CACzC,MAAO,GAAGF,EAAgB,WAAWE,CAAO,EAChD,CAGM,SAAUC,IAAc,CAC1B,OAAON,EACX,CAEM,SAAUO,GAAaC,EAAW,CACpC,OAAOZ,GAAQ,IAAIY,CAAG,CAC1B,CAEA,eAAeC,GAAWD,EAAW,CACjC,GAAI,CACA,IAAIE,EAAQ,MAAMC,GAAY,QAAQH,CAAG,EAEzC,OAAIE,IAAS,MAAQF,EAAI,SAAS,UAAU,IACxCE,EAAQ,MAAMC,GAAY,QAAQH,EAAI,QAAQ,WAAY,aAAa,CAAC,GAErEE,IAAS,KAAO,CAAE,OAAQ,SAAS,EAAK,CAAE,OAAQ,QAAS,KAAME,GAAcF,CAAI,CAAC,CAC/F,OAASG,EAAO,CACZ,MAAO,CAAE,OAAQ,SAAU,MAAAA,CAAK,CACpC,CACJ,CAOM,SAAUC,GAAYN,EAAW,CACnC,IAAMO,EAAUnB,GAAQ,IAAIY,CAAG,EAC/B,GAAIO,GAAS,SAAW,QAAS,OAAO,QAAQ,QAAQA,CAAO,EAC/D,IAAIC,EAAMnB,GAAS,IAAIW,CAAG,EAC1B,OAAKQ,IACDA,EAAMP,GAAWD,CAAG,EAAE,KAAMS,IACxBpB,GAAS,OAAOW,CAAG,EACnBZ,GAAQ,IAAIY,EAAKS,CAAK,EACtBjB,KACIiB,EAAM,SAAW,QACjBlB,GAAO,OAAOS,CAAG,EACTT,GAAO,IAAIS,CAAG,IACtBT,GAAO,IAAIS,CAAG,EACVS,EAAM,SAAW,SAAU,QAAQ,KAAK,8BAA8BT,CAAG,IAAKS,EAAM,KAAK,EACxF,QAAQ,KAAK,iCAAiCT,CAAG,EAAE,GAErDS,EACV,EACDpB,GAAS,IAAIW,EAAKQ,CAAG,GAElBA,CACX,CAOM,SAAUE,GAAUV,EAAW,CACjC,IAAIW,EAAOrB,GAAQ,IAAIU,CAAG,EAC1B,OAAKW,IACDA,EAAO,SAAW,CACd,MAAML,GAAYN,CAAG,CACzB,EACAV,GAAQ,IAAIU,EAAKW,CAAI,GAElBA,CACX,CAGM,SAAUC,IAAa,CACzBxB,GAAQ,MAAK,EACbC,GAAS,MAAK,EACdE,GAAO,MAAK,EACZC,IACJ,CCzFA,IAAMqB,GAAO,8BAGP,SAAUC,GAAaC,EAAc,CACvC,IAAMC,EAAM,MAAM,QAAQD,CAAK,EAAIA,EAAQ,OAAOA,GAAU,SAAWA,EAAM,MAAM,SAAS,EAAI,CAAA,EAC1FE,EAAgB,CAAA,EACtB,QAAWC,KAAQF,EAAK,CACpB,GAAI,OAAOE,GAAS,SAAU,SAC9B,IAAMC,EAAOD,EAAK,KAAI,EAAG,YAAW,EAChCC,GAAQ,CAACF,EAAI,SAASE,CAAI,GAAGF,EAAI,KAAKE,CAAI,CAClD,CACA,OAAOF,CACX,CAEA,SAASG,GAAcD,EAAY,CAC/B,OAAOA,EAAK,SAAS,GAAG,CAC5B,CAGM,SAAUE,GAAYC,EAA0BC,EAAe,CACjE,IAAMC,EAAQ,IAAI,IAClB,QAAWL,KAAQG,EACX,CAACT,GAAK,KAAKM,CAAI,GAAKM,GAAY,QAAQN,CAAI,IAC5CC,GAAcD,CAAI,EAAGK,EAAM,IAAIE,GAAcP,EAAK,MAAM,EAAG,CAAC,CAAC,CAAC,EAC7DK,EAAM,IAAID,IAAU,QAAUG,GAAcP,CAAI,EAAIQ,GAAeR,CAAI,CAAC,GAEjF,MAAO,CAAC,GAAGK,CAAK,CACpB,CAeM,SAAUI,GAAkBN,EAA0BC,EAAiBM,EAAe,CACxF,IAAMC,EAAyB,CAAA,EACzBC,EAAO,IAAI,IACXC,EAAoB,CAAA,EACtBC,EAAU,GAERC,EAAOC,GAAuB,CAC5BJ,EAAK,IAAII,EAAQ,IAAI,IACzBJ,EAAK,IAAII,EAAQ,IAAI,EACrBL,EAAS,KAAKK,CAAO,EACzB,EAEA,QAAWhB,KAAQG,EAAO,CACtB,IAAMc,EAAUX,GAAY,QAAQN,CAAI,EACxC,GAAIiB,EAAS,CACTF,EAAIE,CAAO,EACX,QACJ,CACA,GAAI,CAACvB,GAAK,KAAKM,CAAI,EAAG,CAClBa,EAAQ,KAAKb,CAAI,EACjB,QACJ,CACA,IAAMkB,EAAcjB,GAAcD,CAAI,EAChCmB,EAAMD,GAAed,IAAU,QAAUG,GAAcP,EAAK,MAAM,EAAG,CAAC,CAAC,EAAIQ,GAAeR,CAAI,EAC9FoB,EAAQC,GAAaF,CAAG,EAC9B,GAAI,CAACC,GAASA,EAAM,SAAW,QAAS,CAC/BA,IAAON,EAAU,IACtB,QACJ,CACA,IAAMQ,EAAOF,EAAM,KAAK,SACxB,GAAIF,GAAed,IAAU,UAAW,CACpC,IAAMY,EAAUM,EAAK,IAAItB,CAAI,EACzBgB,EAASD,EAAIC,CAAO,EACnBH,EAAQ,KAAKb,CAAI,EACtB,QACJ,CACA,IAAMuB,EAAW,CAAC,GAAGD,EAAK,OAAM,CAAE,EAAE,OAC/BE,GAAMA,EAAE,SAAWxB,GAAQwB,EAAE,OAAS,EAAEd,IAAU,YAAcc,EAAE,OAAO,EAE1ED,EAAS,OAAS,EAAGA,EAAS,QAAQR,CAAG,EACpCO,EAAK,IAAItB,CAAI,EAAGe,EAAIO,EAAK,IAAItB,CAAI,CAAE,EACvCa,EAAQ,KAAKb,CAAI,CAC1B,CAEA,MAAO,CAAE,SAAAW,EAAU,QAAAG,EAAS,QAAAD,CAAO,CACvC,4UL3CMY,GAAoB,IACpBC,GAAkB,IAElBC,GAAcC,GAAkB,OAAO,KAAK,MAAMA,EAAQ,GAAG,EAAI,GAAG,EAE1E,SAASC,GAAMC,EAAiCC,EAAeC,EAAa,CACxE,IAAMC,EAAkB,CAAA,EACpBC,EAAkB,CAAA,EAClBC,EAAQ,EACRC,EAAS,EACTC,EAAO,EACPC,EAAS,EACPC,EAAQ,IAAK,CACf,GAAIJ,IAAU,EAAG,OACjB,IAAMK,EAAKT,EAAQ,EAAI,KAAK,IAAI,EAAGO,EAASP,CAAK,EAAI,EACrDE,EAAO,KAAK,CAAE,KAAMC,EAAM,KAAK,EAAE,EAAG,KAAAG,EAAM,GAAAG,CAAE,CAAE,EAC9CH,EAAOG,EACPN,EAAQ,CAAA,EACRC,EAAQ,EACRC,EAAS,CACb,EACA,QAAWK,KAAWX,EAAU,CAC5B,IAAMY,EAAID,EAAQ,OAElB,QAASE,EAAI,EAAGA,EAAID,EAAE,OAAQC,GAAK,EAC/BT,EAAM,KAAKS,IAAM,EAAI,IAAM,IAAKhB,GAAWe,EAAEC,CAAC,EAAIX,CAAK,EAAG,IAAKL,GAAW,CAACe,EAAEC,EAAI,CAAC,EAAIX,CAAK,CAAC,EAE5FS,EAAQ,QAAQP,EAAM,KAAK,GAAG,EAClCC,IACAC,GAAUM,EAAE,OAAS,EACrBJ,GAAUG,EAAQ,QACdN,GAASV,IAAqBW,GAAUV,KAAiBa,EAAK,CACtE,CACA,OAAAA,EAAK,EACEN,CACX,CA0BO,IAAMW,GAAN,cAAwBC,EAAyB,CAuBpD,YAAYC,EAA6C,CACrD,MAAMA,CAA8D,CACxE,CAES,cAAcC,EAAkB,CACrC,MAAM,cAAcA,CAAM,EAC1B,QAAWC,KAAQC,GAAY,KAAK,IAAiB,KAAK,KAAK,EAC3DF,EAAO,OAAO,OAAOC,CAAI,GAAIE,GAAUF,CAAI,EAAG,CAAE,KAAM,QAAQ,CAAE,CAExE,CAEmB,WAAWG,EAAoB,CAC9C,IAAMC,EAAQ,KAAK,OAAM,EACnBC,EAAO,KAAK,KAClB,GAAI,CAACD,GAASA,EAAM,MAAM,SAAW,EAAG,OACxC,IAAME,EAAS,KAAK,OACdC,EAAI,IAAIC,GACd,QAAW3B,KAASuB,EAAM,MACjB,KAAK,QAAQG,EAAG1B,CAAK,IACtByB,EAAO,OAAS,GAAGC,EAAE,OAAOD,CAAM,EACtCC,EAAE,KAAKF,CAAI,GAEfF,EAAI,KAAKI,CAAC,CACd,CAEmB,cAAcJ,EAAoB,CACjD,IAAMM,EAAU,KAAK,QACrB,GAAIA,EAAQ,SAAW,EAAG,OAC1B,IAAML,EAAQ,KAAK,OAAM,EACzB,GAAI,CAACA,EAAO,OACZ,IAAMG,EAAI,IAAIC,GACd,QAAW3B,KAASuB,EAAM,MAAW,KAAK,QAAQG,EAAG1B,CAAK,GAAG0B,EAAE,KAAKE,CAAO,EAC3EN,EAAI,KAAKI,CAAC,CACd,CAEmB,aAAaJ,EAAoB,CAChD,IAAMO,EAAS,KAAK,OACpB,GAAIA,EAAO,SAAW,EAAG,OACzB,IAAMN,EAAQ,KAAK,OAAM,EACzB,GAAI,CAACA,GAASA,EAAM,MAAM,SAAW,EAAG,OACxC,IAAMO,EAAUD,EAAO,IAAKE,GAAWA,EAAM,QAAU,EAAIA,EAAQ,CAAE,GAAGA,EAAO,MAAO,CAAC,CAAG,EACpFN,EAAS,KAAK,OACdO,EAAcP,EAAO,OAAS,GAAK,CAAE,KAAK,KAAwB,KAAMM,IAAWA,EAAM,SAAW,GAAK,CAAC,EAC1GL,EAAI,IAAIC,GACd,QAAW3B,KAASuB,EAAM,MACjB,KAAK,QAAQG,EAAG1B,CAAK,IACtBgC,GAAaN,EAAE,OAAOD,CAAM,EAChCC,EAAE,OAAOI,CAAO,GAEpBR,EAAI,KAAKI,CAAC,CACd,CAImB,UAAQ,CACvB,OAAO,IAAIO,GAAI,EAAG,KAAK,CACnB,EAAG,EACH,EAAG,EACH,MAAO,KAAK,aAAa,MACzB,OAAQ,KAAK,aAAa,OAC7B,CACL,CAEQ,YAA4B,KACnB,QAAU,IAAI,IAEvB,QAAQP,EAAe1B,EAAY,CACvC,IAAMkC,EAAQ,KAAK,MACbC,EAAM,KAAK,IACXC,EAAQ,KAAK,aAAa,MAC1BC,EAAS,KAAK,aAAa,OAC3BC,EAA2B,CAAC,CAACF,EAAQ,EAAG,CAACC,EAAS,EAAGD,EAAQ,EAAGC,EAAS,CAAC,EAChF,GAAIH,GAAS,GAAKC,GAAO,EACrB,OAAAT,EAAE,KAAK,CAAE,KAAM1B,EAAM,KAAM,aAAAsC,CAAY,CAAE,EAClC,GAEX,IAAMC,EAAOvC,EAAM,GAAKA,EAAM,KAC9B,GAAIuC,GAAQ,EAAG,MAAO,GACtB,IAAMC,EAAa,KAAK,IAAI,GAAIN,EAAQlC,EAAM,MAAQuC,CAAI,EACpDE,EAAW,KAAK,IAAI,GAAIN,EAAMnC,EAAM,MAAQuC,CAAI,EACtD,OAAIE,GAAYD,EAAmB,IACnCd,EAAE,KAAK,CAAE,KAAM1B,EAAM,KAAM,aAAAsC,EAAc,MAAOE,EAAY,IAAKC,CAAQ,CAAE,EACpE,GACX,CAEQ,QAAM,CACV,IAAMC,EAAQ,KAAK,IACbC,EAAQ,KAAK,MACbC,EAAQ,KAAK,MACbC,EAAYC,GAAkBJ,EAAOC,EAAOC,CAAK,EACvD,QAAWG,KAAQF,EAAU,QACrB,KAAK,QAAQ,IAAIE,CAAI,IACzB,KAAK,QAAQ,IAAIA,CAAI,EACrB,QAAQ,KAAK,mCAAmCA,CAAI,EAAE,GAE1D,GAAIF,EAAU,SAAS,SAAW,EAAG,OAAO,KAE5C,IAAMG,EAAWC,GAAY,CACzB,aAAc,GAAGC,GAAY,UAAU,IAAIC,GAAc,CAAE,IAAIR,CAAK,IAAIC,CAAK,IAAIF,EAAM,KAAK,GAAG,CAAC,GAChG,SAAUG,EAAU,SACpB,MAAAD,EACA,WAAY,KAAK,WACjB,QAAS,KAAK,QACd,OAAQ,KAAK,OAChB,EACD,GAAI,CAACI,EAAU,OAAO,KAEtB,IAAMZ,EAAQ,KAAK,aAAa,MAC1BC,EAAS,KAAK,aAAa,OAC3Be,EAAS,KAAK,YACpB,GAAIA,GAAUA,EAAO,WAAaJ,GAAYI,EAAO,QAAUhB,GAASgB,EAAO,SAAWf,EACtF,OAAOe,EAEX,IAAMjD,EAAQ,KAAK,IAAIiC,EAAQY,EAAS,MAAOX,EAASW,EAAS,MAAM,EACjEzB,EAAe,CACjB,SAAAyB,EACA,MAAAZ,EACA,OAAAC,EACA,MAAOrC,GAAMgD,EAAS,MAAOA,EAAS,WAAY7C,CAAK,EACvD,MAAOH,GAAMgD,EAAS,MAAOA,EAAS,WAAY7C,CAAK,GAE3D,YAAK,YAAcoB,EACZA,CACX,GAhJQ8B,GAAA,CADPC,GAAS,CAAE,QAAS,CAAC,IAAI,EAAG,OAAQC,GAAc,MAAOC,EAAS,CAAE,8BAI7DH,GAAA,CADPC,GAAS,CAAE,QAAS,UAAW,MAAOE,GAAW,QAAS,CAAC,UAAW,OAAO,CAAC,CAAE,gCAIzEH,GAAA,CADPC,GAAS,CAAE,QAAS,GAAK,IAAK,EAAG,IAAK,EAAG,KAAM,GAAI,CAAE,iCAQ9CD,GAAA,CALPC,GAAS,CACN,QAAS,QACT,MAAOE,GACP,QAAS,CAAC,QAAS,WAAY,kBAAmB,cAAc,EACnE,qCAIOH,GAAA,CADPC,GAAS,CAAE,QAAS,WAAY,MAAOE,GAAW,QAAS,CAAC,WAAY,KAAK,CAAC,CAAE,gCAIzEH,GAAA,CADPC,GAAS,CAAE,QAAS,MAAO,MAAOE,GAAW,QAAS,CAAC,MAAO,SAAS,CAAC,CAAE,kCApBlEzC,GAASsC,GAAA,CAZrBI,GAAK,CACF,IAAK,YACL,UAAW,QACX,SAAU,GACV,OAAQ,CACJ,SAAU,WACV,gBAAiB,GACjB,iBAAkB,QAClB,kBAAmB,SAEvB,KAAM,CAAE,MAAO,IAAK,OAAQ,GAAG,EAClC,GACY1C,EAAS,EM5FtB,OAAS,OAAA2C,OAAkD,qBAS3D,IAAMC,GAAoB;;;;;;;;;;EAiBpBC,GAAsB;;;;;;;;;;;;;EA+BtB,SAAUC,GACdC,EACAC,EACAC,EAAiB,CAEjB,OAAON,GAAI,OAAO,CAChB,OAAQC,GACR,SAAUC,GACV,SAAU,CACR,OAAQ,CAACE,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACrC,SAAUC,EACV,WAAYC,GAEd,MAAO,OACP,MAAO,WACP,YAAa,GAGb,WAAY,GACb,CACH,CCxEO,IAAMC,GAAmC,CAC9C,CAAE,GAAI,MAAO,KAAM,cAAe,MAAO,CAAC,EAAE,CAAC,EAC7C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAG,EAAE,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,uBAAwB,MAAO,CAAC,EAAE,CAAC,EACtD,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,GAAI,GAAG,CAAC,EAChD,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAG,CAAC,EACvE,CAAE,GAAI,MAAO,KAAM,yBAA0B,MAAO,CAAC,CAAC,CAAC,EACvD,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,GAAI,GAAG,CAAC,EAChD,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,GAAI,CAAC,CAAC,EAC/C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,eAAgB,MAAO,CAAC,EAAE,CAAC,EAC9C,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAG,EAAG,CAAC,CAAC,EAC9C,CAAE,GAAI,MAAO,KAAM,mBAAoB,MAAO,CAAC,EAAE,CAAC,EAClD,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,GAAG,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,CAAC,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,uBAAwB,MAAO,CAAC,EAAE,CAAC,EACtD,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,IAAK,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,CAAC,CAAC,EAClJ,CAAE,GAAI,MAAO,KAAM,cAAe,MAAO,CAAC,EAAE,CAAC,EAC7C,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,GAAI,EAAE,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAG,GAAG,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,mBAAiB,MAAO,CAAC,EAAE,CAAC,EAC/C,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,kBAAmB,MAAO,CAAC,GAAG,CAAC,EAClD,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,OAAQ,MAAO,CAAC,EAAE,CAAC,EACtC,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,EAAE,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,GAAI,CAAC,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,iBAAkB,MAAO,CAAC,EAAE,CAAC,EAChD,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,OAAQ,MAAO,CAAC,EAAG,EAAG,CAAC,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,eAAgB,MAAO,CAAC,CAAC,CAAC,EAC7C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,GAAI,GAAI,CAAC,CAAC,EAC/C,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,iBAAkB,MAAO,CAAC,EAAG,EAAE,CAAC,EACnD,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,gBAAiB,MAAO,CAAC,EAAE,CAAC,EAC/C,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,CAAC,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,GAAI,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,GAAG,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,EAAE,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAE,CAAC,EACpF,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,GAAG,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,OAAQ,MAAO,CAAC,EAAE,CAAC,EACtC,CAAE,GAAI,MAAO,KAAM,OAAQ,MAAO,CAAC,EAAE,CAAC,EACtC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,GAAI,GAAI,CAAC,CAAC,EAC9C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,GAAI,GAAI,EAAE,CAAC,EAC/C,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,GAAG,CAAC,EAC7C,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,cAAe,MAAO,CAAC,EAAE,CAAC,EAC7C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,CAAC,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,OAAQ,MAAO,CAAC,EAAE,CAAC,EACtC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,CAAC,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,EAAE,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,CAAC,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,GAAG,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,kBAAmB,MAAO,CAAC,EAAE,CAAC,EACjD,CAAE,GAAI,MAAO,KAAM,OAAQ,MAAO,CAAC,EAAE,CAAC,EACtC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,GAAI,EAAE,CAAC,EAC9C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,gBAAiB,MAAO,CAAC,EAAE,CAAC,EAC/C,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,EAAE,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,cAAe,MAAO,CAAC,EAAE,CAAC,EAC7C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,GAAI,GAAI,GAAI,CAAC,CAAC,EACnD,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,cAAe,MAAO,CAAC,GAAI,EAAE,CAAC,EACjD,CAAE,GAAI,MAAO,KAAM,OAAQ,MAAO,CAAC,GAAI,CAAC,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,OAAQ,MAAO,CAAC,EAAE,CAAC,EACtC,CAAE,GAAI,MAAO,KAAM,cAAe,MAAO,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,EAAE,CAAC,EAClE,CAAE,GAAI,MAAO,KAAM,mBAAoB,MAAO,CAAC,GAAI,GAAI,GAAI,EAAE,CAAC,EAC9D,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,cAAe,MAAO,CAAC,CAAC,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,cAAe,MAAO,CAAC,EAAG,EAAE,CAAC,EAChD,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,CAAC,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,CAAC,CAAC,EACtC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAG,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAE,CAAC,EACtF,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,EAAE,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,eAAgB,MAAO,CAAC,EAAE,CAAC,EAC9C,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,cAAe,MAAO,CAAC,EAAG,EAAG,EAAG,EAAG,CAAC,CAAC,EACxD,CAAE,GAAI,MAAO,KAAM,eAAgB,MAAO,CAAC,EAAE,CAAC,EAC9C,CAAE,GAAI,MAAO,KAAM,cAAe,MAAO,CAAC,EAAE,CAAC,EAC7C,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,OAAQ,MAAO,CAAC,EAAE,CAAC,EACtC,CAAE,GAAI,MAAO,KAAM,OAAQ,MAAO,CAAC,EAAE,CAAC,EACtC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,eAAgB,MAAO,CAAC,EAAE,CAAC,EAC9C,CAAE,GAAI,MAAO,KAAM,cAAe,MAAO,CAAC,EAAE,CAAC,EAC7C,CAAE,GAAI,MAAO,KAAM,sBAAuB,MAAO,CAAC,CAAC,CAAC,EACpD,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,GAAI,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,CAAC,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,EAC1C,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,2BAA4B,MAAO,CAAC,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAE,CAAC,EAC1F,CAAE,GAAI,MAAO,KAAM,aAAc,MAAO,CAAC,EAAE,CAAC,EAC5C,CAAE,GAAI,MAAO,KAAM,YAAa,MAAO,CAAC,EAAE,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAE,CAAC,EACzC,CAAE,GAAI,MAAO,KAAM,UAAW,MAAO,CAAC,EAAG,CAAC,CAAC,EAC3C,CAAE,GAAI,MAAO,KAAM,QAAS,MAAO,CAAC,EAAE,CAAC,EACvC,CAAE,GAAI,MAAO,KAAM,eAAgB,MAAO,CAAC,GAAI,GAAG,CAAC,EACnD,CAAE,GAAI,MAAO,KAAM,SAAU,MAAO,CAAC,EAAE,CAAC,EACxC,CAAE,GAAI,MAAO,KAAM,WAAY,MAAO,CAAC,EAAE,CAAC,GAU/BC,GACX,ulhDCpKF,IAAIC,GAAwB,KAGtB,SAAUC,IAAK,CACnB,OAAQD,KAAYE,GAAM,CAC5B,CAEA,SAASA,IAAM,CACb,IAAMC,EAAuB,CAAA,EACvBC,EAAgB,CAAA,EAEhBC,EAAS,CAAE,GAAI,CAAC,EACtB,QAAWC,KAAOC,GAAoC,CACpD,IAAMC,EAAc,CAAA,EACpB,QAAWC,KAAQH,EAAI,MAAO,CAC5B,IAAMI,EAAO,CAAE,OAAQC,GAASN,EAAQ,KAAK,IAAII,CAAI,CAAC,EAAG,KAAMA,EAAO,CAAC,EACvED,EAAI,KAAKE,CAAI,EACbN,EAAM,KAAKM,CAAI,CACjB,CACAP,EAAU,KAAK,CAAE,GAAIG,EAAI,GAAI,KAAMA,EAAI,KAAM,MAAOE,CAAG,CAAE,CAC3D,CAMA,GAAIH,EAAO,KAAOO,GAAO,OACvB,MAAM,IAAI,MACR,uDAAkDP,EAAO,EAAE,OAAOO,GAAO,MAAM,aAAa,EAIhG,MAAO,CAAE,UAAAT,EAAW,MAAAC,CAAK,CAC3B,CAGA,SAASO,GAASN,EAAwBQ,EAAa,CACrD,IAAMC,EAAS,IAAI,aAAaD,EAAQ,CAAC,EACrCE,EAAM,EACNC,EAAM,EACV,QAAS,EAAI,EAAG,EAAIH,EAAO,IACzBE,GAAOE,GAAUZ,CAAM,EACvBW,GAAOC,GAAUZ,CAAM,EACvBS,EAAO,EAAI,CAAC,EAAIC,EAAM,IACtBD,EAAO,EAAI,EAAI,CAAC,EAAIE,EAAM,IAE5B,OAAOF,CACT,CAGA,SAASG,GAAUZ,EAAsB,CACvC,IAAIa,EAAQ,EACRC,EAAS,EACb,OAAS,CACP,IAAMC,EAAOR,GAAO,WAAWP,EAAO,IAAI,EAAI,GAG9C,GAFAc,IAAWC,EAAO,KAASF,EAEvBE,EAAO,GAAM,MACjBF,GAAS,CACX,CACA,OAAOC,EAAS,EAAI,EAAEA,GAAU,GAAKA,GAAU,CACjD,CCtEA,IAAIE,GAA6B,KAG3B,SAAUC,IAAW,CACzB,OAAQD,KAAUE,GAAK,CACzB,CAUA,SAASC,GAAQC,EAAaC,EAAW,CAGvC,OAAO,KAAK,MAAMD,EAAM,GAAI,EAAI,IAAY,KAAK,MAAMC,EAAM,GAAI,CACnE,CAYA,SAASH,IAAK,CAEZ,IAAMI,EAAS,IAAI,IACnB,QAAWC,KAAQC,GAAK,EAAG,MAAO,CAChC,IAAMC,EAAQF,EAAK,OAAO,OAAS,EACnC,QAASG,EAAI,EAAGA,EAAID,EAAOC,IAAK,CAC9B,IAAMC,GAAKD,EAAI,GAAKD,EACdG,EAAKL,EAAK,OAAOG,EAAI,CAAC,EACtBG,EAAKN,EAAK,OAAOG,EAAI,EAAI,CAAC,EAC1BI,EAAKP,EAAK,OAAOI,EAAI,CAAC,EACtBI,EAAKR,EAAK,OAAOI,EAAI,EAAI,CAAC,EAC1BK,EAAIb,GAAQS,EAAIC,CAAE,EAClB,EAAIV,GAAQW,EAAIC,CAAE,EACxB,GAAIC,IAAM,EAAG,SAGb,IAAMC,EAAMD,EAAI,EAAI,GAAGA,CAAC,IAAI,CAAC,GAAK,GAAG,CAAC,IAAIA,CAAC,GACtCV,EAAO,IAAIW,CAAG,GAAGX,EAAO,IAAIW,EAAK,CAAE,EAAAD,EAAG,EAAG,GAAAJ,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAE,CAAE,CAChE,CACF,CAGA,IAAMG,EAAW,CAAC,GAAGZ,EAAO,OAAM,CAAE,EAC9Ba,EAAK,IAAI,IACfD,EAAS,QAAQ,CAACE,EAASC,IAAS,CAClC,QAAWC,IAAQ,CAACF,EAAQ,EAAGA,EAAQ,CAAC,EAAG,CACzC,IAAMG,EAAOJ,EAAG,IAAIG,CAAI,EACpBC,EAAMA,EAAK,KAAKF,CAAK,EACpBF,EAAG,IAAIG,EAAM,CAACD,CAAK,CAAC,CAC3B,CACF,CAAC,EAED,IAAMG,EAAO,IAAI,WAAWN,EAAS,MAAM,EACrCO,EAAoB,CAAA,EAGpBC,EAAUJ,GAAwB,CACtC,QAAWD,KAASF,EAAG,IAAIG,CAAI,GAAK,CAAA,EAAI,GAAI,CAACE,EAAKH,CAAK,EAAG,OAAOA,EACjE,MAAO,EACT,EAEA,QAASM,EAAQ,EAAGA,EAAQT,EAAS,OAAQS,IAAS,CACpD,GAAIH,EAAKG,CAAK,EAAG,SAEjB,IAAMC,EAAQV,EAASS,CAAK,EAC5BH,EAAKG,CAAK,EAAI,EAKd,IAAME,EAAoB,CAACD,EAAM,GAAIA,EAAM,GAAIA,EAAM,GAAIA,EAAM,EAAE,EAC7DN,EAAOM,EAAM,EACjB,OAAS,CACP,IAAMP,EAAQK,EAAOJ,CAAI,EACzB,GAAID,EAAQ,EAAG,MACfG,EAAKH,CAAK,EAAI,EACd,IAAMD,EAAUF,EAASG,CAAK,EACxBS,EAAMV,EAAQ,IAAME,EAAOF,EAAQ,EAAIA,EAAQ,EAC/CW,EAAKX,EAAQ,IAAME,EAAOF,EAAQ,GAAKA,EAAQ,GAC/CY,EAAKZ,EAAQ,IAAME,EAAOF,EAAQ,GAAKA,EAAQ,GACrDS,EAAQ,KAAKE,EAAIC,CAAE,EACnBV,EAAOQ,CACT,CAEA,IAAMG,EAAqB,CAAA,EAE3B,IADAX,EAAOM,EAAM,IACJ,CACP,IAAMP,EAAQK,EAAOJ,CAAI,EACzB,GAAID,EAAQ,EAAG,MACfG,EAAKH,CAAK,EAAI,EACd,IAAMD,EAAUF,EAASG,CAAK,EACxBS,EAAMV,EAAQ,IAAME,EAAOF,EAAQ,EAAIA,EAAQ,EAC/CW,EAAKX,EAAQ,IAAME,EAAOF,EAAQ,GAAKA,EAAQ,GAC/CY,EAAKZ,EAAQ,IAAME,EAAOF,EAAQ,GAAKA,EAAQ,GACrDa,EAAS,KAAKF,EAAIC,CAAE,EACpBV,EAAOQ,CACT,CAEA,GAAIG,EAAS,SAAW,EAAG,CACzBR,EAAI,KAAK,aAAa,KAAKI,CAAO,CAAC,EACnC,QACF,CAEA,IAAMK,EAAS,IAAI,aAAaD,EAAS,OAASJ,EAAQ,MAAM,EAC5DM,EAAQ,EACZ,QAASzB,EAAIuB,EAAS,OAAS,EAAGvB,GAAK,EAAGA,GAAK,EAC7CwB,EAAOC,GAAO,EAAIF,EAASvB,CAAC,EAC5BwB,EAAOC,GAAO,EAAIF,EAASvB,EAAI,CAAC,EAElCwB,EAAO,IAAIL,EAASM,CAAK,EACzBV,EAAI,KAAKS,CAAM,CACjB,CAEA,OAAOT,CACT,CCrKA,OACE,WAAAW,GACA,gBAAAC,GACA,aAAAC,GACA,QAAAC,GAGA,YAAAC,GACA,OAAAC,GACA,cAAAC,GACA,OAAAC,GACA,WAAAC,GACA,YAAAC,MAOK,qBAEP,OACE,eAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,aAAAC,GACA,eAAAC,GACA,cAAAC,OAEK,+BCgEA,IAAMC,GAAwB,CACnC,UACA,UACA,UACA,UACA,UACA,WAII,SAAUC,GAAcC,EAAa,CACzC,IAAMC,EAAUH,GAChB,OAAOG,GAAUD,EAAQC,EAAQ,OAAUA,EAAQ,QAAUA,EAAQ,MAAM,CAC7E,CAGO,IAAMC,GAAoB,UAE3BC,GAAsB,IACtBC,GAAoB,KACpBC,GAAmB,IAarBC,GAAW,EACf,SAASC,GAAOC,EAAc,CAC5B,OAAAF,IAAY,EACL,GAAGE,CAAM,IAAIF,EAAQ,IAAI,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,MAAM,EAAG,CAAC,CAAC,EACxE,CAGM,SAAUG,GACdC,EAAmC,CAAE,IAAK,EAAG,IAAK,CAAC,EAAE,CAErD,MAAO,CACL,GAAIH,GAAO,IAAI,EACf,MAAO,GACP,IAAKG,EAAG,IACR,IAAKA,EAAG,IACR,MAAO,GACP,KAAMP,GACN,QAAS,EACT,QAAS,GAEb,CAGM,SAAUQ,GAAUC,EAAcC,EAAU,CAChD,MAAO,CACL,GAAIN,GAAO,KAAK,EAChB,KAAAK,EACA,GAAAC,EACA,MAAOX,GACP,MAAOE,GACP,KAAMC,GACN,SAAU,EACV,QAAS,GAEb,CAGM,SAAUS,GAAUC,EAAgB,CACxC,MAAO,CAAE,KAAM,SAAU,SAAAA,CAAQ,CACnC,CAGM,SAAUC,GAASC,EAAaC,EAAW,CAC/C,MAAO,CAAE,KAAM,QAAS,IAAAD,EAAK,IAAAC,CAAG,CAClC,CAiBM,SAAUC,GAAUC,EAAc,CACtC,OAAOC,GAAOD,CAAK,EAAE,QAAQ,CAACE,EAAKtB,IAAS,CAC1C,IAAMiB,EAAMM,GAAOD,EAAI,KAAOA,EAAI,QAAQ,EACpCJ,EAAMK,GAAOD,EAAI,KAAOA,EAAI,KAAOA,EAAI,SAAS,EACtD,OAAIL,IAAQ,MAAQC,IAAQ,KAAa,CAAA,EAClC,CACL,CACE,GAAIM,GAAKF,EAAI,GAAI,MAAMtB,CAAK,EAAE,EAC9B,MAAOyB,GAAKH,EAAI,OAASA,EAAI,IAAI,GAAK,GACtC,IAAKI,GAAMT,EAAK,IAAK,EAAE,EACvB,IAAKU,GAAcT,CAAG,EACtB,MAAOO,GAAKH,EAAI,KAAK,GAAK,GAC1B,KAAMM,GAASN,EAAI,KAAMnB,EAAmB,EAC5C,QAAS0B,GAAKP,EAAI,OAAO,EAGzB,QAASA,EAAI,UAAY,IAG/B,CAAC,CACH,CAGM,SAAUQ,GAAOV,EAAc,CACnC,OAAOC,GAAOD,CAAK,EAAE,QAAQ,CAACE,EAAKtB,IAAS,CAC1C,IAAMY,EAAOmB,GAAMT,EAAI,IAAI,EACrBT,EAAKkB,GAAMT,EAAI,EAAE,EACvB,MAAI,CAACV,GAAQ,CAACC,EAAW,CAAA,EAClB,CACL,CACE,GAAIW,GAAKF,EAAI,GAAI,OAAOtB,CAAK,EAAE,EAC/B,KAAAY,EACA,GAAAC,EACA,MAAOY,GAAKH,EAAI,KAAK,GAAKpB,GAC1B,MAAO0B,GAASN,EAAI,MAAOlB,EAAiB,EAC5C,KAAMsB,GAAMH,GAAOD,EAAI,IAAI,GAAKjB,GAAkB,EAAG,CAAC,EACtD,SAAUwB,GAAKP,EAAI,QAAQ,EAC3B,QAASA,EAAI,UAAY,IAG/B,CAAC,CACH,CAGM,SAAUU,GAAeC,EAA+B,CAC5D,OAAO,KAAK,UAAUA,CAAO,CAC/B,CAYM,SAAUC,GAAYC,EAAyB,CACnD,OAAO,KAAK,UACVA,EAAK,IAAKC,IAAS,CAAE,GAAGA,EAAK,KAAMC,GAAWD,EAAI,IAAI,EAAG,GAAIC,GAAWD,EAAI,EAAE,CAAC,EAAG,CAAC,CAEvF,CAEA,SAASC,GAAWC,EAAW,CAC7B,OAAOA,EAAI,OAAS,SAAWA,EAAI,SAAW,CAACA,EAAI,IAAKA,EAAI,GAAG,CACjE,CAUA,SAASP,GAAMX,EAAc,CAC3B,GAAI,OAAOA,GAAU,SACnB,OAAOA,EAAM,KAAI,IAAO,GAAK,KAAON,GAAUM,CAAK,EAErD,GAAI,MAAM,QAAQA,CAAK,EAAG,CACxB,IAAMH,EAAMM,GAAOH,EAAM,CAAC,CAAC,EACrBF,EAAMK,GAAOH,EAAM,CAAC,CAAC,EAC3B,OAAOH,IAAQ,MAAQC,IAAQ,KAC3B,KACAF,GAASU,GAAMT,EAAK,IAAK,EAAE,EAAGU,GAAcT,CAAG,CAAC,CACtD,CACA,GAAI,OAAOE,GAAU,UAAYA,IAAU,KAAM,OAAO,KACxD,IAAME,EAAMF,EACZ,GAAI,OAAOE,EAAI,UAAa,SAAU,OAAOR,GAAUQ,EAAI,QAAQ,EACnE,IAAML,EAAMM,GAAOD,EAAI,KAAOA,EAAI,QAAQ,EACpCJ,EAAMK,GAAOD,EAAI,KAAOA,EAAI,KAAOA,EAAI,SAAS,EACtD,OAAOL,IAAQ,MAAQC,IAAQ,KAC3B,KACAF,GAASU,GAAMT,EAAK,IAAK,EAAE,EAAGU,GAAcT,CAAG,CAAC,CACtD,CAMA,SAASG,GAAOD,EAAc,CAC5B,GAAI,OAAOA,GAAU,UAAYA,EAAM,KAAI,IAAO,GAAI,MAAO,CAAA,EAC7D,GAAI,CACF,IAAMmB,EAAkB,KAAK,MAAMnB,CAAK,EACxC,OAAK,MAAM,QAAQmB,CAAM,EAClBA,EAAO,OACXjB,GAAoB,OAAOA,GAAQ,UAAYA,IAAQ,IAAI,EAF3B,CAAA,CAIrC,MAAQ,CACN,MAAO,CAAA,CACT,CACF,CASA,SAASE,GAAKJ,EAAgBoB,EAAkB,CAC9C,OAAOf,GAAKL,CAAK,GAAKoB,CACxB,CAEA,SAASf,GAAKL,EAAc,CAC1B,OAAO,OAAOA,GAAU,UAAYA,EAAM,KAAI,IAAO,GAAKA,EAAQ,IACpE,CAEA,SAASG,GAAOH,EAAc,CAC5B,OAAO,OAAOA,GAAU,UAAY,OAAO,SAASA,CAAK,EAAIA,EAAQ,IACvE,CAGA,SAASS,GAAKT,EAAc,CAC1B,IAAMqB,EAAIlB,GAAOH,CAAK,EACtB,OAAOqB,IAAM,KAAO,EAAIf,GAAMe,EAAG,EAAG,CAAC,CACvC,CAGA,SAASb,GAASR,EAAgBsB,EAAgB,CAChD,IAAMD,EAAIlB,GAAOH,CAAK,EACtB,OAAOqB,IAAM,MAAQA,GAAK,EAAIC,EAAWD,CAC3C,CAcA,SAASd,GAAcP,EAAa,CAClC,OAAIA,GAAS,MAAQA,GAAS,IAAYA,IAC/BA,EAAQ,KAAO,IAAO,KAAO,IAAO,GACjD,CAEA,SAASM,GAAMN,EAAeuB,EAAaC,EAAW,CACpD,OAAOxB,EAAQuB,EAAMA,EAAMvB,EAAQwB,EAAMA,EAAMxB,CACjD,CC7SM,SAAUyB,GAAgBC,EAAa,CAC3C,OAAOC,GAAUD,CAAK,EAAE,QAAQ,CAACE,EAAQC,IACvCD,EAAO,SAAWA,EAAO,QAAU,EAC/B,CACE,CACE,GAAIA,EAAO,GACX,IAAKA,EAAO,IACZ,IAAKA,EAAO,IACZ,MAAOA,EAAO,QAAU,GAAKE,GAAcD,CAAK,EAAID,EAAO,MAC3D,KAAMG,GAAMH,EAAO,KAAM,KAAO,EAAG,EACnC,QAASA,EAAO,UAGpB,CAAA,CAAE,CAEV,CAcM,SAAUI,GACdC,EACAC,EAAoB,CAEpB,IAAMC,EAAO,IAAI,IACjB,QAAWP,KAAUD,GAAUO,CAAY,EAAGC,EAAK,IAAIP,EAAO,GAAIA,CAAM,EAExE,OAAOQ,GAAOH,CAAS,EAAE,QAASI,GAAO,CACvC,GAAI,CAACA,EAAI,SAAWA,EAAI,UAAY,EAAG,MAAO,CAAA,EAC9C,IAAMC,EAAOC,GAAWF,EAAI,KAAMF,CAAI,EAChCK,EAAKD,GAAWF,EAAI,GAAIF,CAAI,EAClC,MAAI,CAACG,GAAQ,CAACE,EAAW,CAAA,EAClB,CACL,CACE,GAAIH,EAAI,GACR,KAAAC,EACA,GAAAE,EACA,MAAOH,EAAI,MACX,MAAON,GAAMM,EAAI,MAAO,KAAQ,EAAG,EACnC,KAAMA,EAAI,KACV,SAAUA,EAAI,UAGpB,CAAC,CACH,CAEA,SAASE,GACPE,EACAC,EAAiC,CAEjC,GAAID,EAAI,OAAS,QAAS,MAAO,CAAE,IAAKA,EAAI,IAAK,IAAKA,EAAI,GAAG,EAC7D,IAAMb,EAASc,EAAQ,IAAID,EAAI,QAAQ,EACvC,OAAOb,EAAS,CAAE,IAAKA,EAAO,IAAK,IAAKA,EAAO,GAAG,EAAK,IACzD,CAUM,SAAUe,GAAYN,EAAgD,CAC1E,IAAMC,EAAOD,EAAI,KACXG,EAAKH,EAAI,GACTO,EAAO,KAAK,IAAIJ,EAAG,IAAMF,EAAK,GAAG,EAAI,KAAK,IAAIE,EAAG,IAAMF,EAAK,GAAG,EACrE,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,KAAK,MAAMM,EAAO,EAAG,CAAC,CAAC,CAC1D,CAEA,SAASb,GAAML,EAAemB,EAAaC,EAAW,CACpD,OAAOpB,EAAQmB,EAAMA,EAAMnB,EAAQoB,EAAMA,EAAMpB,CACjD,CC7DO,IAAMqB,GAAe,CAAC,KAAM,IAAK,IAAK,EAAE,EAEzCC,GAAM,KAAK,GAAK,IAQhB,SAAUC,GAAe,CAAE,IAAAC,EAAK,IAAAC,CAAG,EAAU,CACjD,IAAMC,EAAMF,EAAMF,GACZK,EAASF,EAAMH,GACfM,EAAO,KAAK,IAAIF,CAAG,EACzB,MAAO,CACL,EAAGE,EAAO,KAAK,IAAID,CAAM,EACzB,EAAG,KAAK,IAAID,CAAG,EACf,EAAG,CAACE,EAAO,KAAK,IAAID,CAAM,EAE9B,CAGM,SAAUE,GACdC,EACAC,EAAc,CAEd,GAAM,CAAE,EAAAC,EAAG,EAAAC,EAAG,EAAAC,CAAC,EAAKX,GAAeO,CAAE,EACrC,MAAO,CAACE,EAAID,EAAQE,EAAIF,EAAQG,EAAIH,CAAM,CAC5C,CAkBM,SAAUI,GAAW,CAAE,IAAAX,EAAK,IAAAC,CAAG,EAAU,CAC7C,MAAO,CAAE,GAAIA,EAAM,KAAO,IAAK,EAAG,GAAMD,EAAM,GAAG,CACnD,CAyBM,SAAUY,GACd,CAAE,IAAAZ,EAAK,IAAAC,CAAG,EACVY,EACAC,EAAc,CAEd,MAAO,CAAE,EAAIb,EAAM,IAAOY,EAAO,EAAIb,EAAM,IAAOc,CAAM,CAC1D,CAOM,SAAUC,GACdF,EACAC,EAAc,CAEd,MAAO,CAAC,CAACD,EAAQ,EAAG,CAACC,EAAS,EAAGD,EAAQ,EAAGC,EAAS,CAAC,CACxD,CAsBM,SAAUE,GAAkBf,EAAW,CAC3C,MAAO,CAACA,CACV,CAGM,SAAUgB,GAAkBC,EAAa,CAC7C,MAAO,CAACA,CACV,CAeM,SAAUC,GACdC,EACAC,EACAC,EAAiE,CAAA,EAAE,CAEnE,IAAMf,EAASe,EAAQ,QAAU,EAC3BC,EAAOD,EAAQ,MAAQ,EACvBE,EAAW,KAAK,IAAI,EAAG,KAAK,MAAMF,EAAQ,UAAY,EAAE,CAAC,EAEzDG,EAAI1B,GAAeqB,CAAI,EACvBM,EAAI3B,GAAesB,CAAE,EAErBM,EAAMC,GAAMH,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,EAAG,GAAI,CAAC,EACpDG,EAAQ,KAAK,KAAKF,CAAG,EAErBG,EAAqC,CAAA,EAC3C,QAASC,EAAI,EAAGA,GAAKP,EAAUO,IAAK,CAClC,IAAMC,EAAID,EAAIP,EAIR,CAACS,EAAIC,CAAE,EACX,KAAK,IAAIL,CAAK,EAAI,KACd,CAAC,EAAIG,EAAGA,CAAC,EACT,CACE,KAAK,KAAK,EAAIA,GAAKH,CAAK,EAAI,KAAK,IAAIA,CAAK,EAC1C,KAAK,IAAIG,EAAIH,CAAK,EAAI,KAAK,IAAIA,CAAK,GAGtCrB,EAAIiB,EAAE,EAAIQ,EAAKP,EAAE,EAAIQ,EACrB,EAAIT,EAAE,EAAIQ,EAAKP,EAAE,EAAIQ,EACrBxB,EAAIe,EAAE,EAAIQ,EAAKP,EAAE,EAAIQ,EACrBC,EAAS,KAAK,MAAM3B,EAAG,EAAGE,CAAC,GAAK,EAChC0B,EAAS7B,GAAU,EAAIgB,EAAO,KAAK,IAAI,KAAK,GAAKS,CAAC,GAAMG,EAE9DL,EAAO,KAAK,CAACtB,EAAI4B,EAAO,EAAIA,EAAO1B,EAAI0B,CAAK,CAAC,CAC/C,CACA,OAAON,CACT,CAWM,SAAUO,GAAajB,EAAcC,EAAU,CACnD,QAAWA,EAAKD,GAAQ,IAAO,KAAO,IAAO,GAC/C,CAEA,SAASQ,GAAMU,EAAeC,EAAaC,EAAW,CACpD,OAAOF,EAAQC,EAAMA,EAAMD,EAAQE,EAAMA,EAAMF,CACjD,CCpNA,OAAS,cAAAG,OAAoC,qBA8BvC,SAAUC,GAAUC,EAAa,CACrC,OAAO,KAAK,MAAMA,EAAQ,CAAC,CAC7B,CAWM,SAAUC,GAAiBC,EAAoB,CACnD,IAAMF,EAAQE,EAAM,MACdC,EAASJ,GAAUC,CAAK,EACxBI,EAASC,GAAaL,EAAOG,CAAM,EAEnCG,EAAI,IAAIC,GAKdD,EAAE,KAAK,CAAE,MAAAN,EAAO,OAAAG,CAAM,CAAE,EAAE,KAAKD,EAAM,KAAK,EAO1C,QAAWM,KAAWC,GAAK,EAAG,UAAW,CACvC,IAAMC,EAA0B,CAAA,EAChC,QAAWC,KAAQH,EAAQ,MAAOI,GAAWF,EAAUC,EAAMX,EAAOG,CAAM,EACtEO,EAAS,SAAW,GACxBJ,EAAE,KAAK,CAAE,KAAMI,EAAU,aAAcN,CAAM,CAAE,EAAE,KAAKF,EAAM,IAAI,CAClE,CAOA,GALIA,EAAM,YAAc,GAAGW,GAAeP,EAAGJ,EAAOF,EAAOG,EAAQC,CAAM,EAKrEF,EAAM,UACR,QAAWY,KAAQC,GAAeb,EAAM,cAAeF,EAAOG,CAAM,EAClEG,EAAE,KAAK,CAAE,OAAQQ,CAAI,CAAE,EAAE,OAAO,CAC9B,KAAMZ,EAAM,eACZ,OAAQA,EAAM,eACf,EAIL,OAAOI,CACT,CAEA,SAASM,GACPF,EACAC,EACAX,EACAG,EAAc,CAEd,IAAMa,EAAQL,EAAK,OAAO,OAAS,EACnC,QAAS,EAAI,EAAG,EAAIK,EAAO,IAAK,CAC9B,GAAM,CAAE,EAAAC,EAAG,EAAAC,CAAC,EAAKC,GACf,CAAE,IAAKR,EAAK,OAAO,EAAI,CAAC,EAAI,IAAKA,EAAK,OAAO,EAAI,EAAI,CAAC,CAAE,EACxDX,EACAG,CAAM,EAERO,EAAS,KAAK,IAAM,EAAI,CAAE,KAAM,IAAK,EAAAO,EAAG,EAAAC,CAAC,EAAK,CAAE,KAAM,IAAK,EAAAD,EAAG,EAAAC,CAAC,CAAE,CACnE,CAIAR,EAAS,KAAK,CAAE,KAAM,GAAG,CAAE,CAC7B,CAeA,SAASG,GACPP,EACAJ,EACAF,EACAG,EACAC,EAAiD,CAEjD,IAAMgB,EAAQ,CAAE,KAAMlB,EAAM,OAAQ,OAAQA,EAAM,WAAW,EAE7D,QAAWY,KAAQO,GAAW,EAAI,CAChC,IAAML,EAAQF,EAAK,OAAS,EAC5B,GAAIE,EAAQ,EAAG,SACf,IAAMN,EAA0B,CAAA,EAChC,QAASY,EAAI,EAAGA,EAAIN,EAAOM,IAAK,CAC9B,GAAM,CAAE,EAAAL,EAAG,EAAAC,CAAC,EAAKC,GACf,CAAE,IAAKL,EAAKQ,EAAI,CAAC,EAAI,IAAKR,EAAKQ,EAAI,EAAI,CAAC,CAAE,EAC1CtB,EACAG,CAAM,EAERO,EAAS,KAAKY,IAAM,EAAI,CAAE,KAAM,IAAK,EAAAL,EAAG,EAAAC,CAAC,EAAK,CAAE,KAAM,IAAK,EAAAD,EAAG,EAAAC,CAAC,CAAE,CACnE,CAGAZ,EAAE,KAAK,CAAE,KAAMI,EAAU,aAAcN,CAAM,CAAE,EAAE,OAAOgB,CAAK,CAC/D,CACF,CAWA,SAASL,GACPQ,EACAvB,EACAG,EAAc,CAEd,IAAMqB,EAAU,KAAK,IAAI,EAAG,KAAK,IAAI,GAAID,CAAI,CAAC,EACxCE,EAAsC,CAAA,EAE5C,QAASC,EAAM,KAAMA,GAAO,IAAKA,GAAOF,EAAS,CAC/C,IAAMG,EAAuC,CAAA,EAC7C,QAASC,EAAM,IAAKA,GAAO,GAAIA,GAAO,EACpCD,EAAS,KAAKR,GAAe,CAAE,IAAAS,EAAK,IAAAF,CAAG,EAAI1B,EAAOG,CAAM,CAAC,EAE3DsB,EAAM,KAAKE,CAAQ,CACrB,CAEA,QAASC,EAAM,IAAMJ,EAASI,GAAO,GAAKJ,EAASI,GAAOJ,EACxDC,EAAM,KAAK,CACTN,GAAe,CAAE,IAAAS,EAAK,IAAK,IAAI,EAAI5B,EAAOG,CAAM,EAChDgB,GAAe,CAAE,IAAAS,EAAK,IAAK,GAAG,EAAI5B,EAAOG,CAAM,EAChD,EAGH,OAAOsB,CACT,2UJrLMI,EAAS,EAGTC,GAAc,IAyFPC,EAAN,cAAoBC,EAAoB,CA2F7C,YAAYC,EAAqC,CAC/C,MAAMA,CAAqD,CAC7D,CAkBA,QAAQC,EAAiE,CACvE,OAAO,KAAK,GAAG,CACb,KAAMC,GAAWD,EAAK,MAAM,QAAU,CAAA,CAAE,EACxC,SAAUA,EAAK,SACf,OAAQA,EAAK,QAAUE,GAAS,EACjC,CACH,CAYA,MAAMF,EAAkH,CACtH,IAAMG,EAAOH,EAAK,MAAQ,CAAE,SAAU,EAAG,UAAW,CAAC,EAC/C,CAAE,SAAAI,EAAU,UAAAC,EAAW,QAAAC,EAAU,IAAK,IAAAC,EAAM,GAAI,EAAKJ,EACrDK,EAAWR,EAAK,UAAY,IAC5BS,EAAST,EAAK,QAAUE,GAAS,EAEjCQ,EAAY,KAAK,MACjBC,EAAgB,KAAK,UACrBC,EAAW,KAAK,KAKhBC,EAAUH,EAAYI,GAAaJ,EAAW,CAACL,CAAS,EAE9D,OAAOU,GAAaP,EAAWQ,GAAK,CAClC,IAAMC,EAAQR,EAAOO,CAAC,EACtB,KAAK,IAAI,CACP,MAAON,GAAaG,EAAUH,GAAaO,EAC3C,UAAWN,GAAiBP,EAAWO,GAAiBM,EAGxD,MAAOL,GAAYN,EAAUM,GAAYK,IAAU,EAAIV,EAAM,KAAK,IAAI,KAAK,GAAKU,CAAK,GAC/D,CAC1B,CAAC,CACH,CAEmB,cAAY,CAC7B,IAAMC,EAAQ,IAAIC,GACZC,EAAWzB,EAAS,KAAK,IAAI,KAAM,KAAK,IAAI,EAOlDuB,EAAM,YAAY,CAChB,IAAK,KAAK,IACV,KAAM,KAAK,IAAI,KAAOE,EAAWzB,GAAU,EAAG,EAC9C,IAAKyB,EAAWzB,EAAS,EAMzB,MAAO0B,GAAY,KAAK,KAAK,EAC7B,UAAW,KAAK,UAChB,SAAAD,EACD,EAQDF,EACG,MAAM,CACL,KAAM,UACN,UAAW,KAAK,iBAChB,MAAO,KAAK,aACb,EACA,MACC,CAAE,KAAM,cAAe,UAAW,KAAK,aAAc,MAAO,KAAK,QAAQ,EACzE,CAAE,SAAU,CAACvB,EAAS,EAAGA,EAAS,EAAGA,EAAS,CAAC,CAAC,CAAE,EAEnD,MACC,CACE,KAAM,cACN,UAAW,KAAK,aAAe,IAC/B,MAAO,KAAK,UAEd,CAAE,SAAU,CAAC,CAACA,EAAS,EAAG,CAACA,EAAQ,CAACA,EAAS,CAAC,CAAC,CAAE,EAGrD,IAAM2B,EAAK,IAAIC,GACf,YAAK,UAAUD,CAAE,EACjB,KAAK,QAAQA,CAAE,EACf,KAAK,WAAWA,CAAE,EACd,KAAK,YAAY,KAAK,cAAcA,CAAE,EAE1CJ,EAAM,KAAKI,CAAE,EACNJ,CACT,CAGQ,UAAUI,EAAc,CAC9BA,EAAG,OAAO,CACR,OAAQ3B,EAIR,SAAU,CAAC,IAAK,EAAE,EAClB,KAAM,KAAK,SAAQ,EAAG,QAGtB,UAAW,IACX,UAAW,EACZ,CACH,CAGQ,cAAc2B,EAAc,CAClCA,EAAG,OAAO,CACR,OAAQ3B,EAAS,KAAK,IAAI,MAAO,KAAK,cAAc,EACpD,SAAU,CAAC,GAAI,EAAE,EACjB,SAAU6B,GACR,KAAK,gBACL,KAAK,kBACL,KAAK,mBAAmB,EAE3B,CACH,CAcQ,WAAWF,EAAc,CAC/B,IAAMG,EAAUC,GAAgB,KAAK,OAAO,EAC5C,GAAID,EAAQ,SAAW,EAAG,OAE1B,IAAME,EAA4B,CAAA,EAC5BC,EAAkB,CAAA,EAExB,QAAWC,KAAUJ,EAAS,CAC5B,IAAMK,EAAOD,EAAO,KAAOlC,EAC3BgC,EAAW,KAAK,CAGd,SAAUI,GAAiBF,EAAQlC,EAASmC,EAAOlC,EAAW,EAC9D,MAAOkC,EACR,EACDF,EAAO,KAAKC,EAAO,KAAK,CAC1B,CAEAP,EAAG,UACDU,GAAI,OAAO,CAAE,OAAQ,EAAG,SAAU,CAAC,GAAI,EAAE,CAAC,CAAE,EAI5CC,GAAI,MAAM,CAAE,YAAa,EAAI,CAAE,EAC/BN,EACA,CAAE,OAAAC,CAAM,CAAE,CAEd,CAGQ,QAAQN,EAAc,CAG5B,QAAWf,KAAO2B,GAAa,KAAK,KAAM,KAAK,OAAO,EAAG,CACvD,IAAMC,EAASC,GAAY7B,EAAI,KAAMA,EAAI,GAAI,CAC3C,OAAQZ,EACR,KAAMY,EAAI,KACV,SAAU8B,GAAY9B,CAAG,EAC1B,EAMK+B,EAAQ,KAAK,IAAI,EAAG,KAAK,MAAMH,EAAO,OAAS5B,EAAI,QAAQ,CAAC,EAElEe,EAAG,KACDU,GAAI,KAAK,CACP,OAAQG,EAAO,MAAM,EAAGG,CAAK,EAC7B,OAAQ/B,EAAI,MAAQZ,EACpB,SAAU,CAAC2C,EAAO,CAAC,EACpB,EAGDL,GAAI,MAAM,CAAE,MAAO1B,EAAI,MAAO,YAAa,EAAI,CAAE,CAAC,CAEtD,CACF,CA0BQ,MAA+C,KAE/C,UAAQ,CACd,IAAMgC,EAAQ,KAAK,SAAQ,EACrBC,EAAM,CACVD,EAAM,MACNA,EAAM,MACNA,EAAM,KACNA,EAAM,OACNA,EAAM,YACNA,EAAM,UACNA,EAAM,eACNA,EAAM,cACNA,EAAM,gBACN,KAAK,GAAG,EAEJE,EAAS,KAAK,MACpB,GAAIA,GAAQ,MAAQD,EAAK,OAAOC,EAAO,IAEvC,IAAMC,EAAgB,CACpB,QAAS,CACP,OAAQC,GAAiBJ,CAAK,EAC9B,MAAOA,EAAM,MACb,OAAQK,GAAUL,EAAM,KAAK,EAC7B,OAAQ,GACR,SAAU,SAASC,CAAG,KAG1B,YAAK,MAAQ,CAAE,IAAAA,EAAK,IAAAE,CAAG,EAChBA,CACT,CAGQ,UAAQ,CACd,MAAO,CAIL,MAAO,KAAK,IAAI,IAAK,KAAK,MAAM,KAAK,WAAa,CAAC,EAAI,CAAC,EACxD,MAAOG,GAAM,KAAK,KAAK,EACvB,KAAMA,GAAM,KAAK,IAAI,EACrB,OAAQA,GAAM,KAAK,MAAM,EACzB,YAAa,KAAK,YAClB,UAAW,KAAK,UAChB,eAAgBA,GAAM,KAAK,cAAc,EACzC,cAAe,KAAK,cACpB,eAAgB,KAAK,eAEzB,GAlXuDC,EAAA,CAAtDC,EAAS,CAAE,QAAS,KAAM,MAAOC,EAAS,CAAE,oCAEeF,EAAA,CAA3DC,EAAS,CAAE,QAAS,UAAW,MAAOC,EAAS,CAAE,+BACUF,EAAA,CAA3DC,EAAS,CAAE,QAAS,UAAW,MAAOC,EAAS,CAAE,8BASUF,EAAA,CAA3DC,EAAS,CAAE,QAAS,UAAW,MAAOC,EAAS,CAAE,gCACIF,EAAA,CAArDC,EAAS,CAAE,QAAS,IAAK,MAAOC,EAAS,CAAE,qCAEUF,EAAA,CAArDC,EAAS,CAAE,QAAS,GAAM,MAAOE,EAAQ,CAAE,mCAEpCH,EAAA,CADPC,EAAS,CAAE,QAAS,YAAa,MAAOC,EAAS,CAAE,wCAECF,EAAA,CAApDC,EAAS,CAAE,QAAS,GAAI,MAAOC,EAAS,CAAE,uCACSF,EAAA,CAAnDC,EAAS,CAAE,QAAS,EAAG,MAAOC,EAAS,CAAE,wCAaNF,EAAA,CAAnCC,EAAS,CAAE,QAAS,GAAG,CAAE,+BAMSD,EAAA,CAAlCC,EAAS,CAAE,QAAS,EAAE,CAAE,mCAEWD,EAAA,CAAnCC,EAAS,CAAE,QAAS,GAAG,CAAE,8BACSD,EAAA,CAAlCC,EAAS,CAAE,QAAS,EAAE,CAAE,6BAIYD,EAAA,CAApCC,EAAS,CAAE,QAAS,GAAI,CAAE,0CAEnBD,EAAA,CADPC,EAAS,CAAE,QAAS,UAAW,OAAQG,GAAgB,MAAOC,EAAW,CAAE,sCAExCL,EAAA,CAAnCC,EAAS,CAAE,QAAS,GAAG,CAAE,sCAElBD,EAAA,CADPC,EAAS,CAAE,QAAS,UAAW,OAAQG,GAAgB,MAAOC,EAAW,CAAE,kCAOtBL,EAAA,CAArDC,EAAS,CAAE,QAAS,GAAM,MAAOE,EAAQ,CAAE,oCAEpCH,EAAA,CADPC,EAAS,CAAE,QAAS,UAAW,OAAQG,GAAgB,MAAOC,EAAW,CAAE,yCAGvCL,EAAA,CAApCC,EAAS,CAAE,QAAS,IAAI,CAAE,wCAEOD,EAAA,CAAjCC,EAAS,CAAE,QAAS,CAAC,CAAE,2CACYD,EAAA,CAAnCC,EAAS,CAAE,QAAS,GAAG,CAAE,6CAS6BD,EAAA,CAAtDC,EAAS,CAAE,QAAS,KAAM,MAAOC,EAAS,CAAE,iCACUF,EAAA,CAAtDC,EAAS,CAAE,QAAS,KAAM,MAAOC,EAAS,CAAE,8BAsB7CF,EAAA,CAXCM,GAAQ,CACP,KAAM,CACJ,CACE,IAAK,SAAU,KAAM,QAAS,WAAY,CACxC,MAAO,CAAE,KAAM,SAAU,KAAM,EAAG,KAAM,MAAG,EAC3C,UAAW,CAAE,KAAM,SAAU,IAAK,IAAK,IAAK,GAAI,KAAM,EAAG,KAAM,MAAG,EAClE,KAAM,CAAE,KAAM,SAAU,IAAK,GAAK,IAAK,GAAI,KAAM,GAAK,KAAM,MAAG,KAItE,+BAmBDN,EAAA,CADCM,GAAQ,CAAE,KAAM,CAAC,CAAE,IAAK,WAAY,KAAM,SAAU,QAAS,EAAG,IAAK,IAAK,IAAK,GAAI,KAAM,EAAG,KAAM,MAAG,EAAI,CAAE,IAAK,YAAa,KAAM,SAAU,QAAS,EAAG,IAAK,KAAM,IAAK,IAAK,KAAM,EAAG,KAAM,MAAG,EAAI,CAAE,IAAK,UAAW,KAAM,SAAU,QAAS,IAAK,IAAK,KAAM,IAAK,GAAI,KAAM,GAAK,KAAM,MAAG,EAAI,CAAE,IAAK,MAAO,KAAM,SAAU,QAAS,IAAM,IAAK,EAAG,IAAK,EAAG,KAAM,IAAM,MAAO,IAAK,KAAM,GAAG,CAAE,CAAC,CAAE,6BAhIzXvD,EAAKiD,EAAA,CAfjBO,GAAK,CACJ,IAAK,QACL,UAAW,OACX,SAAU,GACV,OAAQ,CACN,SAAU,WACV,gBAAiB,GACjB,iBAAkB,QAClB,kBAAmB,SAErB,KAAM,CACJ,MAAO,IACP,OAAQ,KAEX,GACYxD,CAAK,EA2YlB,SAASyD,GAAaC,EAAcC,EAAU,CAC5C,QAAWA,EAAKD,GAAQ,IAAO,KAAO,IAAO,GAC/C,CAWA,SAASE,GAAMC,EAAY,CACzB,GAAI,OAAOA,GAAU,SAAU,OAAOA,EACtC,GAAM,CAACC,EAAGC,EAAGC,EAAGC,EAAI,CAAC,EAAIJ,EACnBK,EAAQC,GACZ,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGA,CAAO,CAAC,EAAI,GAAG,EACpD,MAAO,QAAQD,EAAKJ,CAAC,CAAC,KAAKI,EAAKH,CAAC,CAAC,KAAKG,EAAKF,CAAC,CAAC,KAAKC,CAAC,GACtD,CKrhBO,IAAMG,GAAQ,CAACC,EAAOC,EAAS",
4
+ "sourcesContent": ["// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423\nexport class Adder {\n constructor() {\n this._partials = new Float64Array(32);\n this._n = 0;\n }\n add(x) {\n const p = this._partials;\n let i = 0;\n for (let j = 0; j < this._n && j < 32; j++) {\n const y = p[j],\n hi = x + y,\n lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x);\n if (lo) p[i++] = lo;\n x = hi;\n }\n p[i] = x;\n this._n = i + 1;\n return this;\n }\n valueOf() {\n const p = this._partials;\n let n = this._n, x, y, lo, hi = 0;\n if (n > 0) {\n hi = p[--n];\n while (n > 0) {\n x = hi;\n y = p[--n];\n hi = x + y;\n lo = y - (hi - x);\n if (lo) break;\n }\n if (n > 0 && ((lo < 0 && p[n - 1] < 0) || (lo > 0 && p[n - 1] > 0))) {\n y = lo * 2;\n x = hi + y;\n if (y == x - hi) hi = x;\n }\n }\n return hi;\n }\n}\n\nexport function fsum(values, valueof) {\n const adder = new Adder();\n if (valueof === undefined) {\n for (let value of values) {\n if (value = +value) {\n adder.add(value);\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if (value = +valueof(value, ++index, values)) {\n adder.add(value);\n }\n }\n }\n return +adder;\n}\n\nexport function fcumsum(values, valueof) {\n const adder = new Adder();\n let index = -1;\n return Float64Array.from(values, valueof === undefined\n ? v => adder.add(+v || 0)\n : v => adder.add(+valueof(v, ++index, values) || 0)\n );\n}\n", "function* flatten(arrays) {\n for (const array of arrays) {\n yield* array;\n }\n}\n\nexport default function merge(arrays) {\n return Array.from(flatten(arrays));\n}\n", "export var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var quarterPi = pi / 4;\nexport var tau = pi * 2;\n\nexport var degrees = 180 / pi;\nexport var radians = pi / 180;\n\nexport var abs = Math.abs;\nexport var atan = Math.atan;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var ceil = Math.ceil;\nexport var exp = Math.exp;\nexport var floor = Math.floor;\nexport var hypot = Math.hypot;\nexport var log = Math.log;\nexport var pow = Math.pow;\nexport var sin = Math.sin;\nexport var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };\nexport var sqrt = Math.sqrt;\nexport var tan = Math.tan;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\n\nexport function haversin(x) {\n return (x = sin(x / 2)) * x;\n}\n", "export default function noop() {}\n", "function streamGeometry(geometry, stream) {\n if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\n streamGeometryType[geometry.type](geometry, stream);\n }\n}\n\nvar streamObjectType = {\n Feature: function(object, stream) {\n streamGeometry(object.geometry, stream);\n },\n FeatureCollection: function(object, stream) {\n var features = object.features, i = -1, n = features.length;\n while (++i < n) streamGeometry(features[i].geometry, stream);\n }\n};\n\nvar streamGeometryType = {\n Sphere: function(object, stream) {\n stream.sphere();\n },\n Point: function(object, stream) {\n object = object.coordinates;\n stream.point(object[0], object[1], object[2]);\n },\n MultiPoint: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);\n },\n LineString: function(object, stream) {\n streamLine(object.coordinates, stream, 0);\n },\n MultiLineString: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) streamLine(coordinates[i], stream, 0);\n },\n Polygon: function(object, stream) {\n streamPolygon(object.coordinates, stream);\n },\n MultiPolygon: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) streamPolygon(coordinates[i], stream);\n },\n GeometryCollection: function(object, stream) {\n var geometries = object.geometries, i = -1, n = geometries.length;\n while (++i < n) streamGeometry(geometries[i], stream);\n }\n};\n\nfunction streamLine(coordinates, stream, closed) {\n var i = -1, n = coordinates.length - closed, coordinate;\n stream.lineStart();\n while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);\n stream.lineEnd();\n}\n\nfunction streamPolygon(coordinates, stream) {\n var i = -1, n = coordinates.length;\n stream.polygonStart();\n while (++i < n) streamLine(coordinates[i], stream, 1);\n stream.polygonEnd();\n}\n\nexport default function(object, stream) {\n if (object && streamObjectType.hasOwnProperty(object.type)) {\n streamObjectType[object.type](object, stream);\n } else {\n streamGeometry(object, stream);\n }\n}\n", "import {Adder} from \"d3-array\";\nimport {atan2, cos, quarterPi, radians, sin, tau} from \"./math.js\";\nimport noop from \"./noop.js\";\nimport stream from \"./stream.js\";\n\nexport var areaRingSum = new Adder();\n\n// hello?\n\nvar areaSum = new Adder(),\n lambda00,\n phi00,\n lambda0,\n cosPhi0,\n sinPhi0;\n\nexport var areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaRingSum = new Adder();\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n var areaRing = +areaRingSum;\n areaSum.add(areaRing < 0 ? tau + areaRing : areaRing);\n this.lineStart = this.lineEnd = this.point = noop;\n },\n sphere: function() {\n areaSum.add(tau);\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaRingEnd() {\n areaPoint(lambda00, phi00);\n}\n\nfunction areaPointFirst(lambda, phi) {\n areaStream.point = areaPoint;\n lambda00 = lambda, phi00 = phi;\n lambda *= radians, phi *= radians;\n lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi);\n}\n\nfunction areaPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n phi = phi / 2 + quarterPi; // half the angular distance from south pole\n\n // Spherical excess E for a spherical triangle with vertices: south pole,\n // previous point, current point. Uses a formula derived from Cagnoli\u2019s\n // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).\n var dLambda = lambda - lambda0,\n sdLambda = dLambda >= 0 ? 1 : -1,\n adLambda = sdLambda * dLambda,\n cosPhi = cos(phi),\n sinPhi = sin(phi),\n k = sinPhi0 * sinPhi,\n u = cosPhi0 * cosPhi + k * cos(adLambda),\n v = k * sdLambda * sin(adLambda);\n areaRingSum.add(atan2(v, u));\n\n // Advance the previous points.\n lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n}\n\nexport default function(object) {\n areaSum = new Adder();\n stream(object, areaStream);\n return areaSum * 2;\n}\n", "import {asin, atan2, cos, sin, sqrt} from \"./math.js\";\n\nexport function spherical(cartesian) {\n return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];\n}\n\nexport function cartesian(spherical) {\n var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi);\n return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];\n}\n\nexport function cartesianDot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nexport function cartesianCross(a, b) {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n// TODO return a\nexport function cartesianAddInPlace(a, b) {\n a[0] += b[0], a[1] += b[1], a[2] += b[2];\n}\n\nexport function cartesianScale(vector, k) {\n return [vector[0] * k, vector[1] * k, vector[2] * k];\n}\n\n// TODO return d\nexport function cartesianNormalizeInPlace(d) {\n var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n d[0] /= l, d[1] /= l, d[2] /= l;\n}\n", "import {Adder} from \"d3-array\";\nimport {areaStream, areaRingSum} from \"./area.js\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace, spherical} from \"./cartesian.js\";\nimport {abs, degrees, epsilon, radians} from \"./math.js\";\nimport stream from \"./stream.js\";\n\nvar lambda0, phi0, lambda1, phi1, // bounds\n lambda2, // previous lambda-coordinate\n lambda00, phi00, // first point\n p0, // previous 3D point\n deltaSum,\n ranges,\n range;\n\nvar boundsStream = {\n point: boundsPoint,\n lineStart: boundsLineStart,\n lineEnd: boundsLineEnd,\n polygonStart: function() {\n boundsStream.point = boundsRingPoint;\n boundsStream.lineStart = boundsRingStart;\n boundsStream.lineEnd = boundsRingEnd;\n deltaSum = new Adder();\n areaStream.polygonStart();\n },\n polygonEnd: function() {\n areaStream.polygonEnd();\n boundsStream.point = boundsPoint;\n boundsStream.lineStart = boundsLineStart;\n boundsStream.lineEnd = boundsLineEnd;\n if (areaRingSum < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n else if (deltaSum > epsilon) phi1 = 90;\n else if (deltaSum < -epsilon) phi0 = -90;\n range[0] = lambda0, range[1] = lambda1;\n },\n sphere: function() {\n lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n }\n};\n\nfunction boundsPoint(lambda, phi) {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n}\n\nfunction linePoint(lambda, phi) {\n var p = cartesian([lambda * radians, phi * radians]);\n if (p0) {\n var normal = cartesianCross(p0, p),\n equatorial = [normal[1], -normal[0], 0],\n inflection = cartesianCross(equatorial, normal);\n cartesianNormalizeInPlace(inflection);\n inflection = spherical(inflection);\n var delta = lambda - lambda2,\n sign = delta > 0 ? 1 : -1,\n lambdai = inflection[0] * degrees * sign,\n phii,\n antimeridian = abs(delta) > 180;\n if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = inflection[1] * degrees;\n if (phii > phi1) phi1 = phii;\n } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = -inflection[1] * degrees;\n if (phii < phi0) phi0 = phii;\n } else {\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n }\n if (antimeridian) {\n if (lambda < lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n } else {\n if (lambda1 >= lambda0) {\n if (lambda < lambda0) lambda0 = lambda;\n if (lambda > lambda1) lambda1 = lambda;\n } else {\n if (lambda > lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n }\n }\n } else {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n }\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n p0 = p, lambda2 = lambda;\n}\n\nfunction boundsLineStart() {\n boundsStream.point = linePoint;\n}\n\nfunction boundsLineEnd() {\n range[0] = lambda0, range[1] = lambda1;\n boundsStream.point = boundsPoint;\n p0 = null;\n}\n\nfunction boundsRingPoint(lambda, phi) {\n if (p0) {\n var delta = lambda - lambda2;\n deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n } else {\n lambda00 = lambda, phi00 = phi;\n }\n areaStream.point(lambda, phi);\n linePoint(lambda, phi);\n}\n\nfunction boundsRingStart() {\n areaStream.lineStart();\n}\n\nfunction boundsRingEnd() {\n boundsRingPoint(lambda00, phi00);\n areaStream.lineEnd();\n if (abs(deltaSum) > epsilon) lambda0 = -(lambda1 = 180);\n range[0] = lambda0, range[1] = lambda1;\n p0 = null;\n}\n\n// Finds the left-right distance between two longitudes.\n// This is almost the same as (lambda1 - lambda0 + 360\u00B0) % 360\u00B0, except that we want\n// the distance between \u00B1180\u00B0 to be 360\u00B0.\nfunction angle(lambda0, lambda1) {\n return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;\n}\n\nfunction rangeCompare(a, b) {\n return a[0] - b[0];\n}\n\nfunction rangeContains(range, x) {\n return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n}\n\nexport default function(feature) {\n var i, n, a, b, merged, deltaMax, delta;\n\n phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n ranges = [];\n stream(feature, boundsStream);\n\n // First, sort ranges by their minimum longitudes.\n if (n = ranges.length) {\n ranges.sort(rangeCompare);\n\n // Then, merge any ranges that overlap.\n for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {\n b = ranges[i];\n if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {\n if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n } else {\n merged.push(a = b);\n }\n }\n\n // Finally, find the largest gap between the merged ranges.\n // The final bounding box will be the inverse of this gap.\n for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {\n b = merged[i];\n if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0 = b[0], lambda1 = a[1];\n }\n }\n\n ranges = range = null;\n\n return lambda0 === Infinity || phi0 === Infinity\n ? [[NaN, NaN], [NaN, NaN]]\n : [[lambda0, phi0], [lambda1, phi1]];\n}\n", "export default function(a, b) {\n\n function compose(x, y) {\n return x = a(x, y), b(x[0], x[1]);\n }\n\n if (a.invert && b.invert) compose.invert = function(x, y) {\n return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n };\n\n return compose;\n}\n", "import compose from \"./compose.js\";\nimport {abs, asin, atan2, cos, degrees, pi, radians, sin, tau} from \"./math.js\";\n\nfunction rotationIdentity(lambda, phi) {\n if (abs(lambda) > pi) lambda -= Math.round(lambda / tau) * tau;\n return [lambda, phi];\n}\n\nrotationIdentity.invert = rotationIdentity;\n\nexport function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))\n : rotationLambda(deltaLambda))\n : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)\n : rotationIdentity);\n}\n\nfunction forwardRotationLambda(deltaLambda) {\n return function(lambda, phi) {\n lambda += deltaLambda;\n if (abs(lambda) > pi) lambda -= Math.round(lambda / tau) * tau;\n return [lambda, phi];\n };\n}\n\nfunction rotationLambda(deltaLambda) {\n var rotation = forwardRotationLambda(deltaLambda);\n rotation.invert = forwardRotationLambda(-deltaLambda);\n return rotation;\n}\n\nfunction rotationPhiGamma(deltaPhi, deltaGamma) {\n var cosDeltaPhi = cos(deltaPhi),\n sinDeltaPhi = sin(deltaPhi),\n cosDeltaGamma = cos(deltaGamma),\n sinDeltaGamma = sin(deltaGamma);\n\n function rotation(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaPhi + x * sinDeltaPhi;\n return [\n atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),\n asin(k * cosDeltaGamma + y * sinDeltaGamma)\n ];\n }\n\n rotation.invert = function(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaGamma - y * sinDeltaGamma;\n return [\n atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),\n asin(k * cosDeltaPhi - x * sinDeltaPhi)\n ];\n };\n\n return rotation;\n}\n\nexport default function(rotate) {\n rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);\n\n function forward(coordinates) {\n coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n }\n\n forward.invert = function(coordinates) {\n coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n };\n\n return forward;\n}\n", "import {cartesian, cartesianNormalizeInPlace, spherical} from \"./cartesian.js\";\nimport constant from \"./constant.js\";\nimport {acos, cos, degrees, epsilon, radians, sin, tau} from \"./math.js\";\nimport {rotateRadians} from \"./rotation.js\";\n\n// Generates a circle centered at [0\u00B0, 0\u00B0], with a given radius and precision.\nexport function circleStream(stream, radius, delta, direction, t0, t1) {\n if (!delta) return;\n var cosRadius = cos(radius),\n sinRadius = sin(radius),\n step = direction * delta;\n if (t0 == null) {\n t0 = radius + direction * tau;\n t1 = radius - step / 2;\n } else {\n t0 = circleRadius(cosRadius, t0);\n t1 = circleRadius(cosRadius, t1);\n if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau;\n }\n for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {\n point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);\n stream.point(point[0], point[1]);\n }\n}\n\n// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].\nfunction circleRadius(cosRadius, point) {\n point = cartesian(point), point[0] -= cosRadius;\n cartesianNormalizeInPlace(point);\n var radius = acos(-point[1]);\n return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau;\n}\n\nexport default function() {\n var center = constant([0, 0]),\n radius = constant(90),\n precision = constant(2),\n ring,\n rotate,\n stream = {point: point};\n\n function point(x, y) {\n ring.push(x = rotate(x, y));\n x[0] *= degrees, x[1] *= degrees;\n }\n\n function circle() {\n var c = center.apply(this, arguments),\n r = radius.apply(this, arguments) * radians,\n p = precision.apply(this, arguments) * radians;\n ring = [];\n rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;\n circleStream(stream, r, p, 1);\n c = {type: \"Polygon\", coordinates: [ring]};\n ring = rotate = null;\n return c;\n }\n\n circle.center = function(_) {\n return arguments.length ? (center = typeof _ === \"function\" ? _ : constant([+_[0], +_[1]]), circle) : center;\n };\n\n circle.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), circle) : radius;\n };\n\n circle.precision = function(_) {\n return arguments.length ? (precision = typeof _ === \"function\" ? _ : constant(+_), circle) : precision;\n };\n\n return circle;\n}\n", "import noop from \"../noop.js\";\n\nexport default function() {\n var lines = [],\n line;\n return {\n point: function(x, y, m) {\n line.push([x, y, m]);\n },\n lineStart: function() {\n lines.push(line = []);\n },\n lineEnd: noop,\n rejoin: function() {\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n },\n result: function() {\n var result = lines;\n lines = [];\n line = null;\n return result;\n }\n };\n}\n", "import {abs, epsilon} from \"./math.js\";\n\nexport default function(a, b) {\n return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon;\n}\n", "import pointEqual from \"../pointEqual.js\";\nimport {epsilon} from \"../math.js\";\n\nfunction Intersection(point, points, other, entry) {\n this.x = point;\n this.z = points;\n this.o = other; // another intersection\n this.e = entry; // is an entry?\n this.v = false; // visited\n this.n = this.p = null; // next & previous\n}\n\n// A generalized polygon clipping algorithm: given a polygon that has been cut\n// into its visible line segments, and rejoins the segments by interpolating\n// along the clip edge.\nexport default function(segments, compareIntersection, startInside, interpolate, stream) {\n var subject = [],\n clip = [],\n i,\n n;\n\n segments.forEach(function(segment) {\n if ((n = segment.length - 1) <= 0) return;\n var n, p0 = segment[0], p1 = segment[n], x;\n\n if (pointEqual(p0, p1)) {\n if (!p0[2] && !p1[2]) {\n stream.lineStart();\n for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);\n stream.lineEnd();\n return;\n }\n // handle degenerate cases by moving the point\n p1[0] += 2 * epsilon;\n }\n\n subject.push(x = new Intersection(p0, segment, null, true));\n clip.push(x.o = new Intersection(p0, null, x, false));\n subject.push(x = new Intersection(p1, segment, null, false));\n clip.push(x.o = new Intersection(p1, null, x, true));\n });\n\n if (!subject.length) return;\n\n clip.sort(compareIntersection);\n link(subject);\n link(clip);\n\n for (i = 0, n = clip.length; i < n; ++i) {\n clip[i].e = startInside = !startInside;\n }\n\n var start = subject[0],\n points,\n point;\n\n while (1) {\n // Find first unvisited intersection.\n var current = start,\n isSubject = true;\n while (current.v) if ((current = current.n) === start) return;\n points = current.z;\n stream.lineStart();\n do {\n current.v = current.o.v = true;\n if (current.e) {\n if (isSubject) {\n for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.n.x, 1, stream);\n }\n current = current.n;\n } else {\n if (isSubject) {\n points = current.p.z;\n for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.p.x, -1, stream);\n }\n current = current.p;\n }\n current = current.o;\n points = current.z;\n isSubject = !isSubject;\n } while (!current.v);\n stream.lineEnd();\n }\n}\n\nfunction link(array) {\n if (!(n = array.length)) return;\n var n,\n i = 0,\n a = array[0],\n b;\n while (++i < n) {\n a.n = b = array[i];\n b.p = a;\n a = b;\n }\n a.n = b = array[0];\n b.p = a;\n}\n", "import {Adder} from \"d3-array\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace} from \"./cartesian.js\";\nimport {abs, asin, atan2, cos, epsilon, epsilon2, halfPi, pi, quarterPi, sign, sin, tau} from \"./math.js\";\n\nfunction longitude(point) {\n return abs(point[0]) <= pi ? point[0] : sign(point[0]) * ((abs(point[0]) + pi) % tau - pi);\n}\n\nexport default function(polygon, point) {\n var lambda = longitude(point),\n phi = point[1],\n sinPhi = sin(phi),\n normal = [sin(lambda), -cos(lambda), 0],\n angle = 0,\n winding = 0;\n\n var sum = new Adder();\n\n if (sinPhi === 1) phi = halfPi + epsilon;\n else if (sinPhi === -1) phi = -halfPi - epsilon;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n if (!(m = (ring = polygon[i]).length)) continue;\n var ring,\n m,\n point0 = ring[m - 1],\n lambda0 = longitude(point0),\n phi0 = point0[1] / 2 + quarterPi,\n sinPhi0 = sin(phi0),\n cosPhi0 = cos(phi0);\n\n for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {\n var point1 = ring[j],\n lambda1 = longitude(point1),\n phi1 = point1[1] / 2 + quarterPi,\n sinPhi1 = sin(phi1),\n cosPhi1 = cos(phi1),\n delta = lambda1 - lambda0,\n sign = delta >= 0 ? 1 : -1,\n absDelta = sign * delta,\n antimeridian = absDelta > pi,\n k = sinPhi0 * sinPhi1;\n\n sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta)));\n angle += antimeridian ? delta + sign * tau : delta;\n\n // Are the longitudes either side of the point\u2019s meridian (lambda),\n // and are the latitudes smaller than the parallel (phi)?\n if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {\n var arc = cartesianCross(cartesian(point0), cartesian(point1));\n cartesianNormalizeInPlace(arc);\n var intersection = cartesianCross(normal, arc);\n cartesianNormalizeInPlace(intersection);\n var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);\n if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {\n winding += antimeridian ^ delta >= 0 ? 1 : -1;\n }\n }\n }\n }\n\n // First, determine whether the South pole is inside or outside:\n //\n // It is inside if:\n // * the polygon winds around it in a clockwise direction.\n // * the polygon does not (cumulatively) wind around it, but has a negative\n // (counter-clockwise) area.\n //\n // Second, count the (signed) number of times a segment crosses a lambda\n // from the point to the South pole. If it is zero, then the point is the\n // same side as the South pole.\n\n return (angle < -epsilon || angle < epsilon && sum < -epsilon2) ^ (winding & 1);\n}\n", "import clipBuffer from \"./buffer.js\";\nimport clipRejoin from \"./rejoin.js\";\nimport {epsilon, halfPi} from \"../math.js\";\nimport polygonContains from \"../polygonContains.js\";\nimport {merge} from \"d3-array\";\n\nexport default function(pointVisible, clipLine, interpolate, start) {\n return function(sink) {\n var line = clipLine(sink),\n ringBuffer = clipBuffer(),\n ringSink = clipLine(ringBuffer),\n polygonStarted = false,\n polygon,\n segments,\n ring;\n\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n clip.point = pointRing;\n clip.lineStart = ringStart;\n clip.lineEnd = ringEnd;\n segments = [];\n polygon = [];\n },\n polygonEnd: function() {\n clip.point = point;\n clip.lineStart = lineStart;\n clip.lineEnd = lineEnd;\n segments = merge(segments);\n var startInside = polygonContains(polygon, start);\n if (segments.length) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n clipRejoin(segments, compareIntersection, startInside, interpolate, sink);\n } else if (startInside) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n }\n if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n segments = polygon = null;\n },\n sphere: function() {\n sink.polygonStart();\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n sink.polygonEnd();\n }\n };\n\n function point(lambda, phi) {\n if (pointVisible(lambda, phi)) sink.point(lambda, phi);\n }\n\n function pointLine(lambda, phi) {\n line.point(lambda, phi);\n }\n\n function lineStart() {\n clip.point = pointLine;\n line.lineStart();\n }\n\n function lineEnd() {\n clip.point = point;\n line.lineEnd();\n }\n\n function pointRing(lambda, phi) {\n ring.push([lambda, phi]);\n ringSink.point(lambda, phi);\n }\n\n function ringStart() {\n ringSink.lineStart();\n ring = [];\n }\n\n function ringEnd() {\n pointRing(ring[0][0], ring[0][1]);\n ringSink.lineEnd();\n\n var clean = ringSink.clean(),\n ringSegments = ringBuffer.result(),\n i, n = ringSegments.length, m,\n segment,\n point;\n\n ring.pop();\n polygon.push(ring);\n ring = null;\n\n if (!n) return;\n\n // No intersections.\n if (clean & 1) {\n segment = ringSegments[0];\n if ((m = segment.length - 1) > 0) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);\n sink.lineEnd();\n }\n return;\n }\n\n // Rejoin connected segments.\n // TODO reuse ringBuffer.rejoin()?\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n\n segments.push(ringSegments.filter(validSegment));\n }\n\n return clip;\n };\n}\n\nfunction validSegment(segment) {\n return segment.length > 1;\n}\n\n// Intersections are sorted along the clip edge. For both antimeridian cutting\n// and circle clipping, the same comparison is used.\nfunction compareIntersection(a, b) {\n return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1])\n - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]);\n}\n", "import clip from \"./index.js\";\nimport {abs, atan, cos, epsilon, halfPi, pi, sin} from \"../math.js\";\n\nexport default clip(\n function() { return true; },\n clipAntimeridianLine,\n clipAntimeridianInterpolate,\n [-pi, -halfPi]\n);\n\n// Takes a line and cuts into visible segments. Return values: 0 - there were\n// intersections or the line was empty; 1 - no intersections; 2 - there were\n// intersections, and the first and last segments should be rejoined.\nfunction clipAntimeridianLine(stream) {\n var lambda0 = NaN,\n phi0 = NaN,\n sign0 = NaN,\n clean; // no intersections\n\n return {\n lineStart: function() {\n stream.lineStart();\n clean = 1;\n },\n point: function(lambda1, phi1) {\n var sign1 = lambda1 > 0 ? pi : -pi,\n delta = abs(lambda1 - lambda0);\n if (abs(delta - pi) < epsilon) { // line crosses a pole\n stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n stream.point(lambda1, phi0);\n clean = 0;\n } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian\n if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies\n if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon;\n phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n clean = 0;\n }\n stream.point(lambda0 = lambda1, phi0 = phi1);\n sign0 = sign1;\n },\n lineEnd: function() {\n stream.lineEnd();\n lambda0 = phi0 = NaN;\n },\n clean: function() {\n return 2 - clean; // if intersections, rejoin first and last segments\n }\n };\n}\n\nfunction clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {\n var cosPhi0,\n cosPhi1,\n sinLambda0Lambda1 = sin(lambda0 - lambda1);\n return abs(sinLambda0Lambda1) > epsilon\n ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1)\n - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0))\n / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))\n : (phi0 + phi1) / 2;\n}\n\nfunction clipAntimeridianInterpolate(from, to, direction, stream) {\n var phi;\n if (from == null) {\n phi = direction * halfPi;\n stream.point(-pi, phi);\n stream.point(0, phi);\n stream.point(pi, phi);\n stream.point(pi, 0);\n stream.point(pi, -phi);\n stream.point(0, -phi);\n stream.point(-pi, -phi);\n stream.point(-pi, 0);\n stream.point(-pi, phi);\n } else if (abs(from[0] - to[0]) > epsilon) {\n var lambda = from[0] < to[0] ? pi : -pi;\n phi = direction * lambda / 2;\n stream.point(-lambda, phi);\n stream.point(0, phi);\n stream.point(lambda, phi);\n } else {\n stream.point(to[0], to[1]);\n }\n}\n", "import {cartesian, cartesianAddInPlace, cartesianCross, cartesianDot, cartesianScale, spherical} from \"../cartesian.js\";\nimport {circleStream} from \"../circle.js\";\nimport {abs, cos, epsilon, pi, radians, sqrt} from \"../math.js\";\nimport pointEqual from \"../pointEqual.js\";\nimport clip from \"./index.js\";\n\nexport default function(radius) {\n var cr = cos(radius),\n delta = 2 * radians,\n smallRadius = cr > 0,\n notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case\n\n function interpolate(from, to, direction, stream) {\n circleStream(stream, radius, delta, direction, from, to);\n }\n\n function visible(lambda, phi) {\n return cos(lambda) * cos(phi) > cr;\n }\n\n // Takes a line and cuts into visible segments. Return values used for polygon\n // clipping: 0 - there were intersections or the line was empty; 1 - no\n // intersections 2 - there were intersections, and the first and last segments\n // should be rejoined.\n function clipLine(stream) {\n var point0, // previous point\n c0, // code for previous point\n v0, // visibility of previous point\n v00, // visibility of first point\n clean; // no intersections\n return {\n lineStart: function() {\n v00 = v0 = false;\n clean = 1;\n },\n point: function(lambda, phi) {\n var point1 = [lambda, phi],\n point2,\n v = visible(lambda, phi),\n c = smallRadius\n ? v ? 0 : code(lambda, phi)\n : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0;\n if (!point0 && (v00 = v0 = v)) stream.lineStart();\n if (v !== v0) {\n point2 = intersect(point0, point1);\n if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2))\n point1[2] = 1;\n }\n if (v !== v0) {\n clean = 0;\n if (v) {\n // outside going in\n stream.lineStart();\n point2 = intersect(point1, point0);\n stream.point(point2[0], point2[1]);\n } else {\n // inside going out\n point2 = intersect(point0, point1);\n stream.point(point2[0], point2[1], 2);\n stream.lineEnd();\n }\n point0 = point2;\n } else if (notHemisphere && point0 && smallRadius ^ v) {\n var t;\n // If the codes for two points are different, or are both zero,\n // and there this segment intersects with the small circle.\n if (!(c & c0) && (t = intersect(point1, point0, true))) {\n clean = 0;\n if (smallRadius) {\n stream.lineStart();\n stream.point(t[0][0], t[0][1]);\n stream.point(t[1][0], t[1][1]);\n stream.lineEnd();\n } else {\n stream.point(t[1][0], t[1][1]);\n stream.lineEnd();\n stream.lineStart();\n stream.point(t[0][0], t[0][1], 3);\n }\n }\n }\n if (v && (!point0 || !pointEqual(point0, point1))) {\n stream.point(point1[0], point1[1]);\n }\n point0 = point1, v0 = v, c0 = c;\n },\n lineEnd: function() {\n if (v0) stream.lineEnd();\n point0 = null;\n },\n // Rejoin first and last segments if there were intersections and the first\n // and last points were visible.\n clean: function() {\n return clean | ((v00 && v0) << 1);\n }\n };\n }\n\n // Intersects the great circle between a and b with the clip circle.\n function intersect(a, b, two) {\n var pa = cartesian(a),\n pb = cartesian(b);\n\n // We have two planes, n1.p = d1 and n2.p = d2.\n // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 \u2A2F n2).\n var n1 = [1, 0, 0], // normal\n n2 = cartesianCross(pa, pb),\n n2n2 = cartesianDot(n2, n2),\n n1n2 = n2[0], // cartesianDot(n1, n2),\n determinant = n2n2 - n1n2 * n1n2;\n\n // Two polar points.\n if (!determinant) return !two && a;\n\n var c1 = cr * n2n2 / determinant,\n c2 = -cr * n1n2 / determinant,\n n1xn2 = cartesianCross(n1, n2),\n A = cartesianScale(n1, c1),\n B = cartesianScale(n2, c2);\n cartesianAddInPlace(A, B);\n\n // Solve |p(t)|^2 = 1.\n var u = n1xn2,\n w = cartesianDot(A, u),\n uu = cartesianDot(u, u),\n t2 = w * w - uu * (cartesianDot(A, A) - 1);\n\n if (t2 < 0) return;\n\n var t = sqrt(t2),\n q = cartesianScale(u, (-w - t) / uu);\n cartesianAddInPlace(q, A);\n q = spherical(q);\n\n if (!two) return q;\n\n // Two intersection points.\n var lambda0 = a[0],\n lambda1 = b[0],\n phi0 = a[1],\n phi1 = b[1],\n z;\n\n if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;\n\n var delta = lambda1 - lambda0,\n polar = abs(delta - pi) < epsilon,\n meridian = polar || delta < epsilon;\n\n if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;\n\n // Check that the first point is between a and b.\n if (meridian\n ? polar\n ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1)\n : phi0 <= q[1] && q[1] <= phi1\n : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) {\n var q1 = cartesianScale(u, (-w + t) / uu);\n cartesianAddInPlace(q1, A);\n return [q, spherical(q1)];\n }\n }\n\n // Generates a 4-bit vector representing the location of a point relative to\n // the small circle's bounding box.\n function code(lambda, phi) {\n var r = smallRadius ? radius : pi - radius,\n code = 0;\n if (lambda < -r) code |= 1; // left\n else if (lambda > r) code |= 2; // right\n if (phi < -r) code |= 4; // below\n else if (phi > r) code |= 8; // above\n return code;\n }\n\n return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]);\n}\n", "export default function(a, b, x0, y0, x1, y1) {\n var ax = a[0],\n ay = a[1],\n bx = b[0],\n by = b[1],\n t0 = 0,\n t1 = 1,\n dx = bx - ax,\n dy = by - ay,\n r;\n\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;\n if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;\n return true;\n}\n", "import {abs, epsilon} from \"../math.js\";\nimport clipBuffer from \"./buffer.js\";\nimport clipLine from \"./line.js\";\nimport clipRejoin from \"./rejoin.js\";\nimport {merge} from \"d3-array\";\n\nvar clipMax = 1e9, clipMin = -clipMax;\n\n// TODO Use d3-polygon\u2019s polygonContains here for the ring check?\n// TODO Eliminate duplicate buffering in clipBuffer and polygon.push?\n\nexport default function clipRectangle(x0, y0, x1, y1) {\n\n function visible(x, y) {\n return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n }\n\n function interpolate(from, to, direction, stream) {\n var a = 0, a1 = 0;\n if (from == null\n || (a = corner(from, direction)) !== (a1 = corner(to, direction))\n || comparePoint(from, to) < 0 ^ direction > 0) {\n do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n while ((a = (a + direction + 4) % 4) !== a1);\n } else {\n stream.point(to[0], to[1]);\n }\n }\n\n function corner(p, direction) {\n return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3\n : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1\n : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0\n : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon\n }\n\n function compareIntersection(a, b) {\n return comparePoint(a.x, b.x);\n }\n\n function comparePoint(a, b) {\n var ca = corner(a, 1),\n cb = corner(b, 1);\n return ca !== cb ? ca - cb\n : ca === 0 ? b[1] - a[1]\n : ca === 1 ? a[0] - b[0]\n : ca === 2 ? a[1] - b[1]\n : b[0] - a[0];\n }\n\n return function(stream) {\n var activeStream = stream,\n bufferStream = clipBuffer(),\n segments,\n polygon,\n ring,\n x__, y__, v__, // first point\n x_, y_, v_, // previous point\n first,\n clean;\n\n var clipStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: polygonStart,\n polygonEnd: polygonEnd\n };\n\n function point(x, y) {\n if (visible(x, y)) activeStream.point(x, y);\n }\n\n function polygonInside() {\n var winding = 0;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {\n a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];\n if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }\n else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }\n }\n }\n\n return winding;\n }\n\n // Buffer geometry within a polygon and then clip it en masse.\n function polygonStart() {\n activeStream = bufferStream, segments = [], polygon = [], clean = true;\n }\n\n function polygonEnd() {\n var startInside = polygonInside(),\n cleanInside = clean && startInside,\n visible = (segments = merge(segments)).length;\n if (cleanInside || visible) {\n stream.polygonStart();\n if (cleanInside) {\n stream.lineStart();\n interpolate(null, null, 1, stream);\n stream.lineEnd();\n }\n if (visible) {\n clipRejoin(segments, compareIntersection, startInside, interpolate, stream);\n }\n stream.polygonEnd();\n }\n activeStream = stream, segments = polygon = ring = null;\n }\n\n function lineStart() {\n clipStream.point = linePoint;\n if (polygon) polygon.push(ring = []);\n first = true;\n v_ = false;\n x_ = y_ = NaN;\n }\n\n // TODO rather than special-case polygons, simply handle them separately.\n // Ideally, coincident intersection points should be jittered to avoid\n // clipping issues.\n function lineEnd() {\n if (segments) {\n linePoint(x__, y__);\n if (v__ && v_) bufferStream.rejoin();\n segments.push(bufferStream.result());\n }\n clipStream.point = point;\n if (v_) activeStream.lineEnd();\n }\n\n function linePoint(x, y) {\n var v = visible(x, y);\n if (polygon) ring.push([x, y]);\n if (first) {\n x__ = x, y__ = y, v__ = v;\n first = false;\n if (v) {\n activeStream.lineStart();\n activeStream.point(x, y);\n }\n } else {\n if (v && v_) activeStream.point(x, y);\n else {\n var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],\n b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];\n if (clipLine(a, b, x0, y0, x1, y1)) {\n if (!v_) {\n activeStream.lineStart();\n activeStream.point(a[0], a[1]);\n }\n activeStream.point(b[0], b[1]);\n if (!v) activeStream.lineEnd();\n clean = false;\n } else if (v) {\n activeStream.lineStart();\n activeStream.point(x, y);\n clean = false;\n }\n }\n }\n x_ = x, y_ = y, v_ = v;\n }\n\n return clipStream;\n };\n}\n", "export default x => x;\n", "import {Adder} from \"d3-array\";\nimport {abs} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar areaSum = new Adder(),\n areaRingSum = new Adder(),\n x00,\n y00,\n x0,\n y0;\n\nvar areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop;\n areaSum.add(abs(areaRingSum));\n areaRingSum = new Adder();\n },\n result: function() {\n var area = areaSum / 2;\n areaSum = new Adder();\n return area;\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaPointFirst(x, y) {\n areaStream.point = areaPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction areaPoint(x, y) {\n areaRingSum.add(y0 * x - x0 * y);\n x0 = x, y0 = y;\n}\n\nfunction areaRingEnd() {\n areaPoint(x00, y00);\n}\n\nexport default areaStream;\n", "import noop from \"../noop.js\";\n\nvar x0 = Infinity,\n y0 = x0,\n x1 = -x0,\n y1 = x1;\n\nvar boundsStream = {\n point: boundsPoint,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: noop,\n polygonEnd: noop,\n result: function() {\n var bounds = [[x0, y0], [x1, y1]];\n x1 = y1 = -(y0 = x0 = Infinity);\n return bounds;\n }\n};\n\nfunction boundsPoint(x, y) {\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n}\n\nexport default boundsStream;\n", "import {sqrt} from \"../math.js\";\n\n// TODO Enforce positive area for exterior, negative area for interior?\n\nvar X0 = 0,\n Y0 = 0,\n Z0 = 0,\n X1 = 0,\n Y1 = 0,\n Z1 = 0,\n X2 = 0,\n Y2 = 0,\n Z2 = 0,\n x00,\n y00,\n x0,\n y0;\n\nvar centroidStream = {\n point: centroidPoint,\n lineStart: centroidLineStart,\n lineEnd: centroidLineEnd,\n polygonStart: function() {\n centroidStream.lineStart = centroidRingStart;\n centroidStream.lineEnd = centroidRingEnd;\n },\n polygonEnd: function() {\n centroidStream.point = centroidPoint;\n centroidStream.lineStart = centroidLineStart;\n centroidStream.lineEnd = centroidLineEnd;\n },\n result: function() {\n var centroid = Z2 ? [X2 / Z2, Y2 / Z2]\n : Z1 ? [X1 / Z1, Y1 / Z1]\n : Z0 ? [X0 / Z0, Y0 / Z0]\n : [NaN, NaN];\n X0 = Y0 = Z0 =\n X1 = Y1 = Z1 =\n X2 = Y2 = Z2 = 0;\n return centroid;\n }\n};\n\nfunction centroidPoint(x, y) {\n X0 += x;\n Y0 += y;\n ++Z0;\n}\n\nfunction centroidLineStart() {\n centroidStream.point = centroidPointFirstLine;\n}\n\nfunction centroidPointFirstLine(x, y) {\n centroidStream.point = centroidPointLine;\n centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidPointLine(x, y) {\n var dx = x - x0, dy = y - y0, z = sqrt(dx * dx + dy * dy);\n X1 += z * (x0 + x) / 2;\n Y1 += z * (y0 + y) / 2;\n Z1 += z;\n centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidLineEnd() {\n centroidStream.point = centroidPoint;\n}\n\nfunction centroidRingStart() {\n centroidStream.point = centroidPointFirstRing;\n}\n\nfunction centroidRingEnd() {\n centroidPointRing(x00, y00);\n}\n\nfunction centroidPointFirstRing(x, y) {\n centroidStream.point = centroidPointRing;\n centroidPoint(x00 = x0 = x, y00 = y0 = y);\n}\n\nfunction centroidPointRing(x, y) {\n var dx = x - x0,\n dy = y - y0,\n z = sqrt(dx * dx + dy * dy);\n\n X1 += z * (x0 + x) / 2;\n Y1 += z * (y0 + y) / 2;\n Z1 += z;\n\n z = y0 * x - x0 * y;\n X2 += z * (x0 + x);\n Y2 += z * (y0 + y);\n Z2 += z * 3;\n centroidPoint(x0 = x, y0 = y);\n}\n\nexport default centroidStream;\n", "import {tau} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nexport default function PathContext(context) {\n this._context = context;\n}\n\nPathContext.prototype = {\n _radius: 4.5,\n pointRadius: function(_) {\n return this._radius = _, this;\n },\n polygonStart: function() {\n this._line = 0;\n },\n polygonEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line === 0) this._context.closePath();\n this._point = NaN;\n },\n point: function(x, y) {\n switch (this._point) {\n case 0: {\n this._context.moveTo(x, y);\n this._point = 1;\n break;\n }\n case 1: {\n this._context.lineTo(x, y);\n break;\n }\n default: {\n this._context.moveTo(x + this._radius, y);\n this._context.arc(x, y, this._radius, 0, tau);\n break;\n }\n }\n },\n result: noop\n};\n", "import {Adder} from \"d3-array\";\nimport {sqrt} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar lengthSum = new Adder(),\n lengthRing,\n x00,\n y00,\n x0,\n y0;\n\nvar lengthStream = {\n point: noop,\n lineStart: function() {\n lengthStream.point = lengthPointFirst;\n },\n lineEnd: function() {\n if (lengthRing) lengthPoint(x00, y00);\n lengthStream.point = noop;\n },\n polygonStart: function() {\n lengthRing = true;\n },\n polygonEnd: function() {\n lengthRing = null;\n },\n result: function() {\n var length = +lengthSum;\n lengthSum = new Adder();\n return length;\n }\n};\n\nfunction lengthPointFirst(x, y) {\n lengthStream.point = lengthPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction lengthPoint(x, y) {\n x0 -= x, y0 -= y;\n lengthSum.add(sqrt(x0 * x0 + y0 * y0));\n x0 = x, y0 = y;\n}\n\nexport default lengthStream;\n", "// Simple caching for constant-radius points.\nlet cacheDigits, cacheAppend, cacheRadius, cacheCircle;\n\nexport default class PathString {\n constructor(digits) {\n this._append = digits == null ? append : appendRound(digits);\n this._radius = 4.5;\n this._ = \"\";\n }\n pointRadius(_) {\n this._radius = +_;\n return this;\n }\n polygonStart() {\n this._line = 0;\n }\n polygonEnd() {\n this._line = NaN;\n }\n lineStart() {\n this._point = 0;\n }\n lineEnd() {\n if (this._line === 0) this._ += \"Z\";\n this._point = NaN;\n }\n point(x, y) {\n switch (this._point) {\n case 0: {\n this._append`M${x},${y}`;\n this._point = 1;\n break;\n }\n case 1: {\n this._append`L${x},${y}`;\n break;\n }\n default: {\n this._append`M${x},${y}`;\n if (this._radius !== cacheRadius || this._append !== cacheAppend) {\n const r = this._radius;\n const s = this._;\n this._ = \"\"; // stash the old string so we can cache the circle path fragment\n this._append`m0,${r}a${r},${r} 0 1,1 0,${-2 * r}a${r},${r} 0 1,1 0,${2 * r}z`;\n cacheRadius = r;\n cacheAppend = this._append;\n cacheCircle = this._;\n this._ = s;\n }\n this._ += cacheCircle;\n break;\n }\n }\n }\n result() {\n const result = this._;\n this._ = \"\";\n return result.length ? result : null;\n }\n}\n\nfunction append(strings) {\n let i = 1;\n this._ += strings[0];\n for (const j = strings.length; i < j; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n const d = Math.floor(digits);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${digits}`);\n if (d > 15) return append;\n if (d !== cacheDigits) {\n const k = 10 ** d;\n cacheDigits = d;\n cacheAppend = function append(strings) {\n let i = 1;\n this._ += strings[0];\n for (const j = strings.length; i < j; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n }\n return cacheAppend;\n}\n", "import identity from \"../identity.js\";\nimport stream from \"../stream.js\";\nimport pathArea from \"./area.js\";\nimport pathBounds from \"./bounds.js\";\nimport pathCentroid from \"./centroid.js\";\nimport PathContext from \"./context.js\";\nimport pathMeasure from \"./measure.js\";\nimport PathString from \"./string.js\";\n\nexport default function(projection, context) {\n let digits = 3,\n pointRadius = 4.5,\n projectionStream,\n contextStream;\n\n function path(object) {\n if (object) {\n if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n stream(object, projectionStream(contextStream));\n }\n return contextStream.result();\n }\n\n path.area = function(object) {\n stream(object, projectionStream(pathArea));\n return pathArea.result();\n };\n\n path.measure = function(object) {\n stream(object, projectionStream(pathMeasure));\n return pathMeasure.result();\n };\n\n path.bounds = function(object) {\n stream(object, projectionStream(pathBounds));\n return pathBounds.result();\n };\n\n path.centroid = function(object) {\n stream(object, projectionStream(pathCentroid));\n return pathCentroid.result();\n };\n\n path.projection = function(_) {\n if (!arguments.length) return projection;\n projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream;\n return path;\n };\n\n path.context = function(_) {\n if (!arguments.length) return context;\n contextStream = _ == null ? (context = null, new PathString(digits)) : new PathContext(context = _);\n if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n return path;\n };\n\n path.pointRadius = function(_) {\n if (!arguments.length) return pointRadius;\n pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n return path;\n };\n\n path.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) digits = null;\n else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n if (context === null) contextStream = new PathString(digits);\n return path;\n };\n\n return path.projection(projection).digits(digits).context(context);\n}\n", "export default function(methods) {\n return {\n stream: transformer(methods)\n };\n}\n\nexport function transformer(methods) {\n return function(stream) {\n var s = new TransformStream;\n for (var key in methods) s[key] = methods[key];\n s.stream = stream;\n return s;\n };\n}\n\nfunction TransformStream() {}\n\nTransformStream.prototype = {\n constructor: TransformStream,\n point: function(x, y) { this.stream.point(x, y); },\n sphere: function() { this.stream.sphere(); },\n lineStart: function() { this.stream.lineStart(); },\n lineEnd: function() { this.stream.lineEnd(); },\n polygonStart: function() { this.stream.polygonStart(); },\n polygonEnd: function() { this.stream.polygonEnd(); }\n};\n", "import {default as geoStream} from \"../stream.js\";\nimport boundsStream from \"../path/bounds.js\";\n\nfunction fit(projection, fitBounds, object) {\n var clip = projection.clipExtent && projection.clipExtent();\n projection.scale(150).translate([0, 0]);\n if (clip != null) projection.clipExtent(null);\n geoStream(object, projection.stream(boundsStream));\n fitBounds(boundsStream.result());\n if (clip != null) projection.clipExtent(clip);\n return projection;\n}\n\nexport function fitExtent(projection, extent, object) {\n return fit(projection, function(b) {\n var w = extent[1][0] - extent[0][0],\n h = extent[1][1] - extent[0][1],\n k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),\n x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,\n y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n\nexport function fitSize(projection, size, object) {\n return fitExtent(projection, [[0, 0], size], object);\n}\n\nexport function fitWidth(projection, width, object) {\n return fit(projection, function(b) {\n var w = +width,\n k = w / (b[1][0] - b[0][0]),\n x = (w - k * (b[1][0] + b[0][0])) / 2,\n y = -k * b[0][1];\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n\nexport function fitHeight(projection, height, object) {\n return fit(projection, function(b) {\n var h = +height,\n k = h / (b[1][1] - b[0][1]),\n x = -k * b[0][0],\n y = (h - k * (b[1][1] + b[0][1])) / 2;\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n", "import {cartesian} from \"../cartesian.js\";\nimport {abs, asin, atan2, cos, epsilon, radians, sqrt} from \"../math.js\";\nimport {transformer} from \"../transform.js\";\n\nvar maxDepth = 16, // maximum depth of subdivision\n cosMinDistance = cos(30 * radians); // cos(minimum angular distance)\n\nexport default function(project, delta2) {\n return +delta2 ? resample(project, delta2) : resampleNone(project);\n}\n\nfunction resampleNone(project) {\n return transformer({\n point: function(x, y) {\n x = project(x, y);\n this.stream.point(x[0], x[1]);\n }\n });\n}\n\nfunction resample(project, delta2) {\n\n function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {\n var dx = x1 - x0,\n dy = y1 - y0,\n d2 = dx * dx + dy * dy;\n if (d2 > 4 * delta2 && depth--) {\n var a = a0 + a1,\n b = b0 + b1,\n c = c0 + c1,\n m = sqrt(a * a + b * b + c * c),\n phi2 = asin(c /= m),\n lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a),\n p = project(lambda2, phi2),\n x2 = p[0],\n y2 = p[1],\n dx2 = x2 - x0,\n dy2 = y2 - y0,\n dz = dy * dx2 - dx * dy2;\n if (dz * dz / d2 > delta2 // perpendicular projected distance\n || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end\n || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);\n stream.point(x2, y2);\n resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);\n }\n }\n }\n return function(stream) {\n var lambda00, x00, y00, a00, b00, c00, // first point\n lambda0, x0, y0, a0, b0, c0; // previous point\n\n var resampleStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },\n polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }\n };\n\n function point(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n }\n\n function lineStart() {\n x0 = NaN;\n resampleStream.point = linePoint;\n stream.lineStart();\n }\n\n function linePoint(lambda, phi) {\n var c = cartesian([lambda, phi]), p = project(lambda, phi);\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n stream.point(x0, y0);\n }\n\n function lineEnd() {\n resampleStream.point = point;\n stream.lineEnd();\n }\n\n function ringStart() {\n lineStart();\n resampleStream.point = ringPoint;\n resampleStream.lineEnd = ringEnd;\n }\n\n function ringPoint(lambda, phi) {\n linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n resampleStream.point = linePoint;\n }\n\n function ringEnd() {\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);\n resampleStream.lineEnd = lineEnd;\n lineEnd();\n }\n\n return resampleStream;\n };\n}\n", "import clipAntimeridian from \"../clip/antimeridian.js\";\nimport clipCircle from \"../clip/circle.js\";\nimport clipRectangle from \"../clip/rectangle.js\";\nimport compose from \"../compose.js\";\nimport identity from \"../identity.js\";\nimport {cos, degrees, radians, sin, sqrt} from \"../math.js\";\nimport {rotateRadians} from \"../rotation.js\";\nimport {transformer} from \"../transform.js\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit.js\";\nimport resample from \"./resample.js\";\n\nvar transformRadians = transformer({\n point: function(x, y) {\n this.stream.point(x * radians, y * radians);\n }\n});\n\nfunction transformRotate(rotate) {\n return transformer({\n point: function(x, y) {\n var r = rotate(x, y);\n return this.stream.point(r[0], r[1]);\n }\n });\n}\n\nfunction scaleTranslate(k, dx, dy, sx, sy) {\n function transform(x, y) {\n x *= sx; y *= sy;\n return [dx + k * x, dy - k * y];\n }\n transform.invert = function(x, y) {\n return [(x - dx) / k * sx, (dy - y) / k * sy];\n };\n return transform;\n}\n\nfunction scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {\n if (!alpha) return scaleTranslate(k, dx, dy, sx, sy);\n var cosAlpha = cos(alpha),\n sinAlpha = sin(alpha),\n a = cosAlpha * k,\n b = sinAlpha * k,\n ai = cosAlpha / k,\n bi = sinAlpha / k,\n ci = (sinAlpha * dy - cosAlpha * dx) / k,\n fi = (sinAlpha * dx + cosAlpha * dy) / k;\n function transform(x, y) {\n x *= sx; y *= sy;\n return [a * x - b * y + dx, dy - b * x - a * y];\n }\n transform.invert = function(x, y) {\n return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)];\n };\n return transform;\n}\n\nexport default function projection(project) {\n return projectionMutator(function() { return project; })();\n}\n\nexport function projectionMutator(projectAt) {\n var project,\n k = 150, // scale\n x = 480, y = 250, // translate\n lambda = 0, phi = 0, // center\n deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate\n alpha = 0, // post-rotate angle\n sx = 1, // reflectX\n sy = 1, // reflectX\n theta = null, preclip = clipAntimeridian, // pre-clip angle\n x0 = null, y0, x1, y1, postclip = identity, // post-clip extent\n delta2 = 0.5, // precision\n projectResample,\n projectTransform,\n projectRotateTransform,\n cache,\n cacheStream;\n\n function projection(point) {\n return projectRotateTransform(point[0] * radians, point[1] * radians);\n }\n\n function invert(point) {\n point = projectRotateTransform.invert(point[0], point[1]);\n return point && [point[0] * degrees, point[1] * degrees];\n }\n\n projection.stream = function(stream) {\n return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));\n };\n\n projection.preclip = function(_) {\n return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;\n };\n\n projection.postclip = function(_) {\n return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n };\n\n projection.clipAngle = function(_) {\n return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees;\n };\n\n projection.clipExtent = function(_) {\n return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n projection.scale = function(_) {\n return arguments.length ? (k = +_, recenter()) : k;\n };\n\n projection.translate = function(_) {\n return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];\n };\n\n projection.center = function(_) {\n return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees];\n };\n\n projection.rotate = function(_) {\n return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];\n };\n\n projection.angle = function(_) {\n return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;\n };\n\n projection.reflectX = function(_) {\n return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;\n };\n\n projection.reflectY = function(_) {\n return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;\n };\n\n projection.precision = function(_) {\n return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);\n };\n\n projection.fitExtent = function(extent, object) {\n return fitExtent(projection, extent, object);\n };\n\n projection.fitSize = function(size, object) {\n return fitSize(projection, size, object);\n };\n\n projection.fitWidth = function(width, object) {\n return fitWidth(projection, width, object);\n };\n\n projection.fitHeight = function(height, object) {\n return fitHeight(projection, height, object);\n };\n\n function recenter() {\n var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)),\n transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha);\n rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\n projectTransform = compose(project, transform);\n projectRotateTransform = compose(rotate, projectTransform);\n projectResample = resample(projectTransform, delta2);\n return reset();\n }\n\n function reset() {\n cache = cacheStream = null;\n return projection;\n }\n\n return function() {\n project = projectAt.apply(this, arguments);\n projection.invert = project.invert && invert;\n return recenter();\n };\n}\n", "import {degrees, pi, radians} from \"../math.js\";\nimport {projectionMutator} from \"./index.js\";\n\nexport function conicProjection(projectAt) {\n var phi0 = 0,\n phi1 = pi / 3,\n m = projectionMutator(projectAt),\n p = m(phi0, phi1);\n\n p.parallels = function(_) {\n return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees];\n };\n\n return p;\n}\n", "import {asin, cos, sin} from \"../math.js\";\n\nexport function cylindricalEqualAreaRaw(phi0) {\n var cosPhi0 = cos(phi0);\n\n function forward(lambda, phi) {\n return [lambda * cosPhi0, sin(phi) / cosPhi0];\n }\n\n forward.invert = function(x, y) {\n return [x / cosPhi0, asin(y * cosPhi0)];\n };\n\n return forward;\n}\n", "import {abs, asin, atan2, cos, epsilon, pi, sign, sin, sqrt} from \"../math.js\";\nimport {conicProjection} from \"./conic.js\";\nimport {cylindricalEqualAreaRaw} from \"./cylindricalEqualArea.js\";\n\nexport function conicEqualAreaRaw(y0, y1) {\n var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2;\n\n // Are the parallels symmetrical around the Equator?\n if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0);\n\n var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;\n\n function project(x, y) {\n var r = sqrt(c - 2 * n * sin(y)) / n;\n return [r * sin(x *= n), r0 - r * cos(x)];\n }\n\n project.invert = function(x, y) {\n var r0y = r0 - y,\n l = atan2(x, abs(r0y)) * sign(r0y);\n if (r0y * n < 0)\n l -= pi * sign(x) * sign(r0y);\n return [l / n, asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];\n };\n\n return project;\n}\n\nexport default function() {\n return conicProjection(conicEqualAreaRaw)\n .scale(155.424)\n .center([0, 33.6442]);\n}\n", "import {asin, atan2, cos, sin, sqrt} from \"../math.js\";\n\nexport function azimuthalRaw(scale) {\n return function(x, y) {\n var cx = cos(x),\n cy = cos(y),\n k = scale(cx * cy);\n if (k === Infinity) return [2, 0];\n return [\n k * cy * sin(x),\n k * sin(y)\n ];\n }\n}\n\nexport function azimuthalInvert(angle) {\n return function(x, y) {\n var z = sqrt(x * x + y * y),\n c = angle(z),\n sc = sin(c),\n cc = cos(c);\n return [\n atan2(x * sc, z * cc),\n asin(z && y * sc / z)\n ];\n }\n}\n", "import {atan, exp, halfPi, log, pi, tan, tau} from \"../math.js\";\nimport rotation from \"../rotation.js\";\nimport projection from \"./index.js\";\n\nexport function mercatorRaw(lambda, phi) {\n return [lambda, log(tan((halfPi + phi) / 2))];\n}\n\nmercatorRaw.invert = function(x, y) {\n return [x, 2 * atan(exp(y)) - halfPi];\n};\n\nexport default function() {\n return mercatorProjection(mercatorRaw)\n .scale(961 / tau);\n}\n\nexport function mercatorProjection(project) {\n var m = projection(project),\n center = m.center,\n scale = m.scale,\n translate = m.translate,\n clipExtent = m.clipExtent,\n x0 = null, y0, x1, y1; // clip extent\n\n m.scale = function(_) {\n return arguments.length ? (scale(_), reclip()) : scale();\n };\n\n m.translate = function(_) {\n return arguments.length ? (translate(_), reclip()) : translate();\n };\n\n m.center = function(_) {\n return arguments.length ? (center(_), reclip()) : center();\n };\n\n m.clipExtent = function(_) {\n return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n function reclip() {\n var k = pi * scale(),\n t = m(rotation(m.rotate()).invert([0, 0]));\n return clipExtent(x0 == null\n ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw\n ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]\n : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);\n }\n\n return reclip();\n}\n", "import projection from \"./index.js\";\n\nexport function equirectangularRaw(lambda, phi) {\n return [lambda, phi];\n}\n\nequirectangularRaw.invert = equirectangularRaw;\n\nexport default function() {\n return projection(equirectangularRaw)\n .scale(152.63);\n}\n", "import {asin, cos, epsilon, sin} from \"../math.js\";\nimport {azimuthalInvert} from \"./azimuthal.js\";\nimport projection from \"./index.js\";\n\nexport function orthographicRaw(x, y) {\n return [cos(y) * sin(x), sin(y)];\n}\n\northographicRaw.invert = azimuthalInvert(asin);\n\nexport default function() {\n return projection(orthographicRaw)\n .scale(249.5)\n .clipAngle(90 + epsilon);\n}\n", "import { geoArea } from \"d3-geo\"\n\n/** The on-disk shape `@motionscript/geo-data` writes; see its `generate.mjs`. */\nexport const GEO_DATA_FORMAT = 1\n\nexport interface GeoFileData {\n format: number\n source?: string\n transform: { scale: [number, number]; translate: [number, number] }\n /** Global arc id per local arc — identical across files for a shared border. */\n arcIds: number[]\n /** Per arc, flat `[x0, y0, w0, dx, dy, w, …]`: delta-encoded quantized lon/lat and a weight bucket. */\n arcs: number[][]\n features: GeoFeatureData[]\n}\n\nexport interface GeoFeatureData {\n code: string\n name: string\n nameNl?: string\n parent: string | null\n first: boolean\n listed: boolean\n remote?: boolean\n area: number\n mainland: number[] | null\n areas: number[]\n /** Polygons → rings → arc refs (`~i` is arc `i` reversed). */\n polygons: number[][][]\n}\n\n/** `[code, name, nameNl, parent, first]` per listed region. */\nexport type GeoIndexEntry = [string, string, string, string | null, 0 | 1]\n\nexport interface GeoIndex {\n format: number\n source?: string\n regions: GeoIndexEntry[]\n}\n\nexport interface GeoArc {\n /** Identity for de-duplicating a border drawn by two regions, across files. */\n key: number | string\n /** Interleaved lon/lat, in degrees. */\n points: Float64Array\n /** Per point: 0 always survives, higher buckets are less significant; see `thresholdBucket`. */\n buckets: Uint8Array\n}\n\nexport interface GeoRingRef {\n arc: GeoArc\n reversed: boolean\n}\n\nexport interface GeoPolygon {\n rings: GeoRingRef[][]\n /** Per ring, in steradians — exterior first, then holes. */\n ringAreas: number[]\n area: number\n mainland: boolean\n}\n\nexport interface GeoFeature {\n code: string\n name: string\n nameNl: string\n parent: string | null\n first: boolean\n listed: boolean\n remote: boolean\n polygons: GeoPolygon[]\n}\n\nexport interface DecodedGeoFile {\n features: Map<string, GeoFeature>\n}\n\nfunction decodeArc(encoded: number[], key: number, [kx, ky]: [number, number], [tx, ty]: [number, number]): GeoArc {\n const count = encoded.length / 3\n const points = new Float64Array(count * 2)\n const buckets = new Uint8Array(count)\n let x = 0\n let y = 0\n for (let i = 0; i < count; i++) {\n x += encoded[i * 3]\n y += encoded[i * 3 + 1]\n points[i * 2] = x * kx + tx\n points[i * 2 + 1] = y * ky + ty\n buckets[i] = encoded[i * 3 + 2]\n }\n return { key, points, buckets }\n}\n\nexport function ringCoordinates(ring: readonly GeoRingRef[]): [number, number][] {\n const out: [number, number][] = []\n for (const { arc, reversed } of ring) {\n const n = arc.buckets.length\n for (let j = out.length === 0 ? 0 : 1; j < n; j++) {\n const i = reversed ? n - 1 - j : j\n out.push([arc.points[i * 2], arc.points[i * 2 + 1]])\n }\n }\n return out\n}\n\n/** A ring's area in steradians, whichever way it winds. */\nexport function ringArea(ring: readonly GeoRingRef[]): number {\n const coordinates = ringCoordinates(ring)\n if (coordinates.length < 4) return 0\n const area = geoArea({ type: \"Polygon\", coordinates: [coordinates] })\n return area > 2 * Math.PI ? 4 * Math.PI - area : area\n}\n\nexport function decodeGeoFile(data: GeoFileData): DecodedGeoFile {\n if (data.format !== GEO_DATA_FORMAT) {\n throw new Error(`geo data format ${data.format} is not supported (expected ${GEO_DATA_FORMAT})`)\n }\n const arcs = data.arcs.map((encoded, i) =>\n decodeArc(encoded, data.arcIds[i], data.transform.scale, data.transform.translate)\n )\n const ref = (index: number): GeoRingRef =>\n index < 0 ? { arc: arcs[~index], reversed: true } : { arc: arcs[index], reversed: false }\n\n const features = new Map<string, GeoFeature>()\n for (const f of data.features) {\n const mainland = f.mainland ? new Set(f.mainland) : null\n features.set(f.code, {\n code: f.code,\n name: f.name,\n nameNl: f.nameNl ?? f.name,\n parent: f.parent,\n first: f.first,\n listed: f.listed,\n remote: f.remote === true,\n polygons: f.polygons.map((rings, i) => {\n const resolved = rings.map((ring) => ring.map(ref))\n return {\n rings: resolved,\n ringAreas: resolved.map((ring, r) => (r === 0 ? f.areas[i] : ringArea(ring))),\n area: f.areas[i],\n mainland: mainland === null || mainland.has(i),\n }\n }),\n })\n }\n return { features }\n}\n", "import {\n Clip,\n Graphics2D,\n ShapeNode,\n node,\n property,\n type AssetScope,\n type FillResolved,\n type NodeConfig,\n type PathBounds,\n type RenderContext2D,\n type ShadowResolved,\n type ShapeProps,\n type StrokeResolved,\n} from \"@motionscript/sdk\"\nimport { snapValue } from \"@motionscript/sdk/component\"\n\nimport { geoGeometry, type GeoBorders, type GeoContour, type GeoGeometry, type GeoProjectionKind } from \"./geometry\"\nimport { geoDataVersion, geoLoader } from \"./loader\"\nimport { geoRegistry } from \"./registry\"\nimport { geoFilesFor, normalizeIso, selectGeoFeatures, type GeoFrame, type GeoLevel } from \"./selection\"\n\nexport interface GeoBorderProps extends ShapeProps {\n /** ISO 3166-1 alpha-2 (`\"FR\"`) or ISO 3166-2 (`\"US-CA\"`) codes. */\n iso: string | readonly string[]\n level: GeoLevel\n /** 0–1: 1 is full resolution, lower is a more stylised outline. */\n detail: number\n projection: GeoProjectionKind\n frame: GeoFrame\n borders: GeoBorders\n}\n\ninterface Chunk {\n data: string\n /** Where this chunk's contours sit along the whole drawing, as fractions of its length. */\n from: number\n to: number\n}\n\ninterface Drawn {\n geometry: GeoGeometry\n width: number\n height: number\n fills: Chunk[]\n lines: Chunk[]\n}\n\n// Skia's cost for one path grows faster than its contour count, and a shape\n// drawn as several paths under one paint is unioned every frame — so a region\n// is cut into paths of bounded size, each painted on its own.\nconst CONTOURS_PER_PATH = 256\nconst POINTS_PER_PATH = 40_000\n\nconst coordinate = (value: number) => String(Math.round(value * 100) / 100)\n\nfunction chunk(contours: readonly GeoContour[], total: number, scale: number): Chunk[] {\n const chunks: Chunk[] = []\n let parts: string[] = []\n let count = 0\n let points = 0\n let from = 0\n let length = 0\n const flush = () => {\n if (count === 0) return\n const to = total > 0 ? Math.min(1, length / total) : 1\n chunks.push({ data: parts.join(\"\"), from, to })\n from = to\n parts = []\n count = 0\n points = 0\n }\n for (const contour of contours) {\n const p = contour.points\n // Path data is y-down; the unit geometry is y-up.\n for (let i = 0; i < p.length; i += 2) {\n parts.push(i === 0 ? \"M\" : \"L\", coordinate(p[i] * scale), \" \", coordinate(-p[i + 1] * scale))\n }\n if (contour.closed) parts.push(\"Z\")\n count++\n points += p.length / 2\n length += contour.length\n if (count >= CONTOURS_PER_PATH || points >= POINTS_PER_PATH) flush()\n }\n flush()\n return chunks\n}\n\n/**\n * Country and subdivision outlines by ISO 3166 code, fitted into the node's box.\n *\n * <GeoBorder iso={[\"FR\", \"DE\"]} detail={0.4} stroke={{ weight: 2, fill: \"white\" }} />\n *\n * Geometry comes from whatever `geoRegistry` has been given — a URL, a loader,\n * or shapes defined by hand — and loads as a declared asset, so a frame never\n * draws half a country. Fill and stroke are separate geometry: the fill is each\n * region's polygons, the stroke is every border once, which is why a border two\n * selected regions share is not drawn twice and why `stroke.align` does not\n * apply.\n */\n@node({\n key: \"geoBorder\",\n parentKey: \"shape\",\n forkable: true,\n layout: {\n children: \"freeform\",\n acceptsChildren: true,\n defaultWidthMode: \"fixed\",\n defaultHeightMode: \"fixed\",\n },\n seed: { width: 480, height: 480 },\n})\nexport class GeoBorder extends ShapeNode<GeoBorderProps> {\n @property({ default: [\"FR\"], mapper: normalizeIso, tween: snapValue })\n declare iso: string | readonly string[]\n\n @property({ default: \"country\", tween: snapValue, options: [\"country\", \"state\"] })\n declare level: GeoLevel\n\n @property({ default: 0.5, min: 0, max: 1, step: 0.01 })\n declare detail: number\n\n @property({\n default: \"conic\",\n tween: snapValue,\n options: [\"conic\", \"mercator\", \"equirectangular\", \"orthographic\"],\n })\n declare projection: GeoProjectionKind\n\n @property({ default: \"mainland\", tween: snapValue, options: [\"mainland\", \"all\"] })\n declare frame: GeoFrame\n\n @property({ default: \"all\", tween: snapValue, options: [\"all\", \"outline\"] })\n declare borders: GeoBorders\n\n constructor(props?: NodeConfig<GeoBorder, GeoBorderProps>) {\n super(props as NodeConfig<ShapeNode<GeoBorderProps>, GeoBorderProps>)\n }\n\n override declareAssets(assets: AssetScope): void {\n super.declareAssets(assets)\n for (const file of geoFilesFor(this.iso as string[], this.level)) {\n assets.loader(`geo:${file}`, geoLoader(file), { gate: \"render\" })\n }\n }\n\n protected override renderSelf(ctx: RenderContext2D): void {\n const drawn = this._drawn()\n const fill = this.fill as FillResolved[]\n if (!drawn || drawn.fills.length === 0) return\n const shadow = this.shadow as ShadowResolved[]\n const g = new Graphics2D()\n for (const chunk of drawn.fills) {\n if (!this._pathOp(g, chunk)) continue\n if (shadow.length > 0) g.shadow(shadow)\n g.fill(fill)\n }\n ctx.draw(g)\n }\n\n protected override renderOverlay(ctx: RenderContext2D): void {\n const overlay = this.overlay as FillResolved[]\n if (overlay.length === 0) return\n const drawn = this._drawn()\n if (!drawn) return\n const g = new Graphics2D()\n for (const chunk of drawn.fills) if (this._pathOp(g, chunk)) g.fill(overlay)\n ctx.draw(g)\n }\n\n protected override renderStroke(ctx: RenderContext2D): void {\n const stroke = this.stroke as StrokeResolved[]\n if (stroke.length === 0) return\n const drawn = this._drawn()\n if (!drawn || drawn.lines.length === 0) return\n const centred = stroke.map((layer) => (layer.align === 0 ? layer : { ...layer, align: 0 }))\n const shadow = this.shadow as ShadowResolved[]\n const castsShadow = shadow.length > 0 && !(this.fill as FillResolved[]).some((layer) => (layer.opacity ?? 1) > 0)\n const g = new Graphics2D()\n for (const chunk of drawn.lines) {\n if (!this._pathOp(g, chunk)) continue\n if (castsShadow) g.shadow(shadow)\n g.stroke(centred)\n }\n ctx.draw(g)\n }\n\n // The box, not the outline: a path clip has no winding test, and a country's\n // bounding box is what the selection shows.\n protected override clipSelf(): Clip {\n return new Clip().rect({\n x: 0,\n y: 0,\n width: this.layoutBounds.width,\n height: this.layoutBounds.height,\n })\n }\n\n private _drawnCache: Drawn | null = null\n private readonly _warned = new Set<string>()\n\n private _pathOp(g: Graphics2D, chunk: Chunk): boolean {\n const start = this.start\n const end = this.end\n const width = this.layoutBounds.width\n const height = this.layoutBounds.height\n const centerBounds: PathBounds = [-width / 2, -height / 2, width / 2, height / 2]\n if (start <= 0 && end >= 1) {\n g.path({ data: chunk.data, centerBounds })\n return true\n }\n const span = chunk.to - chunk.from\n if (span <= 0) return false\n const localStart = Math.max(0, (start - chunk.from) / span)\n const localEnd = Math.min(1, (end - chunk.from) / span)\n if (localEnd <= localStart) return false\n g.path({ data: chunk.data, centerBounds, start: localStart, end: localEnd })\n return true\n }\n\n private _drawn(): Drawn | null {\n const codes = this.iso as string[]\n const level = this.level\n const frame = this.frame\n const selection = selectGeoFeatures(codes, level, frame)\n for (const code of selection.unknown) {\n if (this._warned.has(code)) continue\n this._warned.add(code)\n console.warn(`[GeoBorder] no region with code ${code}`)\n }\n if (selection.features.length === 0) return null\n\n const geometry = geoGeometry({\n selectionKey: `${geoRegistry.generation}:${geoDataVersion()}:${level}:${frame}:${codes.join(\",\")}`,\n features: selection.features,\n frame,\n projection: this.projection,\n borders: this.borders,\n detail: this.detail,\n })\n if (!geometry) return null\n\n const width = this.layoutBounds.width\n const height = this.layoutBounds.height\n const cached = this._drawnCache\n if (cached && cached.geometry === geometry && cached.width === width && cached.height === height) {\n return cached\n }\n const scale = Math.min(width / geometry.width, height / geometry.height)\n const drawn: Drawn = {\n geometry,\n width,\n height,\n fills: chunk(geometry.fills, geometry.fillLength, scale),\n lines: chunk(geometry.lines, geometry.lineLength, scale),\n }\n this._drawnCache = drawn\n return drawn\n }\n}\n", "import {\n geoArea,\n geoBounds,\n geoConicEqualArea,\n geoEquirectangular,\n geoMercator,\n geoOrthographic,\n geoPath,\n geoStream,\n type GeoPermissibleObjects,\n type GeoProjection,\n} from \"d3-geo\"\n\nimport { ringCoordinates, type GeoArc, type GeoFeature, type GeoPolygon, type GeoRingRef } from \"./format\"\nimport type { GeoFrame } from \"./selection\"\n\nexport type GeoProjectionKind = \"conic\" | \"mercator\" | \"equirectangular\" | \"orthographic\"\nexport type GeoBorders = \"all\" | \"outline\"\n\nexport interface GeoContour {\n /** Interleaved x/y in unit space: the longer side spans 1, centred on the origin, y up. */\n points: Float32Array\n closed: boolean\n length: number\n}\n\nexport interface GeoGeometry {\n /** The drawing's extent in unit space; the longer of the two is 1. */\n width: number\n height: number\n fills: GeoContour[]\n lines: GeoContour[]\n fillLength: number\n lineLength: number\n bytes: number\n}\n\ninterface Part {\n polygon: GeoPolygon\n largest: boolean\n}\n\ninterface Frame {\n projection: GeoProjection\n centerX: number\n centerY: number\n size: number\n width: number\n height: number\n}\n\nconst FIT = 1024\n\n// `detail` maps onto a weight threshold that is a fraction of the selection's\n// own area, on a log scale — which is what makes a value look equally stylised\n// on Monaco and on Russia. 0 keeps points worth 1% of the area; just below 1,\n// points worth a billionth of it.\nconst POINT_BASE = 2\nconst POINT_RANGE = 7\nconst POLYGON_BASE = 1.5\nconst POLYGON_RANGE = 6\n\nconst clamp01 = (value: number) => (value > 1 ? 1 : value > 0 ? value : 0)\n\n/** The highest weight bucket a point may carry and still be drawn. */\nexport function pointBucketLimit(detail: number, area: number): number {\n if (detail >= 1 || !(area > 0)) return 255\n const minWeight = area * 10 ** -(POINT_BASE + POINT_RANGE * clamp01(detail))\n return Math.floor(-2 * Math.log2(minWeight))\n}\n\n/** Rings smaller than this (steradians) are dropped, bar each region's largest. */\nexport function polygonAreaLimit(detail: number, area: number): number {\n if (detail >= 1) return 0\n return area * 10 ** -(POLYGON_BASE + POLYGON_RANGE * clamp01(detail))\n}\n\nfunction partsOf(features: readonly GeoFeature[], frame: GeoFrame): Part[] {\n const parts: Part[] = []\n for (const feature of features) {\n const mainland = frame === \"mainland\" ? feature.polygons.filter((p) => p.mainland) : []\n const polygons = mainland.length > 0 ? mainland : feature.polygons\n let largest: GeoPolygon | null = null\n for (const polygon of polygons) if (!largest || polygon.area > largest.area) largest = polygon\n for (const polygon of polygons) parts.push({ polygon, largest: polygon === largest })\n }\n return parts\n}\n\nfunction centerLongitude(west: number, east: number): number {\n if (west <= east) return (west + east) / 2\n const mid = (west + east + 360) / 2\n return mid > 180 ? mid - 360 : mid\n}\n\nfunction makeProjection(kind: GeoProjectionKind, west: number, south: number, east: number, north: number): GeoProjection {\n const lon = centerLongitude(west, east)\n const lat = (south + north) / 2\n switch (kind) {\n case \"mercator\":\n return geoMercator().rotate([-lon, 0])\n case \"equirectangular\":\n return geoEquirectangular().rotate([-lon, 0])\n case \"orthographic\":\n return geoOrthographic().rotate([-lon, -lat])\n case \"conic\": {\n const span = north - south\n return geoConicEqualArea()\n .rotate([-lon, 0])\n .center([0, lat])\n .parallels([south + span / 6, north - span / 6])\n }\n }\n}\n\nfunction fitFrame(kind: GeoProjectionKind, parts: readonly Part[]): Frame | null {\n if (parts.length === 0) return null\n const shape = {\n type: \"MultiPolygon\",\n coordinates: parts.map(({ polygon }) => [ringCoordinates(polygon.rings[0])]),\n } as GeoPermissibleObjects\n const [[west, south], [east, north]] = geoBounds(shape)\n\n for (const candidate of [kind, \"equirectangular\"] as const) {\n const projection = makeProjection(candidate, west, south, east, north).fitSize([FIT, FIT], shape)\n const [[x0, y0], [x1, y1]] = geoPath(projection).bounds(shape)\n const size = Math.max(x1 - x0, y1 - y0)\n if (!Number.isFinite(size) || size <= 0) continue\n return {\n projection,\n centerX: (x0 + x1) / 2,\n centerY: (y0 + y1) / 2,\n size,\n width: (x1 - x0) / size,\n height: (y1 - y0) / size,\n }\n }\n return null\n}\n\nfunction project(frame: Frame, object: GeoPermissibleObjects, closed: boolean): GeoContour[] {\n const contours: GeoContour[] = []\n let current: number[] | null = null\n const { centerX, centerY, size } = frame\n const sink = {\n point(x: number, y: number) {\n current?.push((x - centerX) / size, -(y - centerY) / size)\n },\n lineStart() {\n current = []\n },\n lineEnd() {\n const flat = current\n current = null\n if (!flat || flat.length < 4) return\n let isClosed = closed\n if (!closed) {\n const n = flat.length\n if (flat[0] === flat[n - 2] && flat[1] === flat[n - 1] && n >= 8) {\n flat.length = n - 2\n isClosed = true\n }\n }\n const points = Float32Array.from(flat)\n contours.push({ points, closed: isClosed, length: contourLength(points, isClosed) })\n },\n polygonStart() {},\n polygonEnd() {},\n sphere() {},\n }\n geoStream(object, frame.projection.stream(sink))\n return contours\n}\n\nfunction contourLength(points: Float32Array, closed: boolean): number {\n let length = 0\n const n = points.length / 2\n for (let i = 1; i < n; i++) {\n length += Math.hypot(points[i * 2] - points[i * 2 - 2], points[i * 2 + 1] - points[i * 2 - 1])\n }\n if (closed && n > 1) length += Math.hypot(points[0] - points[n * 2 - 2], points[1] - points[n * 2 - 1])\n return length\n}\n\n// Longest edge, in degrees, that simplification may leave. d3 takes an edge as\n// the short way round the sphere, so an edge across more than half the planet\n// (Kaliningrad to Chukotka, once the coast between is dropped) turns inside out.\nconst MAX_EDGE_DEGREES = 20\n\ntype MaskFor = (arc: GeoArc) => Uint8Array\n\n/** Which of an arc's points survive `limit`, the same whichever way the arc is walked. */\nfunction keepMask(arc: GeoArc, limit: number): Uint8Array {\n const n = arc.buckets.length\n const mask = new Uint8Array(n)\n let lastLon = arc.points[0]\n let lastLat = arc.points[1]\n for (let i = 0; i < n; i++) {\n const lon = arc.points[i * 2]\n const lat = arc.points[i * 2 + 1]\n let far = false\n if (arc.buckets[i] > limit) {\n let dLon = Math.abs(lon - lastLon)\n if (dLon > 180) dLon = 360 - dLon\n far = Math.abs(lat - lastLat) > MAX_EDGE_DEGREES || dLon * Math.cos((lat * Math.PI) / 180) > MAX_EDGE_DEGREES\n }\n if (arc.buckets[i] <= limit || far) {\n mask[i] = 1\n lastLon = lon\n lastLat = lat\n }\n }\n return mask\n}\n\nfunction filteredPoints(refs: readonly GeoRingRef[], maskFor: MaskFor): [number, number][] {\n const out: [number, number][] = []\n for (const { arc, reversed } of refs) {\n const n = arc.buckets.length\n const mask = maskFor(arc)\n for (let j = out.length === 0 ? 0 : 1; j < n; j++) {\n const i = reversed ? n - 1 - j : j\n if (mask[i]) out.push([arc.points[i * 2], arc.points[i * 2 + 1]])\n }\n }\n return out\n}\n\n/** A ring keeps at least three vertices, raising its arcs' limits if the global one would collapse it. */\nfunction ringLimit(ring: readonly GeoRingRef[], limit: number): number {\n let kept = 0\n for (const { arc } of ring) {\n for (let i = 0; i < arc.buckets.length - 1; i++) if (arc.buckets[i] <= limit) kept++\n }\n if (kept >= 3) return limit\n const buckets: number[] = []\n for (const { arc } of ring) for (let i = 0; i < arc.buckets.length - 1; i++) buckets.push(arc.buckets[i])\n buckets.sort((a, b) => a - b)\n return Math.max(limit, buckets[Math.min(2, buckets.length - 1)] ?? limit)\n}\n\n/**\n * Whether a simplified ring still winds the way its original did. Dropping\n * points can fold a small ring over itself, and d3 reads an exterior wound the\n * wrong way as the rest of the planet — one such island fills the whole frame.\n */\nfunction windsAsOriginal(ring: [number, number][], exterior: boolean): boolean {\n if (ring.length < 4) return true\n const inverted = geoArea({ type: \"Polygon\", coordinates: [ring] }) > 2 * Math.PI\n return inverted !== exterior\n}\n\ninterface Chain {\n refs: GeoRingRef[]\n closed: boolean\n}\n\nconst endKey = (arc: GeoArc, last: boolean) => {\n const i = last ? arc.buckets.length - 1 : 0\n return `${arc.points[i * 2]},${arc.points[i * 2 + 1]}`\n}\n\n/** Joins arcs that meet end to end with nothing else at the joint, so a border draws as one line with real joins. */\nfunction chainArcs(arcs: readonly GeoArc[]): Chain[] {\n const atNode = new Map<string, GeoArc[]>()\n for (const arc of arcs) {\n for (const key of [endKey(arc, false), endKey(arc, true)]) {\n const list = atNode.get(key)\n if (list) list.push(arc)\n else atNode.set(key, [arc])\n }\n }\n const visited = new Set<GeoArc>()\n const chains: Chain[] = []\n const refStart = ({ arc, reversed }: GeoRingRef) => endKey(arc, reversed)\n const refEnd = ({ arc, reversed }: GeoRingRef) => endKey(arc, !reversed)\n const nextAt = (node: string): GeoArc | null => {\n const list = atNode.get(node)!\n if (list.length !== 2) return null\n return list.find((arc) => !visited.has(arc)) ?? null\n }\n\n for (const arc of arcs) {\n if (visited.has(arc)) continue\n visited.add(arc)\n const refs: GeoRingRef[] = [{ arc, reversed: false }]\n for (let next = nextAt(refEnd(refs[refs.length - 1])); next; next = nextAt(refEnd(refs[refs.length - 1]))) {\n visited.add(next)\n refs.push({ arc: next, reversed: endKey(next, false) !== refEnd(refs[refs.length - 1]) })\n }\n for (let prev = nextAt(refStart(refs[0])); prev; prev = nextAt(refStart(refs[0]))) {\n visited.add(prev)\n refs.unshift({ arc: prev, reversed: endKey(prev, true) !== refStart(refs[0]) })\n }\n chains.push({ refs, closed: refStart(refs[0]) === refEnd(refs[refs.length - 1]) })\n }\n return chains\n}\n\nfunction buildGeometry(\n features: readonly GeoFeature[],\n frame: GeoFrame,\n fitted: Frame,\n borders: GeoBorders,\n detail: number\n): GeoGeometry {\n const parts = partsOf(features, frame)\n const area = parts.reduce((sum, { polygon }) => sum + polygon.area, 0)\n const pointLimit = pointBucketLimit(detail, area)\n const polygonLimit = polygonAreaLimit(detail, area)\n\n const kept: GeoRingRef[][][] = []\n for (const { polygon, largest } of parts) {\n if (!largest && polygon.area < polygonLimit) continue\n kept.push(polygon.rings.filter((_, i) => i === 0 || polygon.ringAreas[i] >= polygonLimit))\n }\n\n const limits = new Map<GeoArc[\"key\"], number>()\n const usage = new Map<GeoArc[\"key\"], { arc: GeoArc; count: number }>()\n for (const rings of kept) {\n for (const ring of rings) {\n const limit = ringLimit(ring, pointLimit)\n for (const { arc } of ring) {\n limits.set(arc.key, Math.max(limits.get(arc.key) ?? 0, limit))\n const use = usage.get(arc.key)\n if (use) use.count++\n else usage.set(arc.key, { arc, count: 1 })\n }\n }\n }\n\n const masks = new Map<GeoArc[\"key\"], Uint8Array>()\n const maskFor: MaskFor = (arc) => {\n let mask = masks.get(arc.key)\n if (!mask) {\n mask = keepMask(arc, limits.get(arc.key) ?? 255)\n masks.set(arc.key, mask)\n }\n return mask\n }\n\n if (pointLimit < 255) {\n for (const rings of kept) {\n rings.forEach((ring, index) => {\n let limit = Math.min(...ring.map(({ arc }) => limits.get(arc.key) ?? pointLimit))\n while (limit < 255 && !windsAsOriginal(filteredPoints(ring, maskFor), index === 0)) {\n limit = Math.min(255, limit + 2)\n for (const { arc } of ring) {\n limits.set(arc.key, Math.max(limits.get(arc.key) ?? 0, limit))\n masks.delete(arc.key)\n }\n }\n })\n }\n }\n\n const fills = project(\n fitted,\n {\n type: \"MultiPolygon\",\n coordinates: kept.flatMap((rings) => {\n const [exterior, ...holes] = rings.map((ring) => filteredPoints(ring, maskFor))\n return exterior.length < 4 ? [] : [[exterior, ...holes.filter((hole) => hole.length >= 4)]]\n }),\n } as GeoPermissibleObjects,\n true\n )\n\n const lineArcs = [...usage.values()].filter(({ count }) => borders === \"all\" || count === 1).map(({ arc }) => arc)\n const lines: GeoContour[] = []\n for (const chain of chainArcs(lineArcs)) {\n lines.push(\n ...project(fitted, { type: \"LineString\", coordinates: filteredPoints(chain.refs, maskFor) } as GeoPermissibleObjects, false)\n )\n }\n\n const sum = (contours: GeoContour[]) => contours.reduce((total, c) => total + c.length, 0)\n const bytes = [...fills, ...lines].reduce((total, c) => total + c.points.byteLength + 32, 0)\n return {\n width: fitted.width,\n height: fitted.height,\n fills,\n lines,\n fillLength: sum(fills),\n lineLength: sum(lines),\n bytes,\n }\n}\n\nclass ByteCache<V extends { bytes: number }> {\n private _entries = new Map<string, V>()\n private _bytes = 0\n\n constructor(private readonly _budget: number) {}\n\n get(key: string): V | undefined {\n const value = this._entries.get(key)\n if (value) {\n this._entries.delete(key)\n this._entries.set(key, value)\n }\n return value\n }\n\n set(key: string, value: V): void {\n const previous = this._entries.get(key)\n if (previous) this._bytes -= previous.bytes\n this._entries.delete(key)\n this._entries.set(key, value)\n this._bytes += value.bytes\n for (const [oldest, entry] of this._entries) {\n if (this._bytes <= this._budget || this._entries.size <= 1) break\n this._entries.delete(oldest)\n this._bytes -= entry.bytes\n }\n }\n\n clear(): void {\n this._entries.clear()\n this._bytes = 0\n }\n}\n\nconst frames = new ByteCache<Frame & { bytes: number }>(64)\nconst geometries = new ByteCache<GeoGeometry>(64 * 1024 * 1024)\n\nexport interface GeoGeometryRequest {\n /** Identifies `features` and `frame`: equal keys must mean equal selections. */\n selectionKey: string\n features: readonly GeoFeature[]\n frame: GeoFrame\n projection: GeoProjectionKind\n borders: GeoBorders\n detail: number\n}\n\n/**\n * The drawing for a selection, cached. The projection is fitted to the\n * selection at full detail, so a `detail` tween never moves or rescales it.\n */\nexport function geoGeometry(request: GeoGeometryRequest): GeoGeometry | null {\n const detail = Math.round(clamp01(request.detail) * 100) / 100\n const frameKey = `${request.selectionKey}|${request.projection}`\n const key = `${frameKey}|${request.borders}|${detail}`\n const cached = geometries.get(key)\n if (cached) return cached\n\n let fitted: Frame | undefined = frames.get(frameKey)\n if (!fitted) {\n const made = fitFrame(request.projection, partsOf(request.features, request.frame))\n if (!made) return null\n fitted = made\n frames.set(frameKey, { ...made, bytes: 1 })\n }\n const geometry = buildGeometry(request.features, request.frame, fitted, request.borders, detail)\n geometries.set(key, geometry)\n return geometry\n}\n\nexport function clearGeoGeometry(): void {\n frames.clear()\n geometries.clear()\n}\n", "/**\n * Visvalingam–Whyatt weights for a hand-defined ring, in the same buckets the\n * generated data carries (`-2·log2` of the effective area in steradians), so a\n * shape passed to `geoRegistry.define` answers to `detail` like any other.\n *\n * Planar in degrees with longitude scaled by latitude: accurate enough for the\n * handful of shapes an author defines, where the generated data uses the exact\n * spherical area.\n */\nexport function ringBuckets(points: Float64Array): Uint8Array {\n const n = points.length / 2\n const buckets = new Uint8Array(n)\n if (n < 3) return buckets\n\n const radians = Math.PI / 180\n const weight = new Float64Array(n)\n const prev = new Int32Array(n)\n const next = new Int32Array(n)\n for (let i = 0; i < n; i++) {\n prev[i] = i - 1\n next[i] = i + 1\n }\n\n const area = (a: number, b: number, c: number): number => {\n const cos = Math.cos(points[b * 2 + 1] * radians)\n const ax = points[a * 2] * cos, ay = points[a * 2 + 1]\n const bx = points[b * 2] * cos, by = points[b * 2 + 1]\n const cx = points[c * 2] * cos, cy = points[c * 2 + 1]\n return (Math.abs((bx - ax) * (cy - ay) - (cx - ax) * (by - ay)) / 2) * radians * radians\n }\n\n const heap: number[] = []\n const position = new Int32Array(n).fill(-1)\n const less = (i: number, j: number) => weight[heap[i]] < weight[heap[j]]\n const swap = (i: number, j: number) => {\n ;[heap[i], heap[j]] = [heap[j], heap[i]]\n position[heap[i]] = i\n position[heap[j]] = j\n }\n const up = (i: number) => {\n while (i > 0) {\n const parent = (i - 1) >> 1\n if (!less(i, parent)) break\n swap(i, parent)\n i = parent\n }\n }\n const down = (i: number) => {\n for (;;) {\n const l = 2 * i + 1\n const r = l + 1\n let smallest = i\n if (l < heap.length && less(l, smallest)) smallest = l\n if (r < heap.length && less(r, smallest)) smallest = r\n if (smallest === i) return\n swap(i, smallest)\n i = smallest\n }\n }\n const push = (i: number) => {\n position[i] = heap.length\n heap.push(i)\n up(heap.length - 1)\n }\n const remove = (i: number) => {\n const at = position[i]\n const last = heap.pop()!\n position[i] = -1\n if (at < heap.length) {\n heap[at] = last\n position[last] = at\n up(at)\n down(position[last])\n }\n }\n\n for (let i = 1; i < n - 1; i++) {\n weight[i] = area(i - 1, i, i + 1)\n push(i)\n }\n\n let floor = 0\n const final = new Float64Array(n)\n final[0] = final[n - 1] = Infinity\n while (heap.length > 0) {\n const i = heap[0]\n remove(i)\n floor = Math.max(floor, weight[i])\n final[i] = floor\n const p = prev[i]\n const q = next[i]\n if (p >= 0) next[p] = q\n if (q < n) prev[q] = p\n for (const j of [p, q]) {\n if (j <= 0 || j >= n - 1 || position[j] < 0) continue\n remove(j)\n weight[j] = area(prev[j], j, next[j])\n push(j)\n }\n }\n\n for (let i = 0; i < n; i++) buckets[i] = weightBucket(final[i])\n return buckets\n}\n\nexport function weightBucket(weight: number): number {\n if (weight === Infinity) return 0\n if (!(weight > 0)) return 255\n return Math.min(254, Math.max(1, Math.round(-2 * Math.log2(weight))))\n}\n", "import { geoArea } from \"d3-geo\"\n\nimport {\n GEO_DATA_FORMAT,\n type GeoFeature,\n type GeoFileData,\n type GeoIndex,\n type GeoPolygon,\n type GeoRingRef,\n} from \"./format\"\nimport { ringBuckets } from \"./simplify\"\n\n/** Prefix every data key carries; bumped with the file format. */\nexport const GEO_DATA_VERSION = `v${GEO_DATA_FORMAT}`\n\n/**\n * Answers a data key — `v1/countries/FR`, `v1/states/US`, `v1/index` — with the\n * parsed file, or `null` when this source does not have it. A throw means \"could\n * not tell\" (offline, a 500) and is retried on the next load.\n */\nexport type GeoSource = (key: string) => Promise<unknown>\n\ntype Position = readonly [number, number] | readonly number[]\ntype GeoPolygonShape =\n | { type: \"Polygon\"; coordinates: readonly (readonly Position[])[] }\n | { type: \"MultiPolygon\"; coordinates: readonly (readonly (readonly Position[])[])[] }\n/** GeoJSON in lon/lat: a Polygon, a MultiPolygon, or a Feature holding one. */\nexport type GeoShape = GeoPolygonShape | { type: \"Feature\"; geometry: GeoPolygonShape; properties?: { name?: string } | null }\n\nexport interface GeoDefinition {\n shape: GeoShape\n name?: string\n /** The country a subdivision code expands under, when it has one. */\n parent?: string\n}\n\n/** Fetches `<base>/<key>.json`; `base` may instead map a key to its URL. */\nexport function geoUrlSource(base: string | ((key: string) => string), init?: RequestInit): GeoSource {\n return async (key) => {\n const url = typeof base === \"function\" ? base(key) : `${base.replace(/\\/+$/, \"\")}/${key}.json`\n const response = await fetch(url, init)\n // Supabase Storage answers a missing object with 400, not 404.\n if (response.status === 404 || response.status === 400) return null\n if (!response.ok) throw new Error(`${url} → HTTP ${response.status}`)\n return response.json()\n }\n}\n\n/** Wraps a function returning the file as text, bytes or parsed JSON (e.g. `fs.readFile`). */\nexport function geoLoaderSource(\n load: (key: string) => Promise<string | ArrayBuffer | Uint8Array | object | null | undefined>\n): GeoSource {\n return async (key) => {\n const value = await load(key)\n if (value == null) return null\n if (typeof value === \"string\") return JSON.parse(value)\n if (value instanceof ArrayBuffer || value instanceof Uint8Array) {\n return JSON.parse(new TextDecoder().decode(value))\n }\n return value\n }\n}\n\nfunction definedFeature(code: string, definition: GeoDefinition, serial: number): GeoFeature {\n const shape = definition.shape.type === \"Feature\" ? definition.shape.geometry : definition.shape\n const feature = definition.shape.type === \"Feature\" ? definition.shape : null\n const polygons: readonly (readonly (readonly Position[])[])[] =\n shape.type === \"Polygon\" ? [shape.coordinates] : shape.coordinates\n let arcIndex = 0\n\n const toRing = (ring: readonly Position[]): GeoRingRef => {\n const closed = ring.length > 0 && ring[0][0] === ring[ring.length - 1][0] && ring[0][1] === ring[ring.length - 1][1]\n const coordinates = closed ? ring : [...ring, ring[0]]\n const points = new Float64Array(coordinates.length * 2)\n coordinates.forEach(([lon, lat], i) => {\n points[i * 2] = lon\n points[i * 2 + 1] = lat\n })\n return { arc: { key: `define:${serial}:${code}:${arcIndex++}`, points, buckets: ringBuckets(points) }, reversed: false }\n }\n\n const measured: GeoPolygon[] = polygons.map((rings) => {\n const resolved = rings.map((ring) => [toRing(ring)])\n const ringAreas = rings.map((ring) => {\n const area = geoArea({ type: \"Polygon\", coordinates: [ring as [number, number][]] })\n return area > 2 * Math.PI ? 4 * Math.PI - area : area\n })\n const area = Math.max(0, ringAreas[0] - ringAreas.slice(1).reduce((a, b) => a + b, 0))\n return { rings: resolved, ringAreas, area, mainland: true }\n })\n\n const name = definition.name ?? feature?.properties?.name ?? code\n return {\n code,\n name,\n nameNl: name,\n parent: definition.parent ?? (code.includes(\"-\") ? code.slice(0, 2) : null),\n first: true,\n listed: false,\n remote: false,\n polygons: measured,\n }\n}\n\nclass GeoRegistry {\n private _sources: GeoSource[] = []\n private _defined = new Map<string, { serial: number; feature: GeoFeature }>()\n private _generation = 0\n private _serial = 0\n\n /** Bumps whenever a source or a definition is added or removed. */\n get generation(): number {\n return this._generation\n }\n\n get hasSources(): boolean {\n return this._sources.length > 0\n }\n\n /** Adds a source after every source already registered. Returns its removal. */\n use(source: GeoSource): () => void {\n this._sources.push(source)\n this._generation++\n return () => {\n const i = this._sources.indexOf(source)\n if (i < 0) return\n this._sources.splice(i, 1)\n this._generation++\n }\n }\n\n /**\n * Shapes (GeoJSON, lon/lat) under codes of your choosing, checked before any\n * source. A definition replaces generated data for the same code.\n */\n define(shapes: Record<string, GeoShape | GeoDefinition>): () => void {\n const serial = ++this._serial\n const codes = Object.entries(shapes).map(([rawCode, value]) => {\n const code = rawCode.trim().toUpperCase()\n const definition = \"shape\" in value ? value : { shape: value }\n this._defined.set(code, { serial, feature: definedFeature(code, definition, serial) })\n return code\n })\n this._generation++\n return () => {\n for (const code of codes) {\n if (this._defined.get(code)?.serial === serial) this._defined.delete(code)\n }\n this._generation++\n }\n }\n\n defined(code: string): GeoFeature | undefined {\n return this._defined.get(code)?.feature\n }\n\n /** Removes every source and definition — for tests. */\n reset(): void {\n this._sources = []\n this._defined.clear()\n this._generation++\n }\n\n /**\n * Asks each source in registration order; the first non-null answer wins.\n * Resolves `null` only when every source answered that it has no such file.\n */\n async resolve(key: string): Promise<GeoFileData | GeoIndex | null> {\n if (this._sources.length === 0) {\n throw new Error(\"No geo source registered — call geoRegistry.use(geoUrlSource(…)) before rendering GeoBorder\")\n }\n let failure: unknown = null\n for (const source of [...this._sources]) {\n try {\n const value = await source(key)\n if (value != null) return value as GeoFileData | GeoIndex\n } catch (error) {\n failure ??= error\n }\n }\n if (failure) throw failure\n return null\n }\n\n /** Every listed region's code, names and parent, for a picker. */\n async index(): Promise<GeoIndex | null> {\n return (await this.resolve(`${GEO_DATA_VERSION}/index`)) as GeoIndex | null\n }\n}\n\nexport const geoRegistry = new GeoRegistry()\n", "import type { LoaderFn } from \"@motionscript/sdk\"\n\nimport { decodeGeoFile, type DecodedGeoFile, type GeoFileData } from \"./format\"\nimport { GEO_DATA_VERSION, geoRegistry } from \"./registry\"\n\nexport type GeoFileEntry =\n | { status: \"ready\"; file: DecodedGeoFile }\n | { status: \"missing\" }\n | { status: \"failed\"; error: unknown }\n\nconst entries = new Map<string, GeoFileEntry>()\nconst inflight = new Map<string, Promise<GeoFileEntry>>()\nconst loaders = new Map<string, LoaderFn>()\nconst warned = new Set<string>()\nlet version = 0\n\nexport function countryFileKey(code: string): string {\n return `${GEO_DATA_VERSION}/countries/${code}`\n}\n\nexport function statesFileKey(country: string): string {\n return `${GEO_DATA_VERSION}/states/${country}`\n}\n\n/** Bumps whenever a file lands, so derived geometry keyed on it rebuilds. */\nexport function geoDataVersion(): number {\n return version\n}\n\nexport function geoFileEntry(key: string): GeoFileEntry | undefined {\n return entries.get(key)\n}\n\nasync function fetchEntry(key: string): Promise<GeoFileEntry> {\n try {\n let data = (await geoRegistry.resolve(key)) as GeoFileData | null\n // A country with no subdivisions has no states file; its outline stands in.\n if (data === null && key.includes(\"/states/\")) {\n data = (await geoRegistry.resolve(key.replace(\"/states/\", \"/countries/\"))) as GeoFileData | null\n }\n return data === null ? { status: \"missing\" } : { status: \"ready\", file: decodeGeoFile(data) }\n } catch (error) {\n return { status: \"failed\", error }\n }\n}\n\n/**\n * Loads one data file into the shared cache. Never rejects: a rejected loader\n * is retried on every tick and fails an export outright, where a recorded\n * failure draws nothing and is tried again by the next call.\n */\nexport function loadGeoFile(key: string): Promise<GeoFileEntry> {\n const current = entries.get(key)\n if (current?.status === \"ready\") return Promise.resolve(current)\n let job = inflight.get(key)\n if (!job) {\n job = fetchEntry(key).then((entry) => {\n inflight.delete(key)\n entries.set(key, entry)\n version++\n if (entry.status === \"ready\") {\n warned.delete(key)\n } else if (!warned.has(key)) {\n warned.add(key)\n if (entry.status === \"failed\") console.warn(`[GeoBorder] could not load ${key}:`, entry.error)\n else console.warn(`[GeoBorder] no geo source has ${key}`)\n }\n return entry\n })\n inflight.set(key, job)\n }\n return job\n}\n\n/**\n * The loader an `AssetScope` declares for a file: one function per key, so\n * every node that needs the file declares the same one. Nothing is disposed —\n * decoded data is shared by every engine in the process.\n */\nexport function geoLoader(key: string): LoaderFn {\n let load = loaders.get(key)\n if (!load) {\n load = async () => {\n await loadGeoFile(key)\n }\n loaders.set(key, load)\n }\n return load\n}\n\n/** Forgets every loaded file — for tests. */\nexport function clearGeoFiles(): void {\n entries.clear()\n inflight.clear()\n warned.clear()\n version++\n}\n", "import type { GeoFeature } from \"./format\"\nimport { countryFileKey, geoFileEntry, statesFileKey } from \"./loader\"\nimport { geoRegistry } from \"./registry\"\n\nexport type GeoLevel = \"country\" | \"state\"\nexport type GeoFrame = \"mainland\" | \"all\"\n\nconst CODE = /^[A-Z]{2}(-[A-Z0-9]{1,3})?$/\n\n/** `\"fr, de\"`, `[\"FR\", \"de\"]` → `[\"FR\", \"DE\"]`; unique, in order, empties dropped. */\nexport function normalizeIso(value: unknown): string[] {\n const raw = Array.isArray(value) ? value : typeof value === \"string\" ? value.split(/[\\s,;]+/) : []\n const out: string[] = []\n for (const item of raw) {\n if (typeof item !== \"string\") continue\n const code = item.trim().toUpperCase()\n if (code && !out.includes(code)) out.push(code)\n }\n return out\n}\n\nfunction isSubdivision(code: string): boolean {\n return code.includes(\"-\")\n}\n\n/** Every data file a selection reads, for `declareAssets`. Depends on nothing but its arguments. */\nexport function geoFilesFor(codes: readonly string[], level: GeoLevel): string[] {\n const files = new Set<string>()\n for (const code of codes) {\n if (!CODE.test(code) || geoRegistry.defined(code)) continue\n if (isSubdivision(code)) files.add(statesFileKey(code.slice(0, 2)))\n else files.add(level === \"state\" ? statesFileKey(code) : countryFileKey(code))\n }\n return [...files]\n}\n\nexport interface GeoSelection {\n features: GeoFeature[]\n /** A file this selection needs has not landed yet. */\n pending: boolean\n /** Codes whose file loaded without them. */\n unknown: string[]\n}\n\n/**\n * The features a selection draws. A bare country code at state level is its\n * first-level subdivisions — minus the remote ones when framing the mainland —\n * or the country itself when it has none.\n */\nexport function selectGeoFeatures(codes: readonly string[], level: GeoLevel, frame: GeoFrame): GeoSelection {\n const features: GeoFeature[] = []\n const seen = new Set<string>()\n const unknown: string[] = []\n let pending = false\n\n const add = (feature: GeoFeature) => {\n if (seen.has(feature.code)) return\n seen.add(feature.code)\n features.push(feature)\n }\n\n for (const code of codes) {\n const defined = geoRegistry.defined(code)\n if (defined) {\n add(defined)\n continue\n }\n if (!CODE.test(code)) {\n unknown.push(code)\n continue\n }\n const subdivision = isSubdivision(code)\n const key = subdivision || level === \"state\" ? statesFileKey(code.slice(0, 2)) : countryFileKey(code)\n const entry = geoFileEntry(key)\n if (!entry || entry.status !== \"ready\") {\n if (!entry) pending = true\n continue\n }\n const file = entry.file.features\n if (subdivision || level === \"country\") {\n const feature = file.get(code)\n if (feature) add(feature)\n else unknown.push(code)\n continue\n }\n const children = [...file.values()].filter(\n (f) => f.parent === code && f.first && !(frame === \"mainland\" && f.remote)\n )\n if (children.length > 0) children.forEach(add)\n else if (file.get(code)) add(file.get(code)!)\n else unknown.push(code)\n }\n\n return { features, pending, unknown }\n}\n", "/**\n * The halo around the planet's edge — a shell, seen from the inside.\n *\n * The trick is old and still the best one: draw a sphere slightly larger than\n * the planet, keep only its **back** faces, and light nothing. What survives is\n * the far wall of the shell, which the planet hides everywhere except around the\n * silhouette — so the brightness only has to be a function of how edge-on the\n * surface is, and the occlusion comes free from the depth buffer.\n *\n * That is why it is a shader rather than a material with a gradient: the value\n * needed is `1 - |n · v|`, which no material exposes, and which is *per pixel*.\n * A gradient painted onto a sphere is fixed to the geometry and slides as the\n * camera turns; this is anchored to the eye, so the rim stays on the horizon\n * wherever the globe is looked at from.\n *\n * Additively blended, because atmosphere adds light rather than covering\n * anything — which also means it never darkens the stars or the planet behind\n * it, and needs no sorting against them.\n */\n\nimport { Mat, type Material3D, type NormalizedColor } from \"@motionscript/sdk\"\n\n/**\n * The eye-facing rim term, and nothing else.\n *\n * `vView` is the fragment's direction to the camera in view space, where the eye\n * is the origin — so it needs no camera uniform, and the same shader works for\n * an orthographic camera where a `cameraPosition` version would not.\n */\nconst VERTEX = /* glsl */ `\nvarying vec3 vNormal;\nvarying vec3 vView;\n\nvoid main() {\n vec4 viewPosition = modelViewMatrix * vec4(position, 1.0);\n vNormal = normalize(normalMatrix * normal);\n vView = -viewPosition.xyz;\n gl_Position = projectionMatrix * viewPosition;\n}\n`\n\n/**\n * `abs` on the dot product, deliberately: these are back faces, so the normal\n * points away from the eye and the un-absolute term would be brightest face-on —\n * a disc over the planet instead of a ring around it.\n */\nconst FRAGMENT = /* glsl */ `\nuniform vec3 uColor;\nuniform float uFalloff;\nuniform float uIntensity;\n\nvarying vec3 vNormal;\nvarying vec3 vView;\n\nvoid main() {\n float facing = abs(dot(normalize(vNormal), normalize(vView)));\n float rim = pow(clamp(1.0 - facing, 0.0, 1.0), uFalloff) * uIntensity;\n gl_FragColor = vec4(uColor * rim, rim);\n}\n`\n\n/**\n * The atmosphere's material — including which faces it keeps and how it blends.\n *\n * Those two belong *on the descriptor* rather than in the mesh shorthand beside\n * it, and not as a matter of taste: `resolveMaterialShorthand3D` returns an\n * explicit `material` immediately and never reaches the shorthand's own `faces`\n * or `blend`. Set them out there and they are silently dropped — the shell keeps\n * its front faces, covers the planet in a bright disc, and the only clue is that\n * the globe has gone.\n *\n * `color` arrives as core's resolved `[r, g, b, a]` and is handed on as three\n * numbers rather than four: the uniform coercion reads a numeric array of length\n * four as a `vec4`, never as a colour, so passing the tuple whole would bind\n * alpha where the shader expects nothing and shift the hue. Alpha has nothing to\n * say here anyway — the rim term is the opacity.\n */\nexport function atmosphereMaterial(\n color: NormalizedColor,\n falloff: number,\n intensity: number\n): Material3D {\n return Mat.shader({\n vertex: VERTEX,\n fragment: FRAGMENT,\n uniforms: {\n uColor: [color[0], color[1], color[2]],\n uFalloff: falloff,\n uIntensity: intensity,\n },\n faces: \"back\",\n blend: \"additive\",\n transparent: true,\n // Nothing here writes depth: the shell is a light, and one that occluded\n // would hide the planet it is drawn around.\n depthWrite: false,\n })\n}\n", "// Generated by scripts/vendor-natural-earth.mjs — do not edit.\n//\n// Natural Earth 1:110m Admin 0 – Countries, v5.1.2. Public domain.\n// See CREDITS.md beside this file.\n//\n// 177 countries, 289 rings, 10360 points, 1/1000° quantum.\n// source sha256 6866c877d39cba9c357620878839b336d569f8c662d3cfab4cb1dbe2d39c977f\n\n/** One country's identity and the shape of its rings. */\nexport interface CountryRow {\n /** Three-letter code, `ADM0_A3`. Stable across releases; not always ISO. */\n id: string\n /** English name, as Natural Earth spells it. */\n name: string\n /**\n * Point counts for this country's rings, in the order they appear in\n * {@link POINTS}. **Negative marks a hole** — see the decoder.\n */\n rings: number[]\n}\n\n/** Degrees per encoded unit, as a divisor. */\nexport const PRECISION = 1000\n\n/** Every country, sorted by {@link CountryRow.id}. */\nexport const COUNTRIES: readonly CountryRow[] = [\n { id: \"AFG\", name: \"Afghanistan\", rings: [68] },\n { id: \"AGO\", name: \"Angola\", rings: [8, 65] },\n { id: \"ALB\", name: \"Albania\", rings: [23] },\n { id: \"ARE\", name: \"United Arab Emirates\", rings: [21] },\n { id: \"ARG\", name: \"Argentina\", rings: [10, 109] },\n { id: \"ARM\", name: \"Armenia\", rings: [19] },\n { id: \"ATA\", name: \"Antarctica\", rings: [21, 12, 25, 12, 9, 7, 10, 555] },\n { id: \"ATF\", name: \"Fr. S. Antarctic Lands\", rings: [8] },\n { id: \"AUS\", name: \"Australia\", rings: [16, 223] },\n { id: \"AUT\", name: \"Austria\", rings: [36] },\n { id: \"AZE\", name: \"Azerbaijan\", rings: [34, 8] },\n { id: \"BDI\", name: \"Burundi\", rings: [12] },\n { id: \"BEL\", name: \"Belgium\", rings: [16] },\n { id: \"BEN\", name: \"Benin\", rings: [24] },\n { id: \"BFA\", name: \"Burkina Faso\", rings: [38] },\n { id: \"BGD\", name: \"Bangladesh\", rings: [35] },\n { id: \"BGR\", name: \"Bulgaria\", rings: [27] },\n { id: \"BHS\", name: \"Bahamas\", rings: [5, 6, 7] },\n { id: \"BIH\", name: \"Bosnia and Herz.\", rings: [22] },\n { id: \"BLR\", name: \"Belarus\", rings: [44] },\n { id: \"BLZ\", name: \"Belize\", rings: [19] },\n { id: \"BOL\", name: \"Bolivia\", rings: [59] },\n { id: \"BRA\", name: \"Brazil\", rings: [202] },\n { id: \"BRN\", name: \"Brunei\", rings: [7] },\n { id: \"BTN\", name: \"Bhutan\", rings: [12] },\n { id: \"BWA\", name: \"Botswana\", rings: [39] },\n { id: \"CAF\", name: \"Central African Rep.\", rings: [61] },\n { id: \"CAN\", name: \"Canada\", rings: [273, 6, 10, 7, 7, 6, 8, 27, 6, 6, 32, 19, 72, 10, 11, 10, 10, 15, 16, 21, 44, 14, 5, 12, 20, 64, 8, 10, 7, 8] },\n { id: \"CHE\", name: \"Switzerland\", rings: [23] },\n { id: \"CHL\", name: \"Chile\", rings: [19, 93] },\n { id: \"CHN\", name: \"China\", rings: [9, 229] },\n { id: \"CIV\", name: \"Côte d'Ivoire\", rings: [45] },\n { id: \"CMR\", name: \"Cameroon\", rings: [60] },\n { id: \"COD\", name: \"Dem. Rep. Congo\", rings: [123] },\n { id: \"COG\", name: \"Congo\", rings: [48] },\n { id: \"COL\", name: \"Colombia\", rings: [99] },\n { id: \"CRI\", name: \"Costa Rica\", rings: [35] },\n { id: \"CUB\", name: \"Cuba\", rings: [41] },\n { id: \"CYN\", name: \"N. Cyprus\", rings: [15] },\n { id: \"CYP\", name: \"Cyprus\", rings: [14] },\n { id: \"CZE\", name: \"Czechia\", rings: [34] },\n { id: \"DEU\", name: \"Germany\", rings: [57] },\n { id: \"DJI\", name: \"Djibouti\", rings: [14] },\n { id: \"DNK\", name: \"Denmark\", rings: [17, 5] },\n { id: \"DOM\", name: \"Dominican Rep.\", rings: [25] },\n { id: \"DZA\", name: \"Algeria\", rings: [61] },\n { id: \"ECU\", name: \"Ecuador\", rings: [32] },\n { id: \"EGY\", name: \"Egypt\", rings: [43] },\n { id: \"ERI\", name: \"Eritrea\", rings: [27] },\n { id: \"ESP\", name: \"Spain\", rings: [50] },\n { id: \"EST\", name: \"Estonia\", rings: [18] },\n { id: \"ETH\", name: \"Ethiopia\", rings: [58] },\n { id: \"FIN\", name: \"Finland\", rings: [39] },\n { id: \"FJI\", name: \"Fiji\", rings: [7, 8, 4] },\n { id: \"FLK\", name: \"Falkland Is.\", rings: [9] },\n { id: \"FRA\", name: \"France\", rings: [18, 47, 6] },\n { id: \"GAB\", name: \"Gabon\", rings: [30] },\n { id: \"GBR\", name: \"United Kingdom\", rings: [7, 47] },\n { id: \"GEO\", name: \"Georgia\", rings: [23] },\n { id: \"GHA\", name: \"Ghana\", rings: [24] },\n { id: \"GIN\", name: \"Guinea\", rings: [69] },\n { id: \"GMB\", name: \"Gambia\", rings: [15] },\n { id: \"GNB\", name: \"Guinea-Bissau\", rings: [18] },\n { id: \"GNQ\", name: \"Eq. Guinea\", rings: [6] },\n { id: \"GRC\", name: \"Greece\", rings: [10, 42] },\n { id: \"GRL\", name: \"Greenland\", rings: [131] },\n { id: \"GTM\", name: \"Guatemala\", rings: [34] },\n { id: \"GUY\", name: \"Guyana\", rings: [39] },\n { id: \"HND\", name: \"Honduras\", rings: [56] },\n { id: \"HRV\", name: \"Croatia\", rings: [42] },\n { id: \"HTI\", name: \"Haiti\", rings: [20] },\n { id: \"HUN\", name: \"Hungary\", rings: [31] },\n { id: \"IDN\", name: \"Indonesia\", rings: [37, 8, 6, 38, 8, 5, 12, 44, 6, 8, 9, 22, 34] },\n { id: \"IND\", name: \"India\", rings: [135] },\n { id: \"IRL\", name: \"Ireland\", rings: [12] },\n { id: \"IRN\", name: \"Iran\", rings: [75] },\n { id: \"IRQ\", name: \"Iraq\", rings: [29] },\n { id: \"ISL\", name: \"Iceland\", rings: [19] },\n { id: \"ISR\", name: \"Israel\", rings: [25] },\n { id: \"ITA\", name: \"Italy\", rings: [65, 10, 9] },\n { id: \"JAM\", name: \"Jamaica\", rings: [10] },\n { id: \"JOR\", name: \"Jordan\", rings: [18] },\n { id: \"JPN\", name: \"Japan\", rings: [36, 15, 11] },\n { id: \"KAZ\", name: \"Kazakhstan\", rings: [111] },\n { id: \"KEN\", name: \"Kenya\", rings: [36] },\n { id: \"KGZ\", name: \"Kyrgyzstan\", rings: [34] },\n { id: \"KHM\", name: \"Cambodia\", rings: [16] },\n { id: \"KOR\", name: \"South Korea\", rings: [18] },\n { id: \"KOS\", name: \"Kosovo\", rings: [20] },\n { id: \"KWT\", name: \"Kuwait\", rings: [8] },\n { id: \"LAO\", name: \"Laos\", rings: [36] },\n { id: \"LBN\", name: \"Lebanon\", rings: [10] },\n { id: \"LBR\", name: \"Liberia\", rings: [26] },\n { id: \"LBY\", name: \"Libya\", rings: [55] },\n { id: \"LKA\", name: \"Sri Lanka\", rings: [9] },\n { id: \"LSO\", name: \"Lesotho\", rings: [11] },\n { id: \"LTU\", name: \"Lithuania\", rings: [18] },\n { id: \"LUX\", name: \"Luxembourg\", rings: [6] },\n { id: \"LVA\", name: \"Latvia\", rings: [21] },\n { id: \"MAR\", name: \"Morocco\", rings: [62] },\n { id: \"MDA\", name: \"Moldova\", rings: [26] },\n { id: \"MDG\", name: \"Madagascar\", rings: [48] },\n { id: \"MEX\", name: \"Mexico\", rings: [169] },\n { id: \"MKD\", name: \"North Macedonia\", rings: [17] },\n { id: \"MLI\", name: \"Mali\", rings: [75] },\n { id: \"MMR\", name: \"Myanmar\", rings: [69] },\n { id: \"MNE\", name: \"Montenegro\", rings: [17] },\n { id: \"MNG\", name: \"Mongolia\", rings: [74] },\n { id: \"MOZ\", name: \"Mozambique\", rings: [78] },\n { id: \"MRT\", name: \"Mauritania\", rings: [38] },\n { id: \"MWI\", name: \"Malawi\", rings: [27] },\n { id: \"MYS\", name: \"Malaysia\", rings: [24, 36] },\n { id: \"NAM\", name: \"Namibia\", rings: [43] },\n { id: \"NCL\", name: \"New Caledonia\", rings: [12] },\n { id: \"NER\", name: \"Niger\", rings: [57] },\n { id: \"NGA\", name: \"Nigeria\", rings: [57] },\n { id: \"NIC\", name: \"Nicaragua\", rings: [51] },\n { id: \"NLD\", name: \"Netherlands\", rings: [14] },\n { id: \"NOR\", name: \"Norway\", rings: [17, 49, 11, 7] },\n { id: \"NPL\", name: \"Nepal\", rings: [22] },\n { id: \"NZL\", name: \"New Zealand\", rings: [35, 29] },\n { id: \"OMN\", name: \"Oman\", rings: [40, 5] },\n { id: \"PAK\", name: \"Pakistan\", rings: [65] },\n { id: \"PAN\", name: \"Panama\", rings: [51] },\n { id: \"PER\", name: \"Peru\", rings: [75] },\n { id: \"PHL\", name: \"Philippines\", rings: [5, 11, 26, 8, 32, 8, 13] },\n { id: \"PNG\", name: \"Papua New Guinea\", rings: [33, 13, 21, 10] },\n { id: \"POL\", name: \"Poland\", rings: [44] },\n { id: \"PRI\", name: \"Puerto Rico\", rings: [8] },\n { id: \"PRK\", name: \"North Korea\", rings: [3, 43] },\n { id: \"PRT\", name: \"Portugal\", rings: [32] },\n { id: \"PRY\", name: \"Paraguay\", rings: [32] },\n { id: \"PSX\", name: \"Palestine\", rings: [8] },\n { id: \"QAT\", name: \"Qatar\", rings: [8] },\n { id: \"ROU\", name: \"Romania\", rings: [43] },\n { id: \"RUS\", name: \"Russia\", rings: [4, 455, 10, 6, 8, 6, 7, 14, 8, 25, 21, 23, 7, 17] },\n { id: \"RWA\", name: \"Rwanda\", rings: [13] },\n { id: \"SAH\", name: \"W. Sahara\", rings: [27] },\n { id: \"SAU\", name: \"Saudi Arabia\", rings: [75] },\n { id: \"SDN\", name: \"Sudan\", rings: [80] },\n { id: \"SDS\", name: \"S. Sudan\", rings: [62] },\n { id: \"SEN\", name: \"Senegal\", rings: [43] },\n { id: \"SLB\", name: \"Solomon Is.\", rings: [5, 6, 7, 8, 6] },\n { id: \"SLE\", name: \"Sierra Leone\", rings: [21] },\n { id: \"SLV\", name: \"El Salvador\", rings: [19] },\n { id: \"SOL\", name: \"Somaliland\", rings: [24] },\n { id: \"SOM\", name: \"Somalia\", rings: [35] },\n { id: \"SRB\", name: \"Serbia\", rings: [47] },\n { id: \"SUR\", name: \"Suriname\", rings: [25] },\n { id: \"SVK\", name: \"Slovakia\", rings: [32] },\n { id: \"SVN\", name: \"Slovenia\", rings: [17] },\n { id: \"SWE\", name: \"Sweden\", rings: [39] },\n { id: \"SWZ\", name: \"eSwatini\", rings: [10] },\n { id: \"SYR\", name: \"Syria\", rings: [26] },\n { id: \"TCD\", name: \"Chad\", rings: [57] },\n { id: \"TGO\", name: \"Togo\", rings: [18] },\n { id: \"THA\", name: \"Thailand\", rings: [63] },\n { id: \"TJK\", name: \"Tajikistan\", rings: [40] },\n { id: \"TKM\", name: \"Turkmenistan\", rings: [53] },\n { id: \"TLS\", name: \"Timor-Leste\", rings: [10] },\n { id: \"TTO\", name: \"Trinidad and Tobago\", rings: [7] },\n { id: \"TUN\", name: \"Tunisia\", rings: [30] },\n { id: \"TUR\", name: \"Turkey\", rings: [53, 13] },\n { id: \"TWN\", name: \"Taiwan\", rings: [8] },\n { id: \"TZA\", name: \"Tanzania\", rings: [51] },\n { id: \"UGA\", name: \"Uganda\", rings: [27] },\n { id: \"UKR\", name: \"Ukraine\", rings: [92] },\n { id: \"URY\", name: \"Uruguay\", rings: [20] },\n { id: \"USA\", name: \"United States of America\", rings: [232, 16, 8, 4, 8, 6, 6, 8, 137, 11] },\n { id: \"UZB\", name: \"Uzbekistan\", rings: [53] },\n { id: \"VEN\", name: \"Venezuela\", rings: [91] },\n { id: \"VNM\", name: \"Vietnam\", rings: [43] },\n { id: \"VUT\", name: \"Vanuatu\", rings: [4, 6] },\n { id: \"YEM\", name: \"Yemen\", rings: [43] },\n { id: \"ZAF\", name: \"South Africa\", rings: [81, -11] },\n { id: \"ZMB\", name: \"Zambia\", rings: [60] },\n { id: \"ZWE\", name: \"Zimbabwe\", rings: [36] },\n]\n\n/**\n * Every ring's points, zig-zagged varints in printable ASCII, longitude then\n * latitude, delta-encoded from each ring's own first point.\n *\n * Decoded by `decodeWorld()` in `../impl/world.ts`, which is the only thing\n * that should ever read it.\n */\nexport const POINTS =\n \"m|`Ce~gAya@Lcn@dLcRrFel@aSaT`KeSs[kd@h@sHeHqEeX}YwTy`@dMxEbR}Q|AxDns@wWnSwTcLwZgE}e@}Zaj@pCm_ABcJ|Pjc@~Ev^pJvfAfFbbAbLnc@fZyMlYcFb^b^fYsA~VdPnUlz@}@qWhh@xf@zNnYtd@mBpd@lWpPbVyDvn@bGzEnPnm@Cza@jb@dAdt@dpA~Xpj@oDrKtLjd@}Fn}@hHvgB{^uw@uw@bDgg@hn@oIzCuf@nS{p@wYga@fZeHePol@oX{lAw~@tVcn@iGaLi[ip@mHeb@_RoK_q@us@aKyHgUm\\\\tOgkXxiHvUbLfI`O|@fZ|NrEtO_n@gX_Z{QoIcaWf|JyXkGcQb@}ToFmwDXkNrm@}Pld@kMfS}Vt_@ih@aDsSyGqa@xGkHsNuNmc@we@mAkByI{^GlDpUyjAQc@hf@uKbWdHtd@qCle@{SdVjBjiAoNwDcZp@we@kHm[tBsEjRbFh]_Jh\\\\hHlViDpTbaCYzAzeEci@br@yg@`f@zqBnXhvC{Ghj@}\\\\h|FtAlHjChd@g[ng@{@ld@tI`]zJzDif@uG}u@qTgx@gByYgSiw@{MsX}b@{g@aSyZqEim@hBmb@tQiUrO}d@jNod@kB_LeRwW|Qk{@xK{h@h^qf@w`h@uwnAf@lOhS`HvBhS`\\\\h]rIkCf@wLra@_TlDw\\\\iDui@oGkRnI{H??fC{RcZw]_CvJyOqDiLxO}MjEeCtU??|FfT{GxYwvcBijn@aJaBiAbP}o@yHur@r@wd@x@yi@gi@sm@ag@of@oe@{JfToGjp@|^FbDtg@aJtGf[hKDpXfQzXr@dXpKdLzzDo^|Vi~@r`eCvxeB_W~[g^zm@gpAnd@ovArNb[f^jz@bBz^aUrd@u@|aAAppoBn_z@rN`q@tOf_AQf}@pLzLxCjg@fCr_@inApt@nG`j@af@fZdBp]`{@boAt{An`@h|B~KtcAgEcLfd@xKxm@qJn^nd@~T~~@rGb{@wUbWhOuGb}@gi@xQea@uRsQl_@px@lRdq@xe@dHz}@vMn`@`z@D~o@~^|Pzm@o|@vl@wz@rKnT`w@xhAfb@rg@hhA`x@rWrXh\\\\eSz_Ash@dc@jYeBzx@wH`vCkGzXmc@e@ym@rh@~B~TsUlDiaA}n@mZyRuf@fFq^c`@kt@yUwqAtEuc@gZ{JtEoV~[qKsSeYd[uVrMcgAcXwKpIekAuM__AuOwv@md@uU~Q_|@Dmx@in@yg@l@es@ub@_|@Cox@dOmJx[{jBoe@i_A|Do{@kUyw@}g@sy@ak@{e@tQoWaLcS~@cgBccA{]mT}_ArFsNcs@ow@wpAfNwc@bl@kWgq@ifApAaIjL{qB~dBcr@nHkkAbm@k_AlW}GrZn|@~}A_~@~OeeAnHmp@_Iuw@{n@gIev@}]}Jk^`c@h@zp@rs@na@|h@lXpeAt{@syyAevjArUz@pXec@IsHrZBnQwO~Kt@rWgQnm@qNaEk]rI_UyuAwH}KlOyVxIpKrNi`@nTrPzRqY~O_[fIh`~A|lwC{^?_|AoLg}AnLclA|Y}Y~d@kF|YmAx^v_BrRpdBzNntBtM~aCfKbsCsB~pAyS_JwXmdCcP{t@yScf@_Ze[gV}d@_Ukg@wXbn`C~v{CwkClAueCbEom@wXa`@_U{_AtXjQz^jQb[|aCqGpjCtBjmAyS?mAvjoChejC??{i@iFegAlAkQ{^uBgVf@eq@ob@m\\\\qx@wHa`@fVuMfV{Yd[yS|YePd[iFb[~InWbPhVlhApGxdAfK~pAg@s]oWnhApGvdArGvn@kQtBwXtzfEjlkCef@_JqnApGqyAzCqcArGqcAkFwc@nb@~o@{CzjAlAblAmAlsAtBt~@gKznnFrznC??oLySsiA~IyoAxHuiAaJnb@`Uvy@|N|uA}CdrwFjnnC??il@oLk}@tMo~AnWtc@mAxoAcE`w~HfoxC}d@iVisBxHm}@rRwn@~TcPd[~vBpG~pAaUtc@_UnAuB_q~IpmdD?liI~b~T??miIsBNev@kc@soBrRgFeA_aA}RsGTiFNmyA~XcnA_YgMqBsvD_Jmz@pMk\\\\lFg}AxSopD|NwkCrRepFtM}rDcPshGfKquCpRgdDkQylDcPoLm\\\\`uFmA~hEuMrs@oWtfDmL_Je[gVuXgViVfKuX~fBePvn@_Ut_BsRwvCtBmoCyHsyAxSknBkQyeBgVeq@yS~TwXxoAcPxzAkQn_CuBroBqGdxBcElg@gVvoAsR~o@_UpRafAs]bEgw@rR{eBcEcbBqGmr@|YcbBcEgrAoLkmAcP_fAySg}AcEnAiV~TgVkQaUwoA_Jwc@xSo~AgKegA}NkxAe@msAcEosAuMibAoL{jAmL_p@rByi@|Ca|AqGgrA~IutAg@_qAqGmsAbEa|AbE}uAmAqyAf@_|Ad@utAmAu~@kQ{jAyHkmAnLsiA_JkbAaUkg@pRaU`Ukg@xS{_AkQuiAhVmsAhFggAbPcwAsBqnAaJg}AlAmsArGutA~Ia`@}Yjg@ySr]aUvoA{Cnb@iVnLgV~Tom@wn@pG_qArBwoAsBohAvHs~@jQ}Y`UmsAtByoAqGutAgKclAkFs~@tMgrA{C{t@wn@eq@b[ggA`JimAcEmr@nW_qAlA{jAhFuiAnL_p@gVmWaUm}@nWutAcEu~@lLyi@zSgrAcE{_AoLs~@}N}jAqGcwAiFqnAsGe|@mLwc@sRuM}YjFuXpRoW~ToWrRoWzNaUtBoWcEmWk\\\\iVoWuXwHoWfK}YhFoWq]e[ia@kQkg@gV{i@sReq@iQmW_Zia@cPef@}N}z@sBef@sRak@gKmr@iFgl@}Nob@sR_p@iFuc@zNfVzSr~@hQ|YnLnm@yHlr@bExi@tMhl@|Nr]jQpGnWuBfVk\\\\xSzi@vMvy@zCfa@xSvc@pRbf@~YxHfV_UtXa`@rRmr@tMwn@rRuXlWmLhVkQnWk\\\\xSkQfVqGpx@kQfV{CnWsRnWpG``@ha@vXtc@xSfrApGd[`U|d@xSf}AfVfrAxHhmAlLnsAnLdq@tXjcBnAdmBoAbbB|CfhB?qRnWo~A~IwdAbPef@`UxdArRtjBcEjxAzNtBvXlAnWmhAxSoLfVqnAhVecCvHsoBdPkxApRypBrRozCvH_xCdPoiBjQisBxSe|@j\\\\s]fV{jA_UyeBkQ}kBsRw`C{NmnBePmzCe@_xCpGc}BtMkg@}Y}uAkQ{|Cg@szBmLqtBoLw`CqGiiC_Ju_B}N`k@aU|Y_U?iVdxBlAn_CxHlyB?bPgVqGqm@c[mLkxAuMihBwM{jAiQ{jAkQiw@oWutAaJosAqGyi@{Cu_BmAyzAsGclAgK}jAuMocAuM}uAqRav@ySyy@kQiQoW`aAuM_UwXsh@qR{_AgKqcAwMs~@qR_p@oWs]k\\\\gl@ePuiAtBs]xSsiAnAoAiVy^oWibAbE}NhVsiArByoA_JkmAkF_fAtB{YvXqcAySu~@aJ_fAqGwdAqGu~@uMwdAyH{t@mL}d@aUom@|N{_AsGil@l\\\\ob@~T_fAgKc[mWu~@eP_qAtBoWfVkr@gVkbAkFmhAmAaaAf@ydAhFibAtBk\\\\xSkg@jQqcA_JmhAmA_fA?ydAg@m}@qGaaAkFcv@cPwy@_Js~@cEwn@ePga@ga@ob@yS{_AvHoW`U{t@tM{_A{Cak@~Tom@|Nu~@uM_U}Yiw@_J{_AySg|@sGmhAgK}o@mLmr@uM}o@oLwy@jFiw@aUmg@cPwy@d@kr@uMgKaUus@cPkr@gKm}@yHqx@{Cav@tBwy@bEeq@bPcE|Yav@xS_e@dPsiAhFsh@dPmr@bP}z@tBeq@gK{t@wXwy@nLg|@hFwy@jFe|@zCm}@?mr@|_AnA|NhFb[~z@|N|o@fVqGnWwdAe@pGlWx^hVj\\\\tXwn@rRegAbEggAaJga@mWySiVia@qRcf@kQ}NaUa`@s]ef@cE_fAmAk}@kFu~@wHs]oWiQiV{i@gVe|@{Nss@gKia@{Sob@_Jgl@yHm}@bEiw@cEg|@iFocArBil@cPy^sh@gVbPk\\\\l\\\\us@dK}z@|C_{@kFu~@|Cwy@d@cf@cEus@tBun@nLiw@qGkbA?ox@sG{_ArGsh@{Sy^yS{i@cPimAqm@mg@pGwn@dPqh@`UsnA|d@e|@f@ox@?kbAkFibAqGkr@cP{i@kQwdAoAqm@mL}o@fKy^pRak@rRqcAmA{i@zNsiA|NkmAbE{_A{C}o@sRsh@qRiw@}Ciw@pG{_AbEwy@wHiw@?cv@bEox@bEiw@aJibAwHu~@oA_fA?ox@cEiw@{CePs]mAuXcf@bPaJd[yStXuXxSss@`J_fAuB_qAg@iw@uBaqA?wy@e@_qAlAwdAzCck@rRfKfVkg@jQibAtMydA|NwoA~IosAxHs~@xH_fAf@mg@{Sav@dPwn@pRav@tM}jAbEegAjFs]nW_fAtMun@`UydAvHegAe@kbAtBsiAg@uiAzCydApG{_AvM{_AfKak@jQjFlW``@`Ub[d[`U`Uj\\\\tX~pAxHvc@~TvoAnLd[nWxi@fVhl@rRtXtX|NhVbEb[g@hVob@lWmLhVk\\\\`UisBpGoW|YroBvHn~AnLvuBlArs@nb@~Il\\\\|YfV``@fVgrAzSy^tX{t@fV{jAxS}uArRg}ApRgnCrRy^r]}rDlLaKxCum@nQskD}NenCrRmseC`~}Aig@tRaz@xFeAzJnPl[|~A`Cp@i`@gHwXqm_HnunAod@dCmCdiAlTpTlEhq@xTcPlj@pj@|KkBle@}@ne@ot@pGgh@`c@mu@s@u[{g@pDk{@pTaa@qGikuFn|}@faA`_@du@jM`Kx_@`VjX`t@n@ff@pDfv@kJ|k@xEzi@zAdd@h`@fQyAh^tP`]zRpl@oA|h@?haA}f@p`@yJk@{b@_^oGsIeMfAoUuFmj@~Ead@``@c~@fIub@uAsb@zWug@r@kQrZ{WxF}o@vb@op@rGsYmZ~Y`T_y@_^bQoQdW`@__@|]ep@~DuRlMuQwEec@yKkNoGg^rEqc@yX}k@uCpn@mY}i@wq@}Sm]sYyn@}Uk[{CgPtFgp@iV{d@}EoHuLoOuDqa@n@u`AiQ_a@wZ}Nm`@uc@u^yA}Ws@_a@wj@ct@iY~t@qYoKfUo\\\\sRk]qZpLsFqn@ca@w]aNuWm^sI_@mPmZfFc@uNoZ}Ge]mGem@t[ua@~c@cf@Luf@zDdLia@}\\\\cq@c[kOtHqNcZwb@yd@_U__@jFos@wJb@}^vl@qSg`@aHmh@lNe`@tXss@|N{PiEue@fRqc@}PmVlDsM_Kw[|]tOl`@vVfXlTbAgF|WjQf^dUt]mCtPup@na@co@`Se_@nTel@`d@sPAw_@~NoHhRsz@dTgh@kTgKq`@uKuZwFga@_Rwp@tGg]qCeQfFwb@eGan@_KuKvH{ScNe`@yJia@s@yPeVmVsPp]kCff@qNpFuAfYuUv^uCjb@dAvUoU~o@cg@qVuSlY_]lWlEtZiLrt@oHd^wNrF}Olt@~Dj_@eSji@wbAt_@ek@t\\\\{h@dZdGbNwb@ff@iWrbA}WwLkX`ZgNsHyIfaAik@je@a\\\\zVyo@rq@qPdq@s@rb@hCte@w\\\\bt@pBhv@xI|[zOvv@i@zb@jKvk@rZzw@hm@t]xUlo@xSz]pQ|t@bWd^xNvm@`G`j@eBvRxb@vT|dAfAtx@rXv[fWvd@xYvr@sZhe@aJuHq_@ba@xJvu@fl@`u@}Olb@{Htb@mCn{@cQlg@oe@pJmn@pMs^t]iXb{@qFoSi]`Nkm@p]fj@rv@nJu_@sa@oHac@cWs]~Cgm@xq@ht@`f@jT|Vtp@xo@uX}@e`@bf@il@|_@mVwJmMdoA{d@|j@w@b{@m]znBzD|oAjUbfAzSgd`@u~|AvCnXdb@BaKpLvSfg@zJnItu@p@p^dMrr@yCjxAeO|LuTv|@xIfF|Jzd@}G|^u@f[kJqHiNlAaJ{QmBs^jP}GoOav@rAuk@eJ_]|@oRvKyDsIzGug@mU}FaUy[mm@bScb@qX_UuCqo@`Ri\\\\gBy[xJ~C|FisyAiwpAqPbA}i@|d@uZhCuI}Nid@eX{_@|_@y^hk@c\\\\|AgRxOnr@`DzIpo@vIzTzUrMs@|]pNbB|e@w_@qT}]nQiQlVrCthA`m@l@ij@~ZgIpY_PsP{Rh`@oTqKsNxVyI|KmOiNeIsm@|Pu`@vBoGkFx]y`@_cyAitjAzi@iGp^{[|HqV_Lu@oQvOsZCHrHkoz@zuCsBrWmLbMQhSjNbLjWp_@rUrUzX~A~BkjAtNm[}d@|CcRsb@y_KgfbBbFfi@hOjAvE`b@tu@o[`_@zCrj@o\\\\`\\\\aX`\\\\a@~G_Uaq@iK????wl@|C}x@_Lqf@jZggDefKtr@hFjNcj@yAqnCpK{KjAs]tT}TbRmQ_G{_@mTcFwKiZq]yDsLuQ_TiQmUEsn@~b@lAvSaM`d@hKdXqExOh]te@fRbRvJlf@q@vf@vpIegSdCgc@aPoYl@eTsp@yr@eHyi@cPgNe]jGeYuKoGaOoo@_[}JqRmy@}Xka@{GsN~Jag@I|Ch]kGl[eb@xg@}@f]agAdMl@xi@rLtQp]xDvKhZlTbFvu@k@|[}CdS`IpZqCpkB|An@nb@qG`n@xi@cOf\\\\jAzTtNb[eL|IuSa_tDq`j@h@xk@xTmHcCfq@zPq_@rB{^zJa]bYkc@px@oAuDvXrRxa@rYuK`HjJtPyEdWsDvHmr@rT_n@sIud@ne@wO{LwUcf@iVbl@a`@aUmi@op@`Zy\\\\`BqDlj@mz@pG_y@[_c@rIx[|s@|ZpBhRpb@ea@l_@gI}f@gPEagk@ukuA_QtXeWqCao@vHwzAhB_^}NqhAqMol@vUwc@pEl_@zXxUtk@eStb@xt@kGt~@rRTb^xw@|D~j@{T`q@dPfm@y@lCih@f^aSgIyGvEmFoI}RyVoRj]_ZrDyUfgyCkis@k\\\\_Dgh@z@{@fObcA~Hz|vC_ys@kp@b[xIlk@lJ_G_@u_@~ZuW|uwCsfp@yQnA{Tzr@Ifc@hNbBzN_c@jVcQ_gc@shrAhv@uVrVaYxV{Lv[iVnLkRr]g\\\\aL}XmUjMqL_Le\\\\k@wt@jIej@[g[zL??uUErNnZc]`WbHj\\\\tMvAtJtDjSpMa`v@qulBy`AtN{GnNw_@mFc|@zMcEh\\\\jLzOcf@|g@mXjJvBhJei@~I_QtOhWrLlq@cA`KxDuMvSkN~f@??rt@vBhRtL~Bl^zW_Ejw@~AjOsMlVzInV_Hfp@g@vdA_Nb~@}Clo@l@fa@|Oz\\\\lAd@{ZhR}[od@wKK}WhPwVvAsZm{@JybAoVoMib@gr@_SzD_[_e@oIlbmD_xa@NeHqF}AkJlFkUwd@{JYGdHyJF^~ObI`ZmDtHpEhU}B~DdFp^hKrOfJ|@lKtTrQ?{CqeArxfCnkTom@fDe_@i@}L}Qsu@iX}_@oVypAqItExm@uF`W~Czh@{bA~v@_eAhIqWjVgi@jK{XbQif@Sic@pQwAbc@eKfQY|YfQ`@aWvgAyvBrAdH`c@uEtWca@nPyMze@bJfp@bPjZ_Erb@nR|K`@iRfy@}^`y@[zkBdQ~\\\\~u@p@r`@rWxiA`IkLhfAqAjWfq@vc@cl@vpAgNbs@nw@`l@pGnWeuAp`@aeAuRo{@x_@mYhGcl@r]oi@kf@mbAzYqs@kM_TfJeVmWe^g@et@aB}j@mLeTzfgBn}`AhPkb@qZs\\\\bc@qi@~o@oa@j_Aag@dVx@t}@io@pg@rEkrAetAqeAu{@}h@mXss@oa@i@{p@j^ac@|]|JgKac@oG}c@?ka@nUiJlV`IhVwAhFaWxDgx@tJuQdi@}OpXfK|`A_KcCysAlQwa@oR}K~Dsb@cPkZcJgp@xM{e@ba@oPtEuWeHac@xvBsA`WwgAgQa@X}YdKgQvAcc@hc@qQhf@RzXcQfi@kKpWkV~dAiIzbA_w@_D{h@tFaWuEym@xpApI|_@nVru@hX|L|Qd_@h@nm@gDfb@vIl[eFeC}}Afr@xc@dv@q@rVk`@nh@sBgLyYva@ae@~Xgw@oOmJ@kYwd@aQfEy`@}NwTqCc\\\\ofAqi@er@_KkGmHiw@|Ac[kjDo@aZxHyb@vZyUIkl@gb@iIoKlEaA}Vrc@mEVcf@wxBl@uSqTkPxReKzc@yJuFka@``@so@aCaKcRom@sMwXgIgFmYsk@yPjBcL|s@kDtGkf@qA{h@~ZeOuJwDim@|Fup@rN_QwM_l@uH{dAkV{U{VhGsPo_@wAqMjMbGlZoTlHiM`\\\\hP`U~Hdt@_Op^qC|[me@h\\\\u]bB}EgKwRuAg[_JiSsOqa@hDgNgA}`@bDsDwKlImKgEaQeXnDo\\\\kEyb@fLiZzKiR}O_MrAqGrP{\\\\oC_WwVeR_m@}c@ex@iT}AmNpa@ab@flBm`@jIu@bj@~m@lr@mRxQmmBxHiAt}@mn@_h@smAlUyfBde@o]rc@fIpa@ugAgRsxB``@k|AmAm{Avr@ynA~dAco@~Pmt@pAuUtReTpnAkIxd@zWhfBx^xg@bwA~uAxf@reAfm@du@rNf@lP|l@mCbtBlPh_BrEfh@xRrW`JprAj~@rpArIn_Apq@bZrMld@|bAChaB~V~j@xZ~dAfQphAvp@zs@~|@bHtm@kIna@tJb~@bMn]tj@ja@jdA~lB|u@rp@ni@d\\\\n[nz@un`FosIxAx]tBzf@x\\\\}@bLfTn[k_@wWkVabrDwfu@mX|RlCle@|q@x@xs@eCff@xHxw@wVj@oKkh@om@w`@yNuk@lM_`@n@onx@tcj@lwA`m@bw@rm@xSth@vQlV~`@~C~I|\\\\hEnR~f@pMzq@cBx\\\\oPjYqFn]lMfN|\\\\r\\\\xQf^|Zvk@jE~L_UyDae@`d@kz@zOkH@muDs|@eA{@s}Eom@aAk_B{T{VvX{f@oW_RCeb@aMgJtCaW|p@qKbJuRdc@weAtcAwYtEC`UkQrf@ko@pH{mt@cfIrSrE`g@m@`n@qEdVjDjHdNfSz@rWgLrdAd^n[gEpGxCtQvd@rm@eKtl@eExf@aVlr@gTn`@bShWv^rDrj@dg@oBhi@oIfd@b`@v_@by@rEaQvAq[r[aS`Vg_@hDmUp\\\\u_@aDsQfEiY{Cmo@_NiJk^k~@ur@uCqJaOiId@sNdMumA}VqYkWq_@{TdE_UsPwDk{@zByy@}[el@ecAu^iXqf@sIcFvY_c@`f@EnXbI~X_ClRuT~Pqn@hZga@fXQhSai@p_@_Y~YyNnd@um@vWn|nFou~AjGE~wBk|@tk@_ZdpB{Xxa@iv@}Gke@~nAqY|Imq@rjAkl@h@e_@??wa@c]v@mf@fiBwf@z~@ifAbf@yk@dx@e[bi@sXd`@i_@v}@fSv{@|a@pv@ah@rj@kZz{@iPp|@y@K{bJK_gF??qsB`NmaB`]c`AvD{u@aYujAoR{{ArFs|AoZgeBqN}i@|Xsm@sM_Mm\\\\ej@tEuhB~v@erAii@mGjn@ykAgIsVgQujArBq~AfYgqC|UauApIe|@_CisAt^|vA~]_pBlLugDkFgt@}IsaAnd@_cAs^x~@qYkg@kTakA{A_q@gEmq@|My}@|`@ydA_DmmBd[_`B}HezAn@fF{e@sv@}Iy_BfTJbz@yf@{p@gq@t@g[y}@|aAqe@|gAgX_DadA{hAkl@mqA`Ig~@pZ{sAneAlv@t]gsBrKH|~@qrA_p@uiAfg@pQjm@m{@bi@g`Acl@ql@_u@mBqcAywAxCk{AdH}rA~]wB~]nm@h`@ak@n`@~Fj]jyBtj@zuAtHr_AyQtQj^d{@ts@fQhZngAhi@lxAbCjp@lYbCrg@tgAxFnkArq@xbAjeAdWhp@nBpgA{zAlIc[ny@g\\\\ln@mvAkKcsB`Zo}@vVwk@p\\\\imAdPeaAhYefBrB_cA`EdIbu@mRx}@gl@|dA_|Ajz@co@kSy`@g_Ar_@uaBbk@}_@acBg\\\\yeAyj@ua@qj@bDyh@li@at@|jAan@whAo`AfZqw@zSs`Boj@mMejB`Pg_A`Ewr@mOey@dT_lAfc@}QfWonBvCz@ns@wS~mAax@vHil@xc@oyAua@yz@_dAih@a\\\\uo@xv@mpAvnAadA~iAbXff@crAfb@ew@tb@ubBdOcg@zRwW|s@uo@hGcXpVqCdeAjl@nVzk@|T~eBfUrmAhr@thBdItdCeLv|AMv_AhChs@xk@tnAvZdyAtqA|fAtx@ct@gIicBcqAcbCas@o|AgEiv@t]~y@|h@wRjbAmSdn@epAd^gfBaHu}@geAiChl@kg@tUhlA|g@liCdd@~|@fXxdA`l@ln@sClA{s@qkBur@`cB`AldApFzg@ib@AetAvZaQ|h@rIvSmOtn@dn@`Rro@dUl[pYtH~RbBfElNdrB@|}ALd[nJ`aA~k@xFzC~RhWjx@?j|@Ff[|HcIfKsD`Rd@hEvpAb^l_AxHpgAj`@tN?fT{H~E}Gk@oEwL{Tk\\\\ka@gQ}c@nKiu@hLww@b`Ai\\\\uFcJbHsFdP?pK{HbByMdKlEvO}@yBeEtMcE`EmOno@_Srq@ySb|@eWry@uU|v@tPlSRzkAgOrq@bGr{@kRx~@}Hrj@{BlRqIbJia@bTHD~Vj`CAxtE@jsE?rzD?nzD?jwD?n}D?l|@?pxD?r`cDi~xBom@y[ytAPh@bKdhAna@bk@m@~xzCeemCvcAc`@sAoUa]eCanCvEwjBha@qDhPlaA{@jbAi@jcAlGtz{CkgxBcWwQqXj@{NxKnWz_@rZiDjOsQxyuDgmqC~`@fWvyAuCvjAiOg`@c[{xAyOqu@|T~gvD_lvCn[x@btB_CrOoPy|B\\\\{j@rJb~{D{yxCuiAvT|OpUn{AzKzq@oMxYmV|C{X}oAnAjdkDohpC|cBwF`eDcSrTia@rF_^v}@gZf`CsFlgAkRoVsXy_C|BkdAbSazBE}t@pSfMnVwfAbMuf@zMisAvAezAfDibBqLi~BiDodBjC}aApV_MzX~e@rOd|AlL~nAsFfrDrH~hxEqswCcwAxHxStQnsB~Pt{AeSqq@}RfvwEg|xCipArKbkAdKxfBA_@}Gc_AuQ~qkBifcBj`@jf@jh@tu@yg@cT_i@jL|TxTmv@bPy[gNi}@fRhRvl@wj@uI}Fd`@mRxe@hY`v@f[hAbh@yJqLcr@jP}FpgAdu@fd@eAck@k\\\\~z@eNbbAvBhxB{@pHoQ{e@aUdZ}Oos@ud@q_AobBwe@qb@gu@qT_\\\\vAtybDkd~BmcAlTsfAnRqDt\\\\_m@yCsk@tSnv@tRf`BaNbb@c[||@f`@|wAj_@nTqc@tsA~Diu@}]_Gep@iTgx@el@bDqJlZ__@sHdzxC_ilCcz@{WuiCr^auAx\\\\cGfZasBcMc`Axf@{uCtWmu@dXcz@ny@vqBb\\\\erCxg@gbBtLyxAnx@iaBbClRzj@tlBpgA|kAuYfaBc{@zoAxFzFxb@u`Ajc@{sAv[wXpOug@z|@pT|k@xmA}Ov{Caq@iwAzt@c`Avd@cIxTlhD}WbeCic@vjAm]yTsPf|Ac_@~yAi]]bQtsD|Hzs@mTeh@_m@mtBc@s_C_GzSiUyTe^{oA{{@dPsZbWkTt~Ak]r}BgT_g@yNbaA{e@bv@oBfp@iTl`@lQhpB`GnbF_MdcCiQjdBmH|r@}Ti`Ao[vwAIxRg~@_o@{v@i_AqXk`DsO~l@lg@gp@|e@wx@kq@k}CuXgjBr_AhH|g@nqwDmxoCgaCdAkvBdNj|Atv@niAbK`bAtm@hfAiA~e@{u@_@a^s_@qYl}nFitsC??aiBwm@k_Cmg@{~AZutAeHpG~n@bo@tTjy@`BdsBvY`cBpHjebGophB_{@_DtQ|eAku@hq@|WCrd@s[bVw[p^mRpJoZwB}Rf`mEk{yCuyBpG_hDxUyn@t\\\\iW`Y`eB}EzeBgSbjCiAk{@qQrjAaNjfpF{v}Al^tGreBk[vQeU|v@{TfJyPh_AgJbW_a@mDoMq`ArLke@nHwy@rEgTpT{]t\\\\k}@xXbklFalpCgxA~Ks~ClBw{@bQabAhYpmAvNfxC|j@nlAvj@?fZncDb]~_@kZhoCa`@yYmYij@ul@eu@ah@b|@ie@tqqEkcsCsv@mIo`AvA_Jp]~d@t\\\\trEtHt|C`Z`~Al@|FkSy`CuZjyGnFjvAeJgtAa|@yy@oP{nDbTanB~c@elBvCjxAyz@gx@wUo_AfFcTv\\\\t`oEgvmCaeAdXef@|{@kR`k@_hB|]woBr\\\\vEnZreB~C{f@~V`T|UbpByHnjB{OtgAxBhtBdTj}CjHdnBzDz`@m\\\\htAaPnv@~E~kAop@qh@uEo_BsIcwAxAqpA{IzwBsMpdC~CrwAi@|_@_V}oC_Xl_BZblBoOms@ym@qj@{WifDae@{~@bKd^f\\\\ajC{Q}uAp^seA}^ax@nSer@j|@k^{Xjk@a_A_v@cHjdcEc_mCzcA{g@_iAg]oiAdLonB}FgObQjy@|\\\\s}A|YfJfw@neBdWd{@eDfj@{VhzCgo@g@_SneoE_wnCwrAoAon@vL~u@fh@n`Bwj@fk_E_ztCwn@|[_Ab_@n[lm@`fBlEdbA_Ii@oc@leBxC~Bio@gbA~@e}AiT{vApB~ozDsl|Cij@aRa_AkChZiMipCeBynAj`@ehBjLoeBxJkp@fh@kjAdSztArQlrB~m@pmBnCp`C_GbbAoX]uUmp@sOhqBNzcAySrf@i[d{qDk}~C}{A}J_hAaAsyBcI{zAgVolAfBobAnPon@w`@oqA_IaoB}Ea~DqAe`@vEmsDqIkfC|BkfC~BafDzCeeC~FkqB|OvAtOnwCbZdvCtKpw@~LcgCKnrC|d@zdBtPziB`r@|_CjIxf@vKf|DtEeuAxFdj@dJur@x]lz@lTp_BtPr\\\\lWhvAtQwGdMyiBmAk@fN~eDnd@hbDgPrvDtH~{AqFduBgBxF_]qrBcMx]cl@ce@kCcfD|YftAag@jdB_Ksq@eWymB{MwPwTfwAmWpYe_@{iDtAip@vEq`BwUvkCgFtyE~BnmBgT`s@gX~gAiQ~{qCgvbCrg@lQ`eAbBpNq]oYab@ix@sGyo@hPUvY`_{DcvfCae@zVze@|TdsA}Q|q@xEhtAa[_v@kRuj@cZiaAvPod@fJl_}Bal`BsTgDeqAtN{~@`Y{@nJl]b@~oAsR|_|BwzzA}Tj]il@jG}x@u@v]rXbV`ChnAqYrN{SsvQiy{AmA`JpHhNg[jJ}^t@~CrXnZpIfm@yFpLdXv\\\\~@xI}H`b@fTb]|AzYkLnTmZx\\\\xH[i[wl@cb@~@{Nm[vDePuIct@L{KqLr`eCvxeBApjC}aA@sd@t@tSfXrt@lRt]_A~c@aDjl@yQn`A_HrmA}a@x~@q`@buAaeAqr@bLwvAvh@{qAlUg_@s[iSyi@qx@yXj|fCvia@s]ni@iGbl@y_@lYtRn{@q`@`eAoWduAal@qGsFrNlT|_AbcAz]_AbgB`LbSuQnW`k@ze@|g@ry@jUxw@}Dn{@ne@h_Ay[zjBeOlJBnx@tb@~{@m@ds@hn@xg@Elx@_R~{@ld@tUtOvv@tM~~@qIdkAbXvKsMbgAe[tVrSdY_\\\\pKuEnVfZzJuEtc@xUvqAb`@jt@gFp^xRtf@|n@lZmDhaA_UrUsh@_Cd@xm@{Xlc@avCjG{x@vHpv@Mb]jNjw@pU`Ijy@nYl@neAiSpfAoj@??vlAwb@pRsf@uPsc@l^qh@~FoiBqYc{@_aAio@x}AeQoz@gv@gTyfBodA~Ts_@o`C|h@qOnR~lAlf@yGsRkxAiTyrBu[ui@~P_|@bDmeAiY_Ake@}cBej@_cBoYc|AlMs|AuQqr@nFelAqc@ikAgJ{wBaSy`CqRwjCpCieB`L_wAe_@}NeytEkpb@fr@kRx@wt@y]i[icAoP}b@l@}LzVlZnZnMbc@gw{C{uqA~Csb@{i@gOfw@skByzB}W__@}Lal@{nB_{BpSwa@g[_Bu}@}r@yDqn@sh@mWcDmOrj@os@b`@exAlVcj@jq@`W~gAoUbZgiAtIesAvGojA|e@se@|Em[rx@uc@`d@}cAm@_`C~LcrAuGu|@hHm{A~d@sjAAuZlRwgAq`@_dBwTu|AiA_hA_U{k@o`@wj@_TbIsS~R_Wy_@ig@eb@rDg_AtKg}@e`@i~AeWyl@ih@_k@yPwyAgGip@~E{EeUrw@uj@dq@_S~n@`Vt|@uHjb@zFbOoXek@o}@m]cn@_jArVawAof@PoZmw@iaAwa@_SVoa@ha@{Msr@a^ulAiJyqAu@q|ArQ{u@~Use@`~@mVzYwTje@cVf|@ykB|R_iAlk@iXvy@_~A@eu@sWgfBmQx_@fw@hWzUjTlcA`i@x{@zjAaJrt@`UoOnt@~GzhA|^t@Kv^jg@{c@xW~a@p_B|YwH|_@~t@gAt\\\\sR|i@jk@zcAp`@zq@bg@jvAbQ`m@f\\\\fbA`Pe`@_\\\\`LiWop@_i@``@w_@lu@`UpeAlj@pe@jg@f|@~Az^b\\\\}_@hi@cr@fIcA`[mp@fQ_eAsk@ov@hWmg@t@cIt_@nwAnPd\\\\v`@v{@h^b_@vj@ibAja@oWl|@ae@hx@mi@~n@^lm@ff@`P_Nh`@wc@jRrH|q@zNnp@za@rDtl@tbArq@~pA~x@riA|tArx@|uArs@leAdFde@vZrTgSjb@`^hvAh^daApHhT~`Ara@tBjOkl@wMeWxrA_Sp\\\\dI|}@gOv\\\\kX{H_c@bx@mJb]mVft@h`@v{@dFzp@Ip`@fNj_@dHmHnfAh`@w@rDuMz@yXxl@dQbZoJjm@mVeQ}r@pf@cK|Mox@|`AjIoFeiAez@es@oAqr@x@yn@hZ{MzSyc@pc@rCjbAiHcTgYh\\\\{e@pk@hYls@iN`gAvf@zw@nm@jq@xFjZyO~_@o@tk@mMv`@xNjh@nm@fDgp@be@bLxgAaEveAkMtq@mZpo@iK~S_]bb@_H`~@ug@bq@gR|X~MzuAwj@j|@qf@pP{cA{k@jGaA{^zW__@iE_r@dbAghAveBgXnQao@dm@c\\\\bJ}PjHsb@eAiW|d@gMpShEzNyx@yPiMrGsMuz@o\\\\ej@gKcaAjGsV{f@eoAmFiUyWmaB{`@ztN}|RcGsDiPjHgo@NqJgQwIf@aQaFuHvYqM}FyXgHa[rL}ItSc[dL{TuNg\\\\kAyi@bOqOzwAjYns@fOreAaZxt@xAtWl[Rrj@gK`g@V~hAzIlj@`Qz|@|U`Ku@yCmr@}DyFz@sWnYeYxReCfQePsLwZfEe]{AeQ{HAuBgZxCaK_EuGeVqFlN_q@lM{XaDeT_i[ubXyW~f@eClh@fAph@_a@xw@|a@SrPlCn[gEpLn\\\\{c@lc@gZrIyGzXuR`j@xH|Oj^j~@~MhJzClo@gEhY`DrQq\\\\t_@iDlUaVf_@s[`SwAp[sE`QnCv`@tp@wMnq@oOzmAmAxFmB~c@`G|d@kGv\\\\bCtdBm@cHip@lWkh@n[qItK_[~N_HUgPcOgk@u\\\\g{@cQQed@sc@uV_@cb@tX}i@aTyD_YaMeXuHs^m`@wXqKwj@iL}LyGm_@oO}f@ss@io@iBySyEgJvW}WaA{Rwhx@fxGgJnx@fEn_@oKfc@gc@~a@w`@vmA??rWkE|rApIvOnFxPzf@_MpZbJ~hAvFv}@{ObJwj@hWcPkJgDjbAzn@OrXka@`VuYzn@uG`Mw_@de@tR`q@uGzSk[tf@wDf\\\\n@rBmRpTq@l[uBve@jHbZq@nNvDkBkiAzSeVpCme@eHud@tKcWb@if@xjAPmDqUz^FjBxIve@lAtNlc@jHrNpa@yGrSxGhh@`D|Vu_@jMgS|Pmd@jNsm@lwDY|TnFbQc@xXjGvGkR}NsE}@gZgIaOwUcLkOjEkT}Vaa@R_CtPkV`Jwc@cf@mc@q]wN_S`Amr@cZu{@s[e_@eh@c]eF}Rq@}UeIuThBmb@yFkv@eK_f@wQk`@uBwd@sDsj@iWw^o`@cSmr@fTyf@`Vul@dEsm@dKuQwd@qGyCo[fEsdAe^sWfLgS{@kHeNeVkDan@pEag@l@sSsE{d@rr@a[pFwOoI{[bCya@gL{MtY_v@ph@??xB`hAaXnG`SdU~VpO|Vr_@bL`\\\\nBbq@nMzVPbn@|PlPhAdd@rGxCvDda@uNl[i`c@_zEtBvd@vQj`@dK~e@xFjv@iBlb@dItTp@|UdF|Rdh@b]r[d_@bZt{@aAlr@vN~Rlc@p]vc@bf@jVaJ~BuP`a@SjT|VjOkElVmTzQnIfX~Yhr@eaAqn@oa@pVih@mTwNei@sF}CuZm`@~\\\\cv@rAeRq\\\\{Fqh@xEwo@p\\\\_d@aZkgApNmKnm@bDnPi_@qCgZ{mAlAoq@nOup@vMoCw`@w_@cy@gd@c`@ii@nIvraCimAxJtFdK{c@jPyRtSpTvxBm@Wbf@sc@lE`A|VnKmEfb@hIHjl@wZxUyHxb@n@`Zb[jjDf^e`@tQo@ig@s~@xn@g\\\\pd@jDpUyIla@nOnm@yFzc@q`Az[aO~Ro\\\\ph@s\\\\rO|DvYyMt]uSvP|H`t@uGfN{YrJ^n}@ub@nGkRiVuCvAi^sMuU_^eCkYgf@{Vy_@~U{MwJgc@`Mex@kLkOzH{s@hXi`@aGk]cSnCwJqQnMyc@sFeHg_@~@}m@sj@uXsESuSqJys@yb@_\\\\kf@e@_D_L{o@dDep@q^kW_Mg]a]cUxBmOlOdK`Tbg@lIzNf^dW|PbQfVtFpk@hPpc@g_@dCaGv[wLvL}CbXlFbVgA`LkNfD{MvTkoA_Eic@~F_k@vt@gXuE_l@jBsb@cFcUvIhJr`@|L~SzCxk@qKph@wPpQeA~Lt^`^uUxLsOxTbf`D{tQdWpDKdX_LfHjHlFmAhJdDrKhBlKz`@{LtKcLeFyIhAyLhP_NpWgKpTaG`CgQlOeJaCdQnK|MfMkPbScEnGsKI_RiGuRtPyGiMaKmHaGeh@pOkMeGyRfDkIzKmQbC}MgL{N~`@cWbXvt_Dihl@_u@nCap@Tuy@hT}WzUky@aFcUtM}s@te@{e@d[qS[id@vKpCrPam@pAgn@pXlFtMph@|F`i@`B`j@}ClxAbE{h@{a@nXgOfg@eCrTaQxMqb@hb@lAfy@wOxQcLlpAuHxTeKmVsNh|@eBzk@l_@|XZ|GfN|]zEvY}D_`@iRqLqUg[{L{^eKkn@_Ew|~@gscAkCKaHaN_l@Zyw@uQdi@rYqCtJvEeA|JvChHi@bBlAf@iEnC{B`KS|OhDw|~@gscAwJfB}OiDaKRoCzBg@hEcBmAiHh@}JwCwEdA}@`D`_AjXr]cGpMaXqi\\\\eybBs\\\\bSwm@lD|BdP}`@|KkHcO{i@~E{DpRom@vBw[x]rQ@tHfJjMtA`CfM|J~Av@xDhTlEtZa@zGvLx[yJh\\\\fBpo@aR~TtCbb@pXlm@cShb@{Yz^_NrEkY|IqQml@sLeVqN{k@cKuN{JoOdFoqZy~gBqMx^jPtOuUfUmNl`@zCpTsXzf@zZpEnOeFtNzJzk@bKdVpNll@rL}IpQsEjY{^~Mib@zY`Ux[lU|F{Gtg@xDrInRwK~\\\\}@tk@dJ`v@sA|GnOr^kPzQlB|aAcRzKpLbt@M}Fok@q^yi@`yAoJn\\\\kOqBkZnKcMcFgi@nIo`Aod@?{NoVqNgx@tJcTeKgLgs@kBsJvLmi@y]hMmVzAmb@gn@fG_g@oHc@bWc~@pMTdUq~@uJcb@cPqeArW_vqA{nWwYlDyQiNyMjR~@|Xrb@|MyYbP~Ul`@zLcJ`NlCza@a@^_RzCgPcTi\\\\ckRmkjB~f@nHfn@gGjXua@z@{~@mI{O{PwQav@{B_UgPgq@sPbAb_@nQjSoFnP{`@lHfNrVrQyE~k@~k@edW}qlB}Rh^nd@rq@j`Aib@vG}Xv`kCyfb@g@_P`OwQgNoIwCaWlD_a@yFuIwo@Had@`OmOq@kJdUea@g@~@rQyZfAu]|UdVlXv\\\\sLt[rApS}AfJjJ~VzBnHeNtS~G~Wvi@bO}Hv}Ogot@e@aK@eCNaiA}cBcm@k}@qHer@wO{Vi^chAwWuAgm@cc@mDg[cVypAqImJiWlOgLpT_aAvB_e@pV_g@a{@ea@sbA{Imf@wXe{@aR}hBcJkfBaDo^fH{y@sWwaAMmXnMwi@wBtK`_@{Hpz@tMpr@pe@za@qD`n@ar@fd@QbNqe@dXsYdoBgSdv@kB`\\\\~I~q@oCn[|Fda@mDhf@xWbY_d@pl@iAvYgUza@e\\\\oJkp@`\\\\mZbf@duEbvB|sDxyBdwAzZhdAbETyf@|[cI|e@{PzMi\\\\xqEkgCxqEkgCxerCnHuGln@lRtg@bcAl`AdjArWhe@ju@xJdi@hb@tXfYq^fXwExX~Ct@}UyP{MlF_Yi`@um@pLiZzV~[ld@kZuKsPpIww@}TkHoJ}e@sVgg@jCoXga@mL_j@{Wo}@tb@sJ_@gNzYat@tGwP}Hu]tSc_gA_~i@zvF?nqF?fzF??eeF?g}EvQiq@cOse@tHuYsU_]crAa@e{@pO_}@lQ_\\\\vHao@yRwX{Pcv@eDmk@zF_P~]oMkScq@vMuo@pBw]wN??{a@bzAgEfOpPbXlLdn@~Op_@rMzIxScSd[}Zrk@qxAlEtD}X|`Ake@x}@gn@j`BaV|`@aShb@aw@ddAjK|I_Arg@ygA`w@{cfAkd[tE_X}Y{zAeEqh@sRcRam@iIs^sb@ic@hgAePjx@ga@l]itA`z@wa@rb@{`@`c@qRnTu]vQxQhNvYmDjTgStXsc@vZaSbOsTlu@aXxi@WbNaLrc@vM|d@k[nRrm@zpMsmgAdDuScVmVsG_PpTqQgPah@`Xod@_ZcDqAq\\\\cIcHYwo@{[}OnPi^jc@eAvIzFzc@@tNq]nX`HtUzNeBok@pXcZmwAal@okAfJ{rAKoaAtI{r@iBadB`A{WhWarBj[wUoLieAh[mgAcGiBhc@dz@rh@`oAdLrD`Tje@ra@bWzq@kWtb@bc@|ZnLrg@dn@lKfk@`o@jnA\\\\pz@e@bf@`UzVrVp]eDdVcTtP}b@ysu@edsB??mHzInk@~b@qQhy@xYxRnr@Axt@gVjZsFft@`JgF{c@~UzFrf@gUlD{b@_nAmPwmAaHybAhIo_Ay@yi|AesNpoDpzDlpAvAtv@`k@`g@d@bPtRti@?fXcT`x@bYnQ`Yrh@}CzLeFrMt@vRSbnAat@nj@?jTqS?ab@l_@oI|c@_cAp[oM|I_Xt^m]je@oCiTsb@e`@o@iHcRXew@mQk`As\\\\oPiEqXwYwn@wd@}]kXq|@_Iut@wgA`LoRsm@}d@j[sc@wMcN`Lyi@Vmu@`XcOrTwZ`SuXrc@kTfS~TrZbTh\\\\{CfP_@~Q{a@`@aNmC{LbJrLbUaVla@aVb]{VfUikEdiA_zv@q{eCbHvj@u~Ath@rx@bn@ugAbfAbi@pt@iw@pm@pXtg@o{Axi@nVz^`y@bc@xdCvnA????lpB~CzlB|UtdBdLdc@ca@p{@oS}Lq|@j]kw@y\\\\mc@uw@gf@_nCwbAuh@aLnEmY|uAq\\\\`TiWt@g_Bn`Bqi@hrAq]md@oOmdA~_@spAaBcbA`Nqz@sZu]yl@_`BeTgoAzW_q~Idk^?n]vf@jN|f@dL~FiVg^yKyRmB{{zI`ea@oNiIoT~PhIt_@ve@pGna@wF~DmZcWoT`d~Ihh^vF`]dDhB?o]~ovBrgdB_jAod@ct@rNod@_X_q@b[vQzTjsAvQb[{Tbt@b[r{cBwbG|c@dx@dR~l@~VvVz\\\\nCpGsP~LsAhR|OhZ{K}NgYoDs[}I{YpWad@|Cwi@q_@wt@gTzE_m@xMeaAvs@saKor_Bo\\\\jOayAnJp^xi@|Fnk@dPtIl[wD_AzNvl@bb@Zh[y\\\\yHoTlZrArPmQnVtT~QcOjo@{`@|FdFbZrw@hb@fzB}O`zAhSbFrd@lgAbGheAi[vUnL`rBk[zWiWi_@od@{Jo{Bn_Aq`A`m@s^p~AaWfEql@_pAsL}gBbOvRweA_z@xYopCwo@wQgr@uu@sK_H~Ta\\\\`@a\\\\`Xsj@n\\\\a_@{Cuu@n[_MjDsaPggrAgg@{VsIrt@rSfo@j[wKnMai@w_UilCw\\\\cC}d@jG_d@aGyFlBpCfZoPh_@om@cDqNlK`ZjgAq\\\\~c@yEvo@zFph@dRp\\\\bv@sAl`@_]|CtZdi@rFlTvNqVhh@pn@na@f_Ac~@hh@qr@|d@q_A_AwSsL_SeNol@sKim@aTsB}yARjbKwehBfn@{Kre@Z{Ko`@zKo`@ks@qA_bAre@j`EyhgBC@eHic@zh@oe@\\\\[zjA_J|M}OwU{ZpSgPr`@p\\\\tBg{@p^{^uUs_Aqo@uq@}p@|CkjAgDxaArbAu~@qGocAHhO|q@dw@~v@s_A~B}CpEuv@vhAyi@`Ime@dfAyPtWwjAzJrF~f@x^hQ}Wj_@fw@t_@rrAQjiBdPb\\\\iKhh@h\\\\zx@cFzj@zVf`@oKuzAs`A}v@oLNAp`BkItP{Wi`AkRfa@u`@{J}g@e`mAuysAsFkFys@tI_{AbIctA|\\\\}IrJ}d@yHgy@`LcRtXif@lMfOrGy]x`@nGjFt`@wBrm@}PhNdIxuAvHd{@u]raA|AiHuYrNsi@bc@aVra@eFo@uoTrCnRcYf_@Bjl@}Dfp@uNxUxLfw@}Cb^uOrf@}L|T~`Brc@va@jThw@dQtv@wPyAuW`Zyt@gOseAkYos@pO{wApGan@o@ob@qkB}AqZpCeSaIfwYsqWc]R}k@fNwLk@uC_Fca@|C_HoBsBzU{HAiOiGkI`AkPzNwY~CcPoLeSkG_NwGqKr@{LvLmFdPsXdYxKbOlAhSiLcEyFfFhBrQaR~PlKzC`DdTmMzXmN~p@dVpF~DtGyC`KtBfZzH@tPs@vKdXtPIbKiLcCcXbYge@jO~EhLl@dPpBU}U`IiOaAeQpLgYjPkU~p@ApMvJfPl@tInLdFhPl`@nZjZ_d@hWmW~NcGrNkK`FsZdHyLbQeIwZo]_Rd@iOoIwLC{HgGhDwSyEoErs_@upYacAy@cMwMyR_@uWjNkRFsSoIsK`Q`Z~LbZa@xYgLdVlMdJP~MvG|w@i@hq_@aeWa`@eIuS~@yO_ForBrAd@dTxEnEiDvSzHfGvLBhOnI~Qe@vZn]j`@cYhYeCjMsPKoH`RgLazQwmCudBl@QdjA|yAS`TrBtJmHcjr@g}cAxFlQ~xAhDSiIfkAeKqJqYea@`Tso@qBom@lCn@zIoyk@svoAgm@x@aq@eP_k@zTyw@}DUc^m]pOhRbf@zM~E`e@y@r_@{DtjAfOij@bb@v^dIxa@@``@e_@vJtL_Mjd@g^h\\\\pVtLya@x[}]bQ]hb@xx@qOmQz^tf@pEuVbv@nh@Xfr@eZlV_q@|Iqh@jWw[~^sb@fCyPa\\\\i]wBiSiSaHg@mO{g@oDyVuL{`@f@iI}IvizAgk`D{pEid@gzExAwnAaV{{E_EgrNxF}eKpp@lrB`WbnFvAjoIbEo^bJe|E{Ei{DpTixBcR}r@lUrcAhc@c~CgVonHeWkzD`Kab@tYv}Fnk@hb@jMvfExIwoC~AbhApl@hq@pg@}@ndAajAxg@r`BrAveBvRirBb`@uMbt@xaAvD}oAvt@xiCnCmgAlXlS`UbwArHbvADimAji@YxZrzB{Xd_@vOksArN{pAde@uVhq@jnB`Kdo@aWflA}b@kTli@rgAz_@wcDrAcuAlBnfDju@zhDhp@|uDpT|cAFr_AbW|uA|`AleCxj@dj@pAdrAjNxxArMpt@re@Zxj@r^`h@zdB~p@cXxo@`[tr@~^~{@`wAxBh{A_r@|{BIr{@ia@th@_|@hkBwlAt^ug@pGew@puAux@oUam@th@_Uy|@ahAa}AgVuWcYaLyo@lfAbU~`@hHbw@zGtkAkSdCmi@mWg`@_y@]q~BrOljBuf@|v@kTf}@vGds@mNydAgy@~d@iVrp@ej@fjAgaApnAiWWcYvfDqc@tcCqC~eDnAnwCrCpgA}RrkBif@ccDsRy|BiBljGgOzkCoXsGiWskFa]{cF_]eWwUtgDmUou@}WkwEsj@}yAuE`Ya[asCoOe_EyHa_EQecAnRwdDma@etCjVwvA|Cy`ChSrsCu`@fcsDuk[q@eQgFuMzGsJa]_r@goAEq@gTbIyB|EoLbVmMfV{Sg[E?eb@ky@Ayx@TNnp@zCpeAsQ?kShJmDiHiQ|Fn[zVr\\\\nPjC~J}CfK|KzNrMxBiBjFvJ|ElTvN|@dH`_@}I|e@c@r[kKtlmBwuBfNfApa@iDhSrOf[~IvRtA|EfKt]cBle@i\\\\pC}[~Nq^_Iet@iPaUhMa\\\\nTmHcGmZpMkMn_@vAfi@mn@}OePf@{[me@aIoNuJjTeVmDyUqp@uc@_h@~Uue@tg@w@d_@qVn@o`@n]uWvT~Hdw@|d@hOkBvMpJf_@uZjl@aSBeGfb@tkaDgh\\\\lTg@tGnGtTdGvN?xL|FpKyArIqHpEz@~FzM~DO^zKxTdPpJlFjEvFlQsKnLtO`LMrMl@i@v]dHPxFfMlRpAvIqR~QkDiCaXnGwExKoClZnFhAmGzQaInLmKjQgD}K{N|CgKkC_Ks\\\\oPo[{VoElAuL}I{P]yDbDuHcBa\\\\rD{[s@cS{EiF_F}RdB}MfCkOm@kKmDq[tG}Hj@aRtJaQ~LwUpHij_@oyyA{RtFum@xYsr@`KkVkHeNdWyRxP`WpVf[{Ldj@Zvt@kId\\\\j@pL~KlUkM`L|Xs]f\\\\oLjRw[hVyVzLsV`Yiv@tVzErI??vy@cVfc@oUdx@qQps@_m@sKuCn[gYb@cTdg@{HdR~YlQ}Sk@uTgA_@qj@bAmJqIgTdIqWf@FoPwTkEaEgX~`kCcoe@mD~`@vC`WfNnIaOvQf@~Onh@sIn\\\\hCde@oCd\\\\tJn`@oRoDcSox@tGen@~CoU{Lp[cZO{Vlf@wHaMgPce@vAkcj@kq}Aua@~OkCvOde@bLp\\\\ji@xd@ji@bq@xJ~e@yAzn@lO??jVjHrr@aKtm@yYzRuFbKaTpIUwSgg@`KqLeb@CwCoXw^~NaVxEos@uF_DqKyWy@m]wHwE~Bk\\\\yFuMuMmSyB}aA~QokrGnaDa@tjEa@tjEtv@ir@l~@qKlNxPdnA|@qY{q@kf@kPhO}bA~\\\\os@dxB{s@nr@gDz|Awx@lQj]~VnDdM}UDcZvn@u]ibAqUqk@f@fDqOnzACvWgd@xv@oJlY}]gsAeN__@iSkcBrXyHfVoP`dBu_Ald@es@iaAwfAud@qv@Amt@vTkm@jUqasFxjPiEhKe@|Qxg@tm@nt@vLnFoFsDgT{Yce@cceG|mL`Ean@aJmUcLcTeMhQBv\\\\sfeFsaGpb@nw@}l@bz@vIv[aeAzx@`iAjFzSri@wArw@b{@vi@r@f}@bWp~AdHgU~eAb[vWee@pk@qBd^_ShiAlUxUg]|g@lBnr@eFpHyrAd^kP~\\\\mt@tGuu@gF}x@cd@oh@mIvh@wi@hb@ig@uK}f@nCkc@s^_]oDcz@nP}q@iLa_@{uAaWwTuTcfAyfA@ut{FbnDwcAfQwUvn@vs@wXfs@eDfb@bCfj@gAyMia@uxvF|kFdj@oJdK{Yg~@_BoNrSwzxF}fCoCba@}c@nDyDpXfBru@f_@cEnH~d@wX~_@nPnFfXqf@pQ}nAsK}p@_boFuu@{fAsAw|@kl@}I|Lfq@~|@|m@~Jd{@eKbgBbBru@~GzGhn@}v@pv@w`@i[qsBgTdDv[dZaHbZrc@`v@dWez@boAlJlTew@dgAP`h@h`@jQpW_Ug]er@j|@dWpNgPcGeW`l@sc@sC{{@th@~QiDzgAqAjxArf@`HzYiQ}Pqx@tHi{@hYMjRyi@yX}g@{Gsp@m^e}AcLwXct@mm@yo@lQm}iFd`S|qAyj@gy@iK{_@`R{T~QvBzO{~kFptOqh@wCaw@}UdHva@||AvPbrAwFDyUsp@_Li~eFriOqe@aDqNpYhgApKfj@jGr`@OoT_c@ga@OwOaUm{rEjpKoGfUwvBdEyLwX}rB`]wUng@w|AlJukAbd@hfAxVvcAeXpw@t@z_AsCny@eJjgA{Vzl@eE~XxF~pBwXxI{Yfx@sC}i@uz@yjAtBmq@lWczjExbAqIpj@yTza@{l@pDm]pf@vNvlAlAr_BfdAh@rs@gs@foAar@vY{d@hn@{q@~]{m@pn@ovAzu@as@jQwt@`Vyo@hw@if@t_@ot@`n@_b@d`A{cAnDy^gg@nAw_BbKgv@b|@ko@ji@ma@~Xez@dbAq~@\\\\os@xi@ec@js@qn@n[~W`r@yb@tT}a}Dkev@wCtV|TnJcDle@tk@iJzoAdj@{@xb@na@ls@bBl]zZnr@zo@gMlAt_AbMhTsEpYx]xM|_@cbBfPDfI|f@da@m_@iRqb@}ZqBy[}s@~b@sI~x@Zlz@qGpDmj@x\\\\aBnp@aZ`Uli@cl@``@bf@hVzLvUoe@vOrItd@sT~m@wHlr@|GxUpi@W~kA|KqB`n@j`@|c@|xA`i@|dAphA~m@lf@f}@zg@Bv[b^lNhw@jUd\\\\hBvQtn@_LfpAiBzr@lYjz@HdiBh_@~An[tn@aRpS~w@vP`Tni@`X|Pdz@iy@|[qvA~V_~@zTq\\\\d`@a{@nNemAxI_f@zw@{tAzXcxBtQ}nAEwjA`Koy@~yAld@`k@oFrpAwjAa]sUlQoWhhAat@sh@uh@ohCBjKst@bb@u^bFco@|g@a[{cAo`AsgAvCk`Aq`Aef@k~@s{@w}@\\\\qk@it@cc@lq@{]vTgi@bUyu@s]}Yy}AfNudAiHi{@os@ebAfhAhE~q@{W~^`Az^zk@kGqPzcAk|@pf@{uAvj@rf@h[hWny@q{@rV}y@t]opA~a@utAbGac@x^go@|DejApMas@a@eFuWfGwf@yC}Yce@cLgDfp@k@nKyw@vVgf@yHys@dC}q@y@mCme@lX}Rkq@yF{w@om@agAwf@ms@hNqk@iYi\\\\ze@bTfYjbKwehBiItk@fn@xv@xmB|c@lwAmHuq@i`At_@o~@atA_p@gn@e\\\\{Kn`@zKn`@se@[oz}Ammy@pa@y_@Ri`@~R?gIgl@b_@on@rkAga@fj@mz@mMwo@o^qTvCoc@|g@yQng@oiA??da@cq@eKiRnRufAyi@yP}HpVq^z[{i@hGsU{@uhAam@mVsCoQhQpT|]}e@v_@qNcByR`m@gz@~Kkj@j^{wAxIs`BqO_EsM{u@aKok@wb@wh@x@mZsJmk@vDcdAt^}p@xEmfAjv@qm@dAoDrs@nXzlAdPnl@gZdHvYfa@oSzp@{Ctf@in@nIcDfg@tw@tw@}]z_@eXvd@wz@lZu@`v@}\\\\bIeDv[dyAh_@pVrgAptB{QbcAkMpeAcGrYskA|\\\\aJ~n@bJ`~@f]jkAuS`~@ao@d{@yPvh@iz@bm@irAr`@bIvf@uSupkAay}@dXckAkiC_`AsVqjAzDul@ea@mNa_@_f@yYuHugA`G}TzN_]oIog@niA}g@xQwCnc@n^pTlMvo@gj@lz@skAfa@c_@nn@fIfl@_S?Sh`@qa@x_@`d@aB~h@eDzl@~z@fsB_DdoDu|Bb|Awj@xi[ox`ClMlg@seAri@fpAtn@fsDxi@zt@lJhqAgHjmDwRq|@sZ`gCq]umBcKtAkQdbCoMei@wg@w}AeHm`Bji@}}Aaa@smAtP}dBi`@owdAi{~@zItRrUuG`Lrh@uN`F|NpGvAnOm\\\\oGm@hWb^|bBfEgOza@czA????eQsSfCqBqOe\\\\sKcn@}G{Nw@S}SBwD}IwOY]pXlGnHukS{qzA{d@|GgF}Jw|@yI}LtTkxAdOvEv]_NrYvp@cHxq@dUmB`^tFxPoSx^sy@l^m^tr@qdAjq@}o@KgNxLpPlK_w@pU{l@|Qst@p_@mEtJtJjUta@e\\\\fu@gIhYlg@cl@bVjFr_@bYtBj`@rt@`YxCGcRwKo`@qLkLjWec@`Ro^~XyFlQ_Zbg@iJ`ZcXfm@aCxo@g[dx@sg@ni@_c@nRy|@b^gFxq@sSv[lGbc@~[~XpCeFcZz`@}FbOko@uT_RlQoVsAsP{YjLc]}Aab@gTyI|Hw\\\\_AqLeXgm@xFoZqIqy[_oiAmn@mDnUdp@kHjRbLb_@xn@qVv^wEfvAw^wGa_@chAtDk_Pg{nAg^kRod@jk@vGtqAl[}BnXxStVqOnAkjAfMwb@bovCubc@ai@rDg`@~MiIbP|j@d@|QlI~a@aIvb@wUoFiMiYiCsldAsg~@{IuRsdAvWkyBsaAeXbkAzJlHd|Bj^i}@l}@tSrIfI|Stn@tG~MnU~YfRpdA_I`A_Hc^}bBl@iWeHkQybtGyokAzx@|}@a@n_AnVzp@{Ih^p_@`k@xnAj\\\\zlBzB`xAhfA~h@_WrAwm@tkBxL|hAl\\\\dhAd@k~@~l@th@fiBlg@fYf]gWkNiw@pf@eQlX{i@cz@gRw_@if@{}@i_@{l@ui@k{BuQ{aAxKk`AcnBuh@z\\\\uzAo}@ob@iWif@mkAvIgeAmYof@maAoJaa@tuAimyGqztAgk@oY{LdeAt{AbPvu@`}@haBwi@~`@jcAndA\\\\pGc}@{]ao@yaAoBeQmuAoQuo@mhA``A}n@~SepaGoj`Aqa@gd@qb@dFuXgY{l@nL_GlTdb@xd@rXaS`_@nMpOpc@vg@wP_siD}b_Bpn@rh@|r@xD~At}@va@f[~zBqS`l@znB~^|LxzB|Wgw@rkBzi@fO_Drb@ne@eHj^mUv{AqErfBu@tUzE~wAgYnb@|KtHzc@xeBoTdh@xG~LjZxb@pJlqApj@jZtk@fVLbPs\\\\nnA_AtKgr@n]MuCu}@xiAsl@djBzChhAbHtz@kw@br@sVz_Bwk@tJmDz_D|c@mAleF`_@`Bvj@_p@fi@oP|eA~KrZxSnBgNkNaY|JwTlgAiTd[cw@na@yN`AkSy{@|DkAul@ct@cIsu@hHgJ_|@bJse@p}@~Abt@gNjgAnZhy@bLv^cIkEe_@zf@wh@jm@v@`t@ki@cc@kn@fQwKyp@ucAi_Afc@wFsl@a`C_cAs`Bs@whChj@_iAfXiaAkYabBg@}nAl_@eQqQwvAtAuNs\\\\fdB}i@}z@o]tJ_P_{@gObl@yi@u[iT{hFwTo]mNk{CaVew@}XioBlLuRx_Ag`AgNioAhTdDba@}z@qBs{C_z@zUrRwnAho@ujCt}Cg`@u_@cuA~b@yxAaOoa@fJa]bc@wj@bKqYnYooAkGcqkAhcHtxAo}@fCgc@raFi~BpI{ERgaA{PiXw]kh@wUql@nZwfAhFk^r\\\\kj@me@id@ki@eh@m_@nI?`b@kTpSoj@?cnA`t@wRRsMu@{LdFsh@|CoQaYax@cYgXbTui@?ru@zeAWtbF_d@pr@vj@~WlN`YlVpCzG`k@`SdXdKrh@criCspqA_MkZeh@yGyeBnTuH{c@ob@}K_xAfYuU{EsfBt@w{ApEk^lUoe@dHxGbMlaBz`@hUxWdoAlFrVzf@baAkGdj@fKtz@n\\\\sGrMxPhMbuBnHflAiSvbAxC}D_c@_cAlI{UgRqn@bE_oA_l@`iA}_@nk@pNbm@oVms@og@qjgEuxVxMmjA_g@_s@yoA}Jsy@~Gqr@nWg[cj@mv@`VoMrh@vF|iA~gB`o@mZzd@r`ApCbu@bXhs@cHjXq_@}luFkvhA{BsD}ZdAiWe[ek@aBsYaC_HcN}t@vhAmNng@O~fApVja@pw@~J|p@zXhw@jD~Eaa@qJ{m@rZ_`Amm@qI{eg@}vpAdCuU|MkEhLyOuJ_M}MoCsGwSeJmB}GxGsJzBeG|HiI|AcKrJ{GK~EfNnFlFcAtC~LjA|c@tHxAxKmu|Aopy@_LrZpDfMcSbn@dk@r@pNy\\\\tv@_E{l@_{@mvpEsvZlv@aVf[bj@pr@oWiSe[yA{s@rq@ou@zBu|@pn@wq@fn@iCpKvTrc@x@tQ_Jz`Ahd@n@aw@kN{`Afi@yApBqd@`ZiRiL_Vet@ug@sDtMi`@v@lHofAk_@eHqc@jp@a[vw@}kANgWnu@~f@jOzPnU{iAjd@}r@zhAkf@`v@in@lj@wNdk@y}dAy~_AvOXvD|I|SCgU{q@c^ak@c@eAc[dBgInWba@pVlnOk_NzAdQgEd]rLvZgQdPyRdCoYdY{@rW|DxFxClr@jOPl_Aw\\\\vw@sn@ft@ea@bi@ig@}M_SiBeQe[{`@c\\\\e\\\\iLm@kO_FcYfe@bCbXcKhLuPHwKeXoyo@_~i@?x{BzfADVfYhxFuvBfxFuvBb~@da@dk@fVdb@ka@xaB}YlZcf@jp@a\\\\d\\\\nJfU{a@hAwY~c@ql@yWcYlDif@}Fea@nCo[_J_r@jBa\\\\fSev@o]mMmDmYtE{X}i@aWgRaSm]}PqB_o@khAnTgYkDgs@lI}qA|Zg\\\\pv@cw@bKawAbYqaAb^o]gO}\\\\w[pM{n@sRk]al@i\\\\_j@oGqsAvKiT~ZgVF}RrIa}@jFgNrSrU~\\\\uHtYbOre@wQhq@?f}Ewv~CeuMlH``AdYxPju@hMv\\\\up@`J{xAi[mdBej@va@a\\\\~j@crw@vpw@uTxQdRl]rIjSxa@vHnJ~RjUdEzm@ao@k`@qf@y`@oWg\\\\uK{vr@}rkB{D~Zfr@~RnMhb@xbAnVl{@K~MiR`_@uE~C}NuEcPrZ{Hn`A}IfLqs@qfAeRygB~Bm|@eEwG~Kg`@`CuxJ_|`BoKbMpBjZ~Ph@~LkDwEab@oht@egoBc]lMiDh]cSzc@dbAbW~d@nI`{@i]f`@aCvG_Ll|@dExgB_CpfAdRcAan@w]gf@{y@iTsp@tm@eq@g@_K}n@gt@aJkZrFyt@fVrfC_ucAqV~f@wB~d@qT~`AmOfLlJhWxpApIf[bVbc@lDtAfm@bhAvWzVh^dr@vOj}@pH|cBbm@O`iAnH?m@l`@re@`AbSdMj[?rUcGrs@vEhSto@pRpCj\\\\xmAzuAlbArShuArX`[nFnUvkC~C`@A}A_\\\\_W_PmSq_@~BeTmTak@ya@wf@aTaIoOoc@o@g`@qUse@sh@yUsf@y~@c@[m^_Wcy@}Egp@ui@i^uOes@es@rNwlAwVwt@kG}_@gg@ei@u}@q[im@yXyh@w_AsRke@_m@Hud@nYmz@iCw_AxLu~r@yd}A}MeHqh@eEam@lRuXjAg[xOnCdTwUdIaHbYyT|NlChHuJhEpOrCxc@y@dEuG`L~CmCdJbP|R|IlTtNxEfJq[sEuY~@kZ`c@ed@xRkYjRoQow_BjjWqOpYoNhh@_IdjAgOf\\\\fE|\\\\`JjQdTsc@vJnQ{Jhm@nDnYfPlM|B|s@rWzgAx]buAre@luB|VzuAf[ngAzq@vMnu@lY~b@}Nrp@kUfP}_@bCmv@~Typ@vD_l@eJal@y[yICyS{\\\\kn@sDyf@nMq\\\\xJmf@~Cqx@yT_b@mGsf@c^iA{a@yKcViJmZYsb@sb@mr@oe@wQm^nGuYqYnFma@mj@e@qd@uS}ZnwcFmp~@afAyCknAyEzDfKk}Aj]qmC~j@i{BMqp@?CyXgkB?yUdU}^vRed@nZuSr_@qNja@i_@zQ{r@vQkf@kp@cr@e@_k@zWk^xi@sTrc@{c@rb@wLvj@oPj\\\\wo@jRkk@vLkW{@fWzu@|I~k@pCtrA~Dp]yI`a@kRn]oKno@mh@nm@sMtb@mWv]kaApOyXdYyu@oPun@iEym@gJif@uIwf@oX{Mmc@eDqs@wIgQki@kOaaAoMkv@dA{d@iD_NfLbAb]p`@dd@zM~d@oJ|IjH~YrNvo@zNaO`L`@zJXjUvd@jJmFpF|AOdHxx@Ujy@@?db@f[DgVzScVlM}EnLcIxBp@fTfoAD`]~q@{GrJfFtMp@dQteAgbAf_@iS`r@iOza@pCdq@nVn^bEdk@mOxm@{Jly@u[xm@wGveAa\\\\hs@{\\\\xNuO|a@wB|~@wR`Yq[bbAmb@h^mf@zMm]yScElEyPkMeOIsT`Ta[rD{W~Sq^`v@c}@x}@yo@l]}e@rt@qXnJgNoHse@x^qM|c@k]pNsj@r`@aDhc@}_@f\\\\k]vAqRr`@cn@bU{n@]_Wdl@yWzSvArb@gP`IlXkI|\\\\aE|m@mTxXkm@~i@iIvMoHlCgGnTcJ[oKhg@_RzNiLbUif@x^uSby@qQjZkPh\\\\mB|_@c]`AaXl[uUzZn@dJhY~U`JInO_e@|g@sb@`l@e]|^{NaAwl@nH{`@v\\\\kR~i@{ZfG`GvNiOpe@cNxc@ic@qCuCwXpBeVkViAe[bo@qk@tc@iP~Uaf@dV}g@~[_q@yuj@_tqAg^`SmChh@zJ`AhI|Iz`@g@xVtLzg@nD|XeNzGyY}FgT??}FNyAyK}c@uH_MkAgTuBrnUuhW{AoRhDcWlVqPhKyb@zA{e@aTkJoIyc@yRm@sj@jPgb@iKeWbCkH{LwyF_@}Lwj@zIuFb]wlGd]wlGu~Ac@yqEjgCyqEjgC{Mh\\\\}e@zP}[bIUxf@idAcEE|nCda@vh@hDne@nv@zHftAjDbVfU`g@lA`g@HrN_Kja@zGly@|X|JpRno@~ZnG`OdYtKd]kGbPfNdHxi@rp@xr@m@dT`PnYeCfc@xXfHpM|FtHwY`Q`FvIg@pJfQfo@OhPkHbGrD`R_QiBsQxFgFhLbEmAiSyKcOrXeYlFePzLwLpKs@~MvGdSjGbPnLvY_DjP{NjIaAhOhGzH@gpbEc{f@xb@lMlc@bZbk@xAn[pbAjYjJe]xu@uf@rl@qXfh@zUju@pTnJ}Mj^uh@rp@cF|a@^~[mW~w@ha@fy@f]f_A`Ekm@gR{n@`T_d@cDacAjXk_@jSyiAhJ_nA~Ywr@dh@j^`fApk@`b@qDte@uMoTmlA~Kqy@~o@_gAsFqUpc@_Ghk@_r@bCgq@yTlHi@yk@y]yMrEqYcMiTmAu_A{o@fM{Zor@cBm]oa@ms@z@yb@{oAej@uk@hJbDme@}ToJvCuVqc@sC{Sxc@iZzMy@xn@nApr@dz@ds@nFdiA}`AkI}Mnx@qf@bKdQ|r@km@lVcZnJyl@eQ{@xXdt@tg@mef@ydrAxOpD~BwJbZv]gCzRbLyCnPmS~YkK{EsIcHka@kSqMuJuDqOvIcHrGqSvEyV|KbDjDmkjDah_B}`A{IgvByt@a~Ak\\\\iu@dRg`AZwh@f\\\\k}@fAkyAtNw{@oj@jXyc@u_Aw_AaeAxXuw@hFohA`O}Jxm@ywAhYaz@qJanAeGs}@fGe|@~\\\\}d@|^}x@SwmAdImx@oNiqAkIozA_k@od@vEw_@|SqiAgDl]bn@dk@n}@cOnXkb@{Fu|@tH_o@aVeq@~Rsw@tj@zEdUhp@_FvyAfG~j@xPxl@hh@h~AdWf}@d`@f_AuKdb@sDx_@hg@_S~VcIrSvj@~Szk@n`@~gA~Tt|AhA~cBvTvgAp`@tZmRrjA@l{A_e@t|@iHbrAtG~_C_M|cAl@tc@ad@l[sx@re@}EnjA}e@dsAwGfiAuInUcZaW_hAbj@kq@dxAmVns@c`@_obA~nU_n@aDcjArPiO{Foj@s@iUwQod@^icAgWwp@gc@????aI~ZpAh}@wFxu@mAt`B}Ir]rQrk@fWlj@vf@ve@dx@vVleAh]reAbbA`WjJrj@lk@vXlMfDpk@s\\\\hn@iKtc@YtQaJcBx@h|@bI~[uMvIfH~XbYdUpr@bTdjAz`@jZ`ViDjY_OdCjDz_@jn@OjDsZfHa[jDmUeJudAhOkk@|\\\\}vA{`A_fAoOal@mHuDaFwc@`IqQuAum@eKij@BcnAn_@aSv\\\\qCnLmN|[eLbs@f@`CiV|Dok@u|Dor@_c@~\\\\ePwDuWxNsB`XdL`\\\\sC`k@yg@pe@aRkj@aZcLhDkoAdYel@pUeStT\\\\nPgpAli`@o_h@sLySwsFJzJgyAiNc_@qy@sD~@{~CclEfBEu}AajFhvCt~Ab@e]vlGc]vlG{ItF|Lvj@vyF^jHzLdWcCfb@hKrj@kPxRl@nIxc@`TjJfh@}i@xd@}l@nh@qOx\\\\kQ|a@Tn]rL`^mDjT`SlDu`@mPy]yFyy@|Ey|@pFa^gEe^bOu\\\\m~~@|_Qi|@rJqKhPeTb\\\\oP~sAnPnn@oPfpAuT]qUdSeYdl@iDjoA`ZbL`Rjj@xg@qe@rCak@eLa\\\\rBaXtWyNdPvD~b@_]z_@eO_Ray@sRwT~Jyr@qKsq@uI}O|Nat@knbE_sK{IeJ_r@jZ{Cb_@gh@oFmSuXkMzD}c@vd@eYxh@sB`i@tEl[aEnTqC~c@aUfPqWfv@d@bThk@dCbz@im@|hAsp@hFy^dc@yh@rGwr@nUaa@yEql@sfeFsaGdu@oIxfAAtTbfA`WvT`_@zuA|q@hLbz@oP~\\\\nDjc@r^|f@oChg@tKvi@ib@lIwh@yl@jTio@uJqK{s@uYyJ}iAoLyk@op@u]of@o[j_@cLgTy\\\\|@uB{f@yAy]co@mj@o^{o@iXEa_@r^{AdZeh@jPcs@xQlCnW|h@`BcJp]oze@~jo@@xeFxv@|^p`@pChf@yJ`[oCnIwYtWcP|\\\\|]lm@gn@nWsl@vL{{@lNgl@|Sg_Bj@wiA~Fca@hWwXh_@sr@x_@_jArLgf@zq@_|@xB}n@a]{Jmd@uIog@z@id@f[mHkCi|FuAij@|\\\\ivCzG{qBoXer@eMog@pBuWbMMdDdb@`M~QBzf@nWzVwXj_BzTnm@`Az@r}Er|@dAgxbIndh@gr@ve@o_@v[vV~Mja@{Ovk@c[fg@c`@jh@ak@rGeT{YZ_b@fToZfTe_\\\\}sk@kNb`BkVhO_@zR_YjTpL|YbWx}BfBhpAvnA|y@~YhqAaYbVDfg@cg@l@fEl\\\\rPpB`AzRrJj@fi@kcAtMoAzo@|a@jo@gQr`@sB`QvGrc@{@zc@rYz^n@rjAi_@r\\\\jN|^a@lVsVr}@iVdbAlFfOnLxG|b@zPdXjCxv@rn@_c@lUD~ShQm@yi@`gAeM|@g]db@yg@jGm[}Ci]ag@mAcVgUgtAkDov@{HiDoe@ea@wh@D}nCewA{Z}sDyyBeuEcvByaB|Yeb@ja@ggDefKqBwcBp@wf@wJmf@gRcRi]ue@pEyOiKeX`Mad@mAwSkCyv@{PeXyG}b@gOoLebAmFs}@hVmVrV}^`@s\\\\kNsjAh_@{^o@{c@sYsc@z@aQwGs`@rBko@fQ{o@}a@uMnAgi@jcAsJk@wW|WxEfJhBxSrs@ho@nO|f@xGl_@hL|LpKvj@l`@vXtHr^`MdXxD~X|i@`Tbb@uXtV^dd@rc@bQPt\\\\f{@bOfk@z_AnUtViB`W~L~p@i@l`@cf@pSgl@fk@eh@~m@XnkbDujT|MfLlQcCjI{KxRgDjMdGdh@qOlH`GpTuRf\\\\gXvLaTjYsRf^g[}EuHiIlHuCmCmRqAyFgMeHQh@w]sMm@aLLoLuOmQrKkEwFqJmFyTeP_@{K_EN_G{MqE{@sIpHqKxAyL}FwN?uTeGuGoGmTf@jD~DdB|LkEzUjMhTvEbX~@pZiBbOs@b[pHbEzDvYiCnOvK~N{AzOqnLsmgBuJbTpNfx@zNnVnd@?oIn`Aja@qMpf@kZ|x@~Kvl@}C??e_@ePwu@}zAotAcYmq\\\\srzCwVkTwzAeAymAxTwlErm@h|CpWta@~l@zu@xJv\\\\xr@hjAlAjeCce@uw@gUt|AaQxxBws@po@}o@kiDkUga@zTyv{@kzfChiB`Xnq@vDoYyj@foA{W~_BdTt]xl@pz@rZbbAaNrpA`BldA_`@ld@nOxe@pAbHbh@xtB_IpOva@~z@Efh@nk@p}@fdA~_B|vAwUjTvTvW~|@a@pg@ry@yB~qA}f@r^tSnhA~r@zi@pZ~b@zh@ke@lzBhgAhrArMluAy^jUebAvRgoCqx@eg@_dDos@mzBo_AkqBcvAeuCuwBugB_n@wjDkmAchCkZ{eBhBe~Awr@}pBvAgoBmKmbEtl@noAvO_pt@oj{Ct{Ar`@htDjFhwDmIbJePtxAc@jcAu[_`EmPwyA~Me~@uQa}CrNgho@{`wCrjCpXfmBoMcj@cOvd@_So`CoKyWlVobkDimu@xC|YgGvf@dFtW`s@`@djAqMfo@}D`c@y^ttAcGnpA_b@|y@u]p{@sViWoy@sf@i[}X_Ncq@fRa~@tg@cb@~G_T~\\\\qo@hKuq@lZweAjMknxIbgmArVt`@~]xi@fo@zWvIkO`Y_Hac@mr@nSka@fbA_Xw@sUel@yToIco@zAmg@hX{h@u@_Jz\\\\yXdp@iv@bYgk@eV{C_a@ta@so@dOuPtv@il@x`Ai@ui@e[`PiHfn@iq@jSgi@~Cub@yVu^dFbNnv@`Rlc@tn@g@tO~QyDzYgkjIdatAqt@u_@od@m_@yZsm@uVyNgH{a@{j@{[yLpYeMxXmk@iXcQjYAhYhV|[xg@`m@~^bXaV`]do@Xnt@pVvOzg@nb@f~@bp@|Zd^xPpx@i@lg@sS|bAkCnI}Uq`@km@smAu|@ig@wJoyjBgjk@s@eXgQ{XEqXg[iK`JuGcDug@}^G_[ti@{a@tU{l@dG_d@jJg[zb@yOvSkUzFB|LvUfd@~HpPhY~RhVxi@j[gB~KzM~Ht^uFvh@|DtFv[E~e@jVbEl]fMdL|e@OlWvNIfXf]hPna@{Dvh@`Tz[pBlSuj@zo@cfBozDo}@uh@_|Bi{lBefq@zJgTeQiTwFlD|DxXy_wCkidAh{@ns@tdAhHx}AgNr]|YcUxu@wTfi@mq@z]ht@bc@]pk@r{@v}@df@j~@j`Ap`ArgAwCzcAn`A}g@`[cFbo@cb@t^kKrt@nhCCrh@th@xl@yNtQ}k@fo@qn@drBvJndBd@`wAvGqVsgAeyAi_@dDw[|\\\\cIt@av@vz@mZdXwd@|]{_@wgBz^o}@iHkd@|FsKuLqj@nDepA_YeAet@{a@kb@om@B{EoPwn@cGcVxDmWqPlBqd@oYud@yf@{NpWih@mz@|@ePoUrA_Wc^gYbFc^xMmYoc@gZcbAcLwfAgFw^qJkc@_Fem@b\\\\oQ`o@pavC}|OrFdHoMxc@vJpQbSoC`Gj]xS_QjLw`@mNuOxNiCtJsSb^kPjZ~BtKtTdXvNtLdAbE~Ky\\\\z`@`P~F~GfH`\\\\dBzIid@bGrIrSuBpKcXrXcCfOiFxY@|@pLdFmHiBmKeDsKlAiJkHmF~KgHJeXeWqDmUlUh@dL}WxA}DaDePjNw]qCqYwN}d@sKkTuQoa@tBhAbEya@dAyZvIkSxQjogCrkGhw@}AjGlHdr@~JnfApi@pCb\\\\|NvTgEx`@vd@`QAjYnOlJ_Yfw@wa@`e@fLxYoh@rBsVj`@ev@p@gr@yc@dC|}Am[dFgb@wIau@pcBlLdT`B|j@f@dt@lWd^gJdVjM~S{Yps@jf@lbAvO`_@d_@|Nr}@{b@lDuX|zBw}@`oBicAdo@qe@zXsr@gI_Q|s@_qAr|@irB`z@m{BpXo[tRam@no@wg@pk@iXgS{Zh]sz@mRyj@yp@mf@mF~XxPzMu@|UyX_DgXvEgYp^ib@uXyJei@ie@ku@ejAsWccAm`AmRug@tGmn@sO}Dqh@r\\\\_Sn\\\\{[`O{c@p`Aom@xFma@oOqUxIqd@kDyn@f\\\\hg@r~@uQn@c_kF_yW|^sn@qt@fAuTnUpO~t@slnFynRuNoP{Eye@oa@uB`Ibi@gm@k{@~Drz@lUpSpRnf@rRnQne@ej@qyuF}lOkEph@sB`b@fTdx@zUw~@d\\\\v^}R~l@zPh\\\\phAgc@pPgl@aRw\\\\rf@q\\\\rR|Xj\\\\kAhm@za@hIiQoWus@kf@qPca@qVaUh[on@cPgI{Zck@u@tBio@uq@r\\\\gDn^qmfFgeQdrAfz@s]uj@el@se@od@ej@w_@c}@eJ~q@hh@ja@a}mFarb@dI|XkTvk@nO~r@xc@tSzHjq@_Mxp@c`@zEsZmFamAta@|D~`@kS~MnEx[to@u]`Vy_@bO|Uvf@kd@xw@dH`^yLcByXqR{NtQoM`GpUz]}b@hHeZhA{z@cXpSoEw`BkSsw@yd@@qe@xPgRgOkjmFohUrHw\\\\od@jRwf@Cd@bY|[pYtf@vQfAa\\\\}btFewVoPxdAdo@qOi@|SgNpe@t\\\\~LrA}j@xQgBvHyd@wc@|CXsVde@wn@_{@j@okrGnaDmkB`j@qrBvb@aj@`_@ya@j^oHzc@cgBre@eNb`@nx@vEyLrh@yv@~g@qg@haAyb@cAnAtZgo@rIvQxJmaAhY|E`Qlh@hCjNeOtt@_Fb~@mHro@{f@lb@ia@n_@wu@npAiZ|s@xPde@rS_Gbm@bp@nT~a@mIr_AsA`@ujE_ciHvcFwV~RoFn_@pRrOvJ{c@pMcWh[oSpb@uYbl@kQkPaNw`@nPgTvLgY~MiofH`lJda@dN`_@rMd`@Afr@eQtb@mPeDiR_w@bHga@{CkH_]_Hq@aEd`@sb@wCuPkT{a@iUzEyc@md@e@sKfIf@ta@~Sbe@v_@bDogmHvlI}QdMi]rf@o\\\\dTvGnPnPfE`Z_WjZuf@lLsn@uGaEwzl@ohhBwArZiPvVJ|Wnd@vKiR|[e@zZm^pu@tEnP~]fFxw@~r@cOb[rLuBjz@_W~k@xGn\\\\kE|c@jLn^eUtXnGpBwBv[y]nm@wBzDqRzi@_FjHbO|`@}K}BePvm@mDr\\\\cSrX{f@{CqTlNm`@tUgUkPuOpMy^ui@kQo`B{[wmAeTk}@pIuCfNi{@X}kA`F}qB]a_@tErm`Cedc@}^nDgJlK~NvN`n@Knc@dArBuYyGeHwl~FwmqA????_d~FuxqA??wG|IvVwBbZdTtQfTkAzk@h_@xLbJ`JpVlQrh@hIbZvO|@`ZhF|E{WbImb@lZ~GbNrY`Cdk@`BhWd[|ZeAzBrDj]{JpFvJhQdDdAwJdOwDxO}HcPoZwMkFpDmJ{Nu`@bCeInc@yEl\\\\wO{q@cg@{cAq`@}i@kk@u\\\\rR_u@fAvH}_@q_B}YyW_b@tsPqxpAuU{NoXaHuNp]{c@AwI{Fkc@dAoPh^z[|OXvo@bIbHpAp\\\\~YbDaXnd@fP`h@qTpQrG~ObVlVeDtSbXfO|_@yGf_@zEqH{o@zDme@|ZwD~MuV_D}g@}WuUmCgX_Lsd@j@mYnKmUjrpB`lf@mQva@bCxsA}`A~JqXgKei@|OuJtQyDfx@iF`WiVvAmVaIoUhJ?ja@nG|c@fK`c@fIdv@tw@zn@lp@~HdeAoH~}@_Po|@_~A|GsZj_AmWjkAcm@br@oHzqB_eBsWyiAq@s`@_]_v@{kBeQay@Zgy@|^kcdAao|@l\\\\nGwAoO}NqGtNaFaLsh@sUtG@de@sfbBejo@bCml@yOy_@aPwE}QrRc@pc@pLxc@jPlCscv@_zwA{ZnJk\\\\aIi[vIo@bOh]lL~Q{DnPljAvc@qEnl@wUphApM~]|NvzAiB`o@wHdWpC~PuXlJ{IoMqIlNyFrR`Mlc@eQzCwXbe@uM~E}Rz`@oWcq@yJyd@ki@q\\\\ki@ee@cL}YkLue@zEag@F_\\\\fNkTqHcm@_EuNsMkY?aRbEkRnQyRjYac@dd@_AjZrEtYia|IuziCunAaY?vi@pcAdBy{~A}ryAn[`d@p{@hIb}@n_Ayw@hz@bE`i@ecArhA??hd@dXtI|NtZiC|i@}d@pPcAhf@mMbRuXfy@aL|d@xH|IsJbtA}\\\\~zAcIxs@uIrFjFtnAys@hfAqV~t@wc@ol@_I{r@gs@|a@wWc{AoXt@sL`w@`I}@wZg_@oPm{@qC{HySxLoa@kXu_@VkQb{AiSnc@Rre@g\\\\|n@zHjnA}Tk@iKfUcZxp@_BdDkRsNuK|f@kb@x_A`E~QeBxNfMhVqA??jN_g@tMwSaKyDmq@bAiWsL~PuOdi@_JwBiJlXkJbf@}g@kL{ObEi\\\\b|@{Mv_@lFzGoNx`AuNbS{c@hDi]b]mMyYyRpQiy@ok@_c@lH{I??afAqa@n`Aw\\\\??ydCwnAay@cc@oV{^n{Ayi@qXug@hw@qm@ci@qt@tgAcfAsx@cn@t~Auh@cHwj@oq@wDiiBaX??o_AwTseBxd@ejDzMckFteA_o@t\\\\cCph@jdAz_@`eBrO~uGon@|l@|F}dBxl@_C~[aCz~@moA`R{o@dOaGi]rd@yYwf@uVavCze@us@eN`i@yl@spCe|@ux@pBky@zTkc@}i@bs@gd@s]md@|l@we@ymD`Sub@~a@bnAtFMxa@ep@jTq_BqLiNyf@qaCy\\\\ayEst@en@`Br|@|d@olAnEyk@kTctBu@y{A}XefAtd@afAmh@n`Aec@o_@sSswD|QouAnRoaFlfAyh@w_@p~@_`@x@gLhjAeEsSs\\\\l`@wo@z@_SirBsw@_h@ww@om@iKodDnO_Lva@fz@tq@{e@|RcStj@dMrtA}cAhe@xYvh@lyBvwAmfAdH{WoUwcA_OsO}]au@w\\\\lc@qb@e\\\\gh@jcAcD~Mya@{p@w}@dpA}q@{nBci@nMmk@e^m@{_@ra@tWh{@{aAlJn[al@sgBqWu`CiBorBrb@pv@as@fEqaAukBsKiuCvAmfCeGvq@u_@igA_h@yfAw@oxB_^adDiGyScPccDyDcr@`MikCg`@yqB`@eP_Zwz@sYqrCsXejBfSbtAlNqlCpH{Oz]cx@eNuuDX}kCn]cq@jVpNn_@bdAnQfcDta@|m@pQolAvGm{AvNiw@yJ{^bg@mZgO}bB{HogEhIgNf\\\\idGhHqBwn@scC|IwbBI}cBz_@y[~f@~c@dYomAdp@iaBjXi{@q`AgcBb[oiByO_xBdR_m@oPgeBvGbl@_y@oqAaZosPpg@et@bd@sbDvn@k{FyJm{BfI_s@zXpFtl@_lAxPsrAyKymBs@_uBfKouB}E{kBpv@mlA_Spq@}f@yZwZmfEnP_aCwBwrDx\\\\ovAfZ?~wFLJjoAlZ~oAqCkw@f`@ed@nr@{[xOgFzXbOpOnsBsLtmD`n@pv@fFr~A|j@tyAje@~Uj[lxAgj@xaD`p@l[eVd{@vYrrAqGbSbh@~iAn{@gAfXefA~LjG~yA~x@hAxYfs@_Y|YflB|^tThfAd|AfNvQn~@`yAfy@bVaj@vYezAza@{iC_]uuAws@id@gBe\\\\c`B_MunBumAqjBg_AkoB{p@gq@cwA~jAhDnd@lr@p}CtcAdr@{kAh`DfTl{CvgBsr@he@njChOr_BlEoCel@b`BoHllAv]b~DwIplEnQniE~xBnnFjrCoaBzFu]df@w{@zL_g@g^qcA`CeyAvcAcAdt@zo@l}@fDriAd[|bBd}AlyA|Sfj@zsAvgAdsAdgAjg@|c@frAtc@lf@Xff@m]zrAvl@vHxS??????vG}I??Jw^}^u@_H{hAnOot@st@aU{jA`Jai@y{@kTmcAiW{Uy_@gw@ffBlQdu@rW~}AAhXwy@~hAmk@xkB}RbVg|@vTke@lV{Yre@a~@zu@_Vp|AsQxqAt@tlAhJrr@`^ia@zMWna@va@~Rlw@haAQnZ`wAnf@~iAsVpiAfDv_@}Snd@wEnzA~j@hqAjIlx@nNvmAeI|x@R|d@}^d|@_]r}@gG`nAdG`z@pJxwAiY|Jym@nhAaOtw@iF`eAyXt_Av_AkXxc@v{@nj@jyAuNj}@gAvh@g\\\\f`A[hu@eR`~Aj\\\\fvBxt@|`AzIlWbDd`@ge@noAjGpYoYvj@cK`]cc@na@gJxxA`ObuA_c@f`@t_@tjCu}CvnAio@{UsRr{C~y@|z@pBeDca@hoAiTf`AfNtRy_AhoBmLdw@|Xj{C`Vn]lNzhFvTt[hTcl@xi@~z@fOuJ~O|z@n]gdB|i@tNr\\\\vvAuAdQpQ|nAm_@`bBf@haAjY~hAgXvhCij@r`Br@``C~bAvFrl@h_Agc@xp@tcAgQvKbc@jn@at@ji@km@w@{f@vh@jEd_@cdvDag}CefCaMmxBl^}nCl{@lNdw@jgCxF`mDaQvfB{V~n@yk@ftAiKkzgEazyCk}Cnb@pQjXh_JbWeqBaqAir@_F}cnGqusCadDvA{`Fb`@bp@lm@jeFw@tfBxMxzBug@s`@}i@{n`HcdrC{{CjOfgAtW|bBqDbsBuW}MgSmdpGshnCiz@uWcmAyDywA|VqFlOv}ALb_C_F}qvA{k|C_yBkJ}}AWyKxO{b@}M}y@iIu{AtLdWpHzrAfGfw@tCtGhI`hAhItbAyMqb@oRukk@obiB|qB\\\\|kAaFeMoZguAgSo`A|IsZzHtEbPgogBk`oCstCyu@zOk[yjC_`@imEeg@_oEuJajBeVsxBcGmj@tW|h@lRn|E~]x}Dx\\\\daEnz@b|A~{@~`Bb{@wKzr@qvBhr@|c@lDfkEcGpOwZbpBwObHw`@{~@kLbAca@_{Bit@ecvGq{gBsTf{@r@n|@yX`~@{}@vmBn{AuSle@hyA{{@`_Av@tj@hn@ud@~g@jo@pJms@}E{{@bFmbAoMgn@wAqrArc@m|@qDmtAwx@w[xW}[yZyG~stIkgbCjDze@ci@nNnMkl@uhDhHiyBny@||@fZleBlEp@`|@~W~Kpy@{@rn@wTbrAgQ|LcZn~@eI`fA`G|`@yTqLgVziAxMe[l\\\\lb@nY?_xFcxCvn@j_|IymiCrpAxB?wi@_GsA_t@BkyA|PjDnGwh`AgxxAmOoNmk@lLcSlAcGjKmHz@OlDq]`Nw~@wBdKhUlcAxIxsAdc@xa@wKyLk\\\\hcAgQaJ_Kyz@ySelz@|eAyWfb@rBvc@~P|F??f`@cCbRrb@|d@}CwDea@sGyCiAed@}PmPeNjEr|Oo_u@AdCd@`KDt}AblEgB_Az~Cpy@rDhNb_@{JfyAvsFKrLxSuAkYa@@wkC_DoFoUsXa[sSiuA{uAmbAk\\\\ymAqRqCiSuo@ss@wEsUbGk[?cSeMse@aAl@m`@wgcAyix@qdA~H_ZgR_NoUun@uGgI}SuSsIh}@m}@e|Bk^{JmHijA|Oc|Avj@eoDt|BgsB~Cuv@~DqNx\\\\ek@s@oWzt@w]hMuI|Tqi@fYyBxXfExS}F~S}PnPkGnSiHhN{QlKkPmC{JzVkAlM}Vh~@{zDn^qKeLu[fk@th@~{BnzDn}@dsD|Vjy@b[vk@r`Ad\\\\lIrNyS|VbBl{@gElJgEbgAl@|OrDtXgOpOv]kEhYlZ|R`GuYzQyQxC}Wh_@kUh`@ms@rP{q@dj@aj@zZgIlh@qz@dFmj@sAad@xb@gdAh\\\\mWv`@{KpSyb@kBeMhPk_@fQ}LlWom@`e@mq@z^{i@b^FwHga@wA{Tm~n@iaOpn@iZtT_Q~BmRcI_YDoX~b@af@bFwYWeN|UkQTic@bLcW|TrBiE}UeOaYbF{XqSeR~KsMoOqe@q[am@{t@jC`BawFWgY{fAE?y{BgzF?oqF?{vF?eSh|@vLjJcHh_A}UriAyVjNea@bVr^rb@`m@hIrRbRdEph@|YzzAuE~W~Htt@jXp|@vd@|]vYvn@hEpXr\\\\nPlQj`AYdw@Vuo@rGg@a@c^nFmTd_@uWnFal@oFcm@~[iCfC|Lpd@fB_NfQkDnd@ha@ja@b^`l@d_@lEps@oc@rVzKlEfQd_@xJbAzKf}@?pG{K`l@eApUvIdPkDd_@mc@tIeP`l@pGdP~[bOvv@lTxJdRxEcf{@izE~u@qh@zMuYxa@fLz[cCvOnI`[qFzd@sr@`IyRtm@wWxNod@~X_Z`i@q_@PiSfa@gXni@mWeRyEmTyJcOwv@eP_\\\\al@qGuIdPe_@lc@ePjDqUwIal@dAqGzKg}@?cA{Ke_@yJmEgQsV{Kqs@nc@e_@mEc^al@ia@ka@jDod@~MgQqd@gBgC}L_\\\\hCnFbm@oF`l@e_@tWoFlT`@b^sGf@Wto@hHbRd`@n@hTrb@ke@nCu^l]}I~Wq[nM}c@~bAji@dh@le@hd@le@v[~j@Chq@rMtf@_Mrs_@upYvXuo@d^gUoZyJg]}j@{Ma_@kTaSa^lDo]sL}a@Uy\\\\jQoh@pOyd@|l@gh@|i@{Aze@iKxb@mVpPiDbWzAnR~GnBba@}CtC~EvLj@|k@gNb]SnrBsAxO~EtS_A``@dIhI{n@}w@h@_NwGeJQeVmMyYfLcZ`@aZ_MrKaQrSnIjRGtWkNxR^bMvMms{HdnSoPlTtj@KvVme@id@bN_xzH~vQlHnJhm@cu@~Kkd@gT?oU~p@gdyH`hRhWj@je@iE`LsH}ByWgh@xHkSbLoxvHftNuMxRsApK|o@oYfa@mUlVySiHkEw[~Mg|qHzuL{WjSlKpBhZgMtXuXgBmI|zXmkPm`@oZeFiPuIoLgPm@qMwJ_q@@kPjUqLfY`AdQaIhOT|UePqBb\\\\d\\\\d[z`@hBdQ|M~RxOsC~k@eXp_@o`@|IyUpomDod[kQfDoLlK{Q`IiAlGmZoFyKnCoGvEhC`X|EtMdc@]nU_EzXmKta@{BvPkL}@eHmTwNwJ}EhBkFgr~AehUJ`@FvX?~}@?r_@d[je@rj@ds@ps@JhkEeiAzVgU`Vc]`Vma@sLcU_Vm`@kSnJgKzXe[bY_^F}y@_O_cAmFav@kR_^cCiUkJqb@gAafpAdhB~c@qr@VubFsu@{eAcPuRag@e@uv@ak@mpAwAqoDqzDsj@es@e[ke@?s_@?_~@GwXKa@_Se@y[iHc`@iEq\\\\kTuVEm@hPvDhc@Ez_@dLpUrPpbA`]xdAre@xnArt@rzAjt@~dAnhAftAp}@pq@n|A`}@fy@pn@jcAtjAlM|_@{wc@itxA??{n@mO_f@xA{`@nW_F|Rce@tM{CvXmc@dQsRaMmNxFnMpImJzIlNdMsDxUk]~YxVnRnI|RwElFfIxG~[^fTtBbAuCoFmF_FgNzGJbKsJhI}AdG}HrJ{B|GyGdJlBrGvS|MnCcDkDxV}KpSwEbHsGpOwIuMwAcHk\\\\b]aWsNoZtUD??aWqVxRyPxniBooCxb@gLn\\\\jEdXoDfE`QmIlKrDvK|`@cDde@iu@dGgb@`SCtZkl@qJg_@jBwM}d@iO_Iew@{iAnKuEgJqq@oCebAvOp_@vt@}Cvi@qW`d@|IzYnDr[{`k@{z~AhPhOdKdXjLjE|aA_RlSxBtMtMj\\\\xFvE_Cl]vHxWx@~CpKns@tF`VyEv^_OfEuT_D}F{GwLuZ`@iTmEw@yD}J_BaCgMkMuAuHgJsQAqBvBuXoGo^dU}c@kLo\\\\jE_l@yG{}YyyyAsr@xCq^eMuu@q@{JoIqITcK`Tvp@rO`EfXvTjEGnPpWg@fTeIlJpIpj@cA}LuD~MsYepTo}qBqZ_c@_s@{i@uSohA|f@s^xB_rAqg@sy@_}@`@wTwWvUkT_`B}vAq}@gdAgh@ok@_{@DqOwa@ytB~HcHch@ye@qAirAp]o`Bpi@u@f_BaThWnjBtPp{@rj@wHfe@lbBfq@twBxt@nl@~vAmk@~j@yz@ta@lx@neA~_ArMxV|gBnb@py@xjAaEjb@pp@jgAzAzRaz@hs@}eAos}@zes@vKvZpc@vEhd@{`@PsTaPmV{DgQaQmCq^lJgH`[owdAi{~@d@MmGoH\\\\qXiNga@ca@qVfIoWb[eBxDyn@iNwXwOuLuOuLkB{a@oSdKycAkPg`@vJmr@E{fAmVu`@`@cfAwH`_@~e@da@lN{Dtl@rVpjAjiC~_AjyBraA{pm@wfe@aB`wFzt@kCp[`m@nOpe@_LrMpSdRcFzXdO`YhE|U}TsBcLbWUhc@}UjQVdNpf@rIt^hXdl@dcAxy@|[j{@{BrPvDeE~Tp_@zTpYjWtmA|VrNeMhIe@pJ`Otr@tCyH}OtRaj@xG{XfZsIzc@mc@qLo\\\\o[fEsPmC}a@R~`@yw@gAqh@dCmh@xW_g@gEm\\\\bg@m@Egg@`YcV_ZiqAwnA}y@gBipAcWy}BqL}Y~XkT^{RjViOjNc`Bc~@ea@gxFtvBgw@inT~Fz_@cRlQuT|TkAr]qKzKxApnCkNbj@hq@hL|L}TtOsf@|Cc^yLgw@tNyU|Dgp@Ckl@bYg_@sCoReolEa{Zry@_HxoA|J~f@~r@yMljAbw@u[lt@d@cHcp@~u@J|CvcAv`@hzAhSdv@gCfl@wg@|@kX`x@eJ`u@{a@xb@{d@fFk_@l_@lStXfh@nFzCc_@~q@kZzIdJtW_WtI}]f`@ib@f]s\\\\fItc@zJua@yE_f@mQ}z@g]g_Aia@gy@lW_x@_@_\\\\bF}a@th@sp@|Mk^qToJ{Uku@pXgh@tf@sl@d]yu@kYkJo[qbAck@yAmc@cZyb@mMaZhRqBpd@gi@xAjNz`Ao@`w@{`Aid@uQ~Isc@y@qKwTgn@hCqn@vq@{Bt|@sq@nu@xAzs@kncCqpgAcb@g~@nLqm@zl@{MeOoZes@|Aw\\\\qa@yRcg@srAoM`L~[}GhPyXq@zUfR~bAmI|D~b@wbAyCglAhScuBoH{Nxx@qSiE}d@fMdAhWkHrb@l_AC`j@qC|e@|ZvZfEvTbLvWoSyDos@|Q}AyEcRx`@eM|YvTpEdXrHdHjd@i@dSr[`TaKdl@`SkpeBmrpAsZyS}eA_Lgi@nPwj@~o@a_@aBoeAYfIo^mt@qTss@ic@esA``@uEzp@}VxKqbA{A_ThJu]l_AofAdj@wg@l\\\\k`Ap]crAvYt@fe@zQ}@l\\\\uOxHfUts@`KnK~p@db@~Qhp@lH`Lh[bn@hGv~@uVnDss@pm@eAlfAkv@|p@yEbdAu^lk@wDlZrJvh@y@nk@vb@zu@`KrJek@aHk`Avo@eTaOwi@nh@uByLus@}y@jN}u@_Spl@od@zPwb@hq@|NjExl@qasFxjPiFwMyt@aMsj@cAoRyFuVvF~U|Ob`AjZhs@|Pd@}Q~mwBo_T}b@cGcLdAnApm@ds@zEfJsDcQePsoQgez@rYeoBpe@eXPcN`r@gd@pDan@qe@{a@uMqr@zHqz@uKa_@acAgXwj@nFx@r^_t@_VmC~Jf^r]L|[uTnNfG`u@bh@l^{J`a@i_@`@wNv\\\\wVvHpB~n@l]|PfR`S|i@`WuEzXlDlYimvAcrgA~\\\\nI|T{NtgAaGxYtHbfAvHt`@a@zfAlVlr@Df`@wJxcAjPnSeKjBza@tOtLvOtL~Ui[uVoVbe@jDfs@mM~i@~b@z}A~Epq@o`@jbAcAlM|Xdj@lFl{@i`@fcAb@~c@c}@tl@ua@m]so@rf@{\\\\idAwz@g_BoAgYon@cvBfGcjAog@ygAuPmfBi@alB`k@uxAbWygAsHwt@pDyhAs_@saA}Ae{@t]sI~T`Ej]om@pNsWfQxi@xPoRtfAdKhRea@bq@i_r@eupAu~@sRyt@jGmF~Vou@dSjJhNdiAlBtYhRbs@t`@tRc\\\\[{K{M_FiRcf@czlFssn@rd@dcBxYfr@|_@ws@bFim@yc@k|@_q@in@o[pQ_faAjz@qIzEsaFh~BgCfc@uxAn}@x[~kAuBlb@_g@vU{@fOdPvd@qB~Q`Cz\\\\yTbf@{Xr|@}UtL??vp@fc@hcAfWnd@_@hUvQnj@r@hOzFbjAsP~m@`DnP_tAdTc\\\\pKiPh|@sJlb@yQvf@oIzWmIbY}N??v`@wmAfc@_b@nKgc@gEo_@fJox@{X_BsUsUkWq_@kNcLPiSlLcMrBsW??_Q}FsBwc@xWgb@}ToFocAV_faAjz@j~BxCncAW|TnFhd@fRdNkEQcn@oM{VoBcq@cLa\\\\}Vs_@_WqOaSeU`XoGyBahA??wXaPuf@~Liq@sM_k@Bme@w[s\\\\jj@iFj^oZvfAvUpl@v]jh@zPhXsa}@kwdBiVpAyNgM_RdBy_AaE}f@jb@rNtKeDjRyp@~AgUbZj@hKknA|T}n@{Hse@f\\\\oc@Sc{AhSWjQjXt_@yLna@zHxSl{@pCf_@nP|@vZ|p@~Cph@dSny@hBzt@hVeBl`@lH{@bGkKbSmAlk@mLlOnNpGyEd`BwNhCiVzx@tFdVla@lo@dm@h[wIj\\\\`IzZoJuNyE}ImTcP}RlCeJaL_DeEtGyc@x@qOsCtJiEmCiHxT}N`HcYvUeIoCeTf[yOtXkA`m@mRph@dE|MdHjY?tNrMbm@~DjTpH~[gN`g@Gte@{E|YjLjCwOta@_PeKeXiPiOsLtBbOc[yw@_s@_^gFuEoPl^qu@{\\\\mAga@}Omo@m@c~@|CwdA~Mgp@f@oV~GmV{IkOrMkw@_B{W~D_Cm^iRuLppoBn_z@qg@sEu}@ho@eVy@k_A`g@_p@na@cc@pi@pZr\\\\iPjb@~Yhf@reAva@bm@oKx`@tExx@{Yji@`A`e@sa@yCkg@qL{LPg}@uOg_An|nFou~AopD?qxD?m|@?o}D?kwD?ozD?szD?ksE?ytEAk`C@E_WcTIcJha@mRpIsj@zBy~@|Hs{@jRsq@cG{kAfOmSS}v@uPsy@tUc|@dWsq@xSoo@~RaElOuMbExBdEwO|@eKmEcBxMqKzHeP?cHrFtFbJc`Ah\\\\iLvw@oKhu@fQ|c@j\\\\ja@vLzTj@nE_F|GgTzHuN?qgAk`@m_AyHwpAc^e@iErDaRbIgKg[}Hk|@Gkx@?_SiWyF{CaaA_l@e[oJ}}AMerBAgEmN_ScBqYuHeUm[aRso@un@en@wSlO}h@sIwZ`Q@dtA{g@hb@wInSvaAh]d_ApT~`AnQ``@bd@rI`MRb`@sSb`@}Xp@pEyUwQzL~CzPdi@bI~\\\\e@fm@zIdZbBhc@`Bbs@bQyzAwJoQxJnvAvQxf@B{@uF`RhPmQzAnL|k@nl@`o@rC_OvLgBnSuN_Lt`@oNbJ]rV~RfWdb@|p@tDoAiRoi@|^{VhF}r@`K~YkLtf@hh@yH_j@bSuAnz@}PhCoErTyGn}@vf@jm@t_ApQ`h@tc@d^~Bt^|U|G~SpcApg@fb@v\\\\l\\\\`d@rHjk@_Jjj@{Snt@wZfk@K~Yq\\\\ngA|@bi@vAhWpNde@tQzFv]qFzHmZvVkMb`@wt@`\\\\yn@jHmWyKoh@nPka@vo@is@jWqH`~@j[dJcBh]e\\\\df@mNreAzFnv@}Ern@hCzXvHgJrO^hXgLjKzJdGdVeHnVzJhl@_Atm@_`@nu@xFll@oMze@jCrs@rMzw@hm@b}@~Yba@x\\\\jMb[Rbj@cB~\\\\{JfTjWz@jk@wLvo@kRnPk\\\\vLwj@zc@sb@rTsc@j^yi@~j@{Wbr@d@jf@jp@zr@wQh_@{QpNka@tSs_@dd@oZ|^wRxUeUfkB?BxXpp@?h{BLpmC_k@j}Ak]{DgKjnAxE`fAxCnI}^ng@}b@d\\\\oFxE}P`b@cBjU{O`y@eE|NcIpFga@t{@y}@~r@{uAeAmMpZuSjo@ks@rG}q@h`@ca@uLyr@dAst@|R{n@mW{y@qFww@sFuw@hJ{rAvRmt@dQ_\\\\qFgKkyAfTi`@~y@mNoO~Hgr@ronH_ff@aJlDeIjG}NzTn@nBlWhL~RxHbHlIpN}Gy@oPhIwUaB}E{IeIhCiKsByDwCb@vtoHwpg@dDnF|SnCxIeLdFaDP}BcEiDgU|DjdqHqjh@|@vEn`@y@uCsFpssHili@eD~BaQtSjBrBnCYvTeA|FeMlAoAjgvHmkj@i@pMlFdE`TkJgBqCqHcEfcdI_}tBsp@rD}D~Vje@vH|g@uJ|d@_PxgjHafpBoh@fCoYjR`u@t\\\\l}@xV|^cOtHg\\\\ww@gUrjrG_dgC??J~fFJzbJq|@x@{{@hPsj@jZqv@`h@w{@}a@w}@gSe`@h_@ci@rXex@d[cf@xk@{~@hfAgiBvf@w@lf@va@b]????ja@oV`v@}RtPou@poAqq@t`@_z@~z@aCjbBo@fhA_Qf`C{_Axz@{JhlBgUpuAhD|yBw[fiAsYjdAfL{Klj@pa@~BhgA~K~u@bTfdAfL|Gyc@a[i|@maAgRbPsNtnAxa@ri@ph@`yAnk@ul@h]~y@|k@dbAbYp}@`RnNtZp`Bf_@vRj\\\\bhAtY|i@yChy@lPl~@hT|r@zShjBzPvHoIkcAe\\\\c|@iRsaAea@olAaFy]sXuuAmd@}LoKcm@aUyIkn@w^}c@`gA|QbSwIz`@vUxg@u^xOjUjVc^n}@~Wje@AjDed@iJ}Ufg@gUfpA~Jvs@i\\\\vi@_NHmb@bo@sYeW}b@}q@{a@gUa_@sq@qC{i@~Hkq@e]ml@jDqn@kRpJq[~a@gJgm@cWje@VhaArL`RvLfp@wLlwA~EnzA_NfYcXbnAic@{vAcYkjCq]kr@?nGf^}bCmAvq@we@zkAwVlk@g^|z@uYztAwR}a@w_@{mBaA{mAm[{Mm]{~@u\\\\{{@eFouBwZmx@dCe_Bi`@q}AbLgl@f[wZcKshBvBvBjMs~ArIw~@gEubCvRewBzDco@bGerAeIw}AxQflnImq{Bse@|J}e@mEoq@nOc}@hGdDxEhn@fLrn@qLvVkJbv@rBzMoD_ilBytoAlAmeF{_D}c@uJlD{_Bvk@cr@rVuz@jw@ihAcHejB{CyiArl@tCt}@o]LuKfr@onA~@cPr\\\\gVMkZuk@mqAqj@yb@qJqQbEls@ng@cm@nVok@qNaiA|_@~nA~k@pn@cExXp@|GiPaL_\\\\rrAnMxRbg@v\\\\pa@ds@}AdOnZ{l@zMoLpm@bb@f~@bn@eLxa@Mu@ge@brAwYj`Aq]vg@m\\\\nfAej@t]m_A~SiJpbAzA|VyKtE{p@dsAa`@rs@hc@lt@pTgIn^zruB_dIiGrPzUzVzdAjV~k@tH~PvMtp@sNhm@}FtJvD_[dOpAzh@uGjf@}s@jDkBbLrk@xPfFlYvXfInm@rM`KbRro@`Cja@a`@`Rk}@rOyTtUyLu^a^dA_MvPqQpKqh@{Cyk@}L_TiJs`@bUwIrb@bF~k@kBfXtE~j@wt@hc@_GjoA~DzMwTjNgDfAaLmFcV|CcXvLwL`Gw[f_@eCiPqc@uFqk@cQgVeW}P{Ng^cg@mIv@vMtc@hFkSj[Vt_@pZfc@sVrp@}YaCaMel@jR_UdBin@{lAkXtGo\\\\}TuRmUzj@yj@`@sg@xa@mAtScw@PwaAmEyb@~Zyn@vFab@qRUuNmlAyB{iA[`t@nQiTn\\\\_q@tCkn@v]_I`q@q_@m@oWvMpp@tc@lDxUkTdVnNtJle@`Ig@z[|OdP{wjEmnScu@cXs`AqClZ{d@_hBao@wF}iAnMsh@kJo}@vNek@hn@mj@jf@av@|r@{hAziAkd@{PoU_g@kOfWou@|kAO`[ww@pc@kp@q`@gN{p@Hw{@eFgt@i`@c]lVcx@lJzH~b@w\\\\jX}}@fOlrAlt@`s@`z@vLjj@yn@z`Amy@tpAuw@pe@_e@dq@s[trBlG|lBbs@dh@pfAfg@~q@`s@|lAdy@tUag@qPii@areIf`^gf@zb@rSfG|SkZqwdIhr]|GgPh@}n@}\\\\fRcIjq@xOyF_qdBobd@{o@bfBmStj@fl@xO`KvZn@hTd}@jYzbBb\\\\~v@bk@nZlBvQuBpc@|Xxf@~Jls@fBxNpBtLnOjOpCrHzN|]k@~RnGfj@eBfOoc@w@ea@dImQfKem@|PuXoKaBlEq[sFaKxAgZmZ}RjEiYqOw]uXfO}OsDcgAm@mJfEm{@fE}VcBsNxSe\\\\mIwk@s`Aky@c[q|^`yv@}\\\\}]uWbPoIvYa[nCif@xJq`@qCyv@}^AyeF{OjHad@jz@xD`e@_M~Twk@kEg^}Zs\\\\yQgN}\\\\o]mMkYpFy\\\\nP{q@bB_g@qMiEoR_J}\\\\_a@_DwQmVySuh@cw@sm@mwAam@mXTg]rIaToFe`@fE}\\\\|vAiOjk@dJtdAkDlUp^mJ`QlCzDfQ`PlVQrTid@z`@qc@wEwKwZkn@NrNnl@jF|r@dOd[ri@p^dK`HnYv^lPb_@lb@vk@reAn_Abk@nd@dn@l[j`AfWx^fB`GjP~d@gH|]zJvbAaKzd@rFzXgBl_AtWjt@zHre@rVl[n@lYgUbTe@zY{Z~AtGhGyOKuc@hS{h@eSkJr@}n@|g@oy@l^}s@@Ecrw@vpw@fZgRf\\\\tKx`@nWj`@pf@{m@`o@kUeEoJ_Sya@wHsIkSeRm]g`{@fhOcY|N{WlIwf@nImb@xQo\\\\zZ}N`t@tI|OpKrq@_Kxr@rRvT~Q`y@{_@dOt|Dnr@}Dnk@hn@pGrb@zWpFtTjUzCju@lr@ra@lg@`Tl@hSeFzdAyEfJuCLeDtWcMng@qBdr@dMxg@af@bi@cr@{A{eEcaCXhDqTiHmV~Ii\\\\cFi]rEkRqTp@sBlRg\\\\o@uf@vD{Sj[aq@tGee@uRaMv_@{n@tGaVtYsXja@{n@NfDkbAbPjJvj@iWzOcJwFw}@cJ_iA~LqZyP{f@wOoF}rAqIm|{@vmj@d`@gE`TnFf]sIlXUxf@g[jo@qHjQsf@BaUvYuEveAucAtRec@pKcJ`W}p@{dAxEiSdFaTm@sa@mg@ku@mr@kU{CqFuTsb@{Win@qGaChVcs@g@}[dLoLlNw\\\\pCo_@`SCbnAdKhj@tAtm@aIpQ`Fvc@lHtDnO`l@\"\n", "/**\n * The vendored boundaries, decoded once and held.\n *\n * The generated module beside it is a string and a table of ring sizes; this\n * turns them into flat coordinate arrays and memoises the result, so a document\n * with a globe pays for the decode once per process and a document without one\n * never pays at all. That laziness is the whole reason the data can be a plain\n * static import rather than something threaded through a resolver: the 40 KB is\n * transferred either way, but nothing is parsed, allocated or walked until a\n * globe actually draws.\n *\n * Coordinates stay in **degrees**, not pixels and not sphere positions. The\n * texture resolution is a prop and the projection is `projection.ts`'s business;\n * baking either into the data would mean re-vendoring to change a number.\n */\n\nimport { COUNTRIES, POINTS, PRECISION, type CountryRow } from \"./data/ne-110m\"\n\n/**\n * One closed ring, as `[lon, lat, lon, lat, …]` degrees.\n *\n * Flat rather than an array of pairs for the reason the Protein's structure is\n * flat: the map is redrawn whenever its style changes and a pair object per\n * vertex would put ten thousand allocations behind every colour edit.\n */\nexport interface Ring {\n points: Float64Array\n /**\n * Whether this ring cuts rather than fills.\n *\n * It is drawn either way — the nonzero fill rule does the cutting, off the\n * winding the vendoring script enforced. This is here so a caller that wants\n * to *outline* only the coastlines can skip it.\n */\n hole: boolean\n}\n\nexport interface Country {\n id: string\n name: string\n rings: Ring[]\n}\n\nexport interface World {\n countries: readonly Country[]\n /** Every ring of every country, in one list — the order the map draws in. */\n rings: readonly Ring[]\n}\n\nlet decoded: World | null = null\n\n/** The world, decoded on first use and shared thereafter. */\nexport function world(): World {\n return (decoded ??= decode())\n}\n\nfunction decode(): World {\n const countries: Country[] = []\n const rings: Ring[] = []\n\n const cursor = { at: 0 }\n for (const row of COUNTRIES as readonly CountryRow[]) {\n const own: Ring[] = []\n for (const size of row.rings) {\n const ring = { points: readRing(cursor, Math.abs(size)), hole: size < 0 }\n own.push(ring)\n rings.push(ring)\n }\n countries.push({ id: row.id, name: row.name, rings: own })\n }\n\n // A short read leaves the tail unconsumed and every ring after the mistake\n // shifted, which draws as a plausible-looking but wrong world rather than as\n // an error — so the two halves of the generated file are checked against each\n // other here, once, where the cost is nothing.\n if (cursor.at !== POINTS.length) {\n throw new Error(\n `globe: boundary data is inconsistent — decoded ${cursor.at} of ${POINTS.length} characters`\n )\n }\n\n return { countries, rings }\n}\n\n/** `count` points, delta-decoded from the ring's own origin. */\nfunction readRing(cursor: { at: number }, count: number): Float64Array {\n const points = new Float64Array(count * 2)\n let lon = 0\n let lat = 0\n for (let i = 0; i < count; i++) {\n lon += readValue(cursor)\n lat += readValue(cursor)\n points[i * 2] = lon / PRECISION\n points[i * 2 + 1] = lat / PRECISION\n }\n return points\n}\n\n/** One zig-zagged varint. The inverse of the script's `encodeValue`. */\nfunction readValue(cursor: { at: number }): number {\n let shift = 0\n let result = 0\n for (;;) {\n const byte = POINTS.charCodeAt(cursor.at++) - 63\n result |= (byte & 0x1f) << shift\n // The continuation bit: set on every chunk but the last.\n if (byte < 0x20) break\n shift += 5\n }\n return result & 1 ? ~(result >> 1) : result >> 1\n}\n", "import { world } from \"./world\"\n\n/**\n * Every boundary line on the map, each drawn **once**.\n *\n * ## The defect this exists to fix\n *\n * Country rings are stored per country, so a border between two of them appears\n * in both — and stroking each country's own path draws that line twice. The\n * claim that this is harmless with an opaque colour is *wrong*, and visibly so:\n * a stroke is antialiased, so the fringe pixels either side get composited\n * twice. Coverage `a` blended over itself is `2a - a²`, which turns a half-lit\n * edge pixel into a three-quarters-lit one — and the eye reads that as a bolder,\n * wider line. Internal borders came out looking about twice the weight of\n * coastlines, which are stroked once because their other side is ocean.\n *\n * ## Dedupe by segment, then stitch\n *\n * Natural Earth's neighbours share their vertices *exactly* — measured on the\n * vendored data: of 10,360 segments, 2,658 appear in precisely two rings and\n * 5,020 in one — so a segment appearing twice is a shared border and one\n * appearing once is a coast. That makes the dedupe an equality test rather than\n * a geometric tolerance, which is the only reason this is a small function\n * instead of a topology library.\n *\n * The unique segments are then stitched back into polylines rather than drawn as\n * ten thousand two-point lines: a run of separate segments has a cap at every\n * vertex instead of a join, which on a 1.5px stroke reads as a dotted, lumpy\n * coastline.\n *\n * ## What the caller must do with them\n *\n * Draw them **instead of** stroking the country paths, not as well. The country\n * paths are then fill-only, and every line on the map — coast or border — is one\n * stroke of the same weight.\n */\n\n/** One boundary run, as flat `[lon, lat, lon, lat, …]` degrees. */\nexport type BorderLine = Float64Array\n\nlet lines: BorderLine[] | null = null\n\n/** The boundary lines, computed on first use and shared thereafter. */\nexport function borderLines(): BorderLine[] {\n return (lines ??= build())\n}\n\n/**\n * A vertex's identity.\n *\n * The integer form, not the degrees: the decoder divides stored integers by the\n * quantum, so two rings that share a vertex hold bit-identical doubles — but\n * keying on the integer says that out loud rather than resting on it, and is a\n * cheaper string besides.\n */\nfunction nodeKey(lon: number, lat: number): number {\n // Packed into one number rather than a string: 20,000 keys built per pass,\n // and a numeric Map key skips the hashing a template literal costs.\n return Math.round(lon * 1000) * 1_000_000 + Math.round(lat * 1000)\n}\n\ninterface Segment {\n a: number\n b: number\n /** Endpoint coordinates, kept so a chain can be written out without a lookup. */\n ax: number\n ay: number\n bx: number\n by: number\n}\n\nfunction build(): BorderLine[] {\n // --- Collect each distinct segment once -------------------------------\n const unique = new Map<string, Segment>()\n for (const ring of world().rings) {\n const count = ring.points.length / 2\n for (let i = 0; i < count; i++) {\n const j = (i + 1) % count\n const ax = ring.points[i * 2]!\n const ay = ring.points[i * 2 + 1]!\n const bx = ring.points[j * 2]!\n const by = ring.points[j * 2 + 1]!\n const a = nodeKey(ax, ay)\n const b = nodeKey(bx, by)\n if (a === b) continue\n // Canonical, so a border walked one way by one country and the other way\n // by its neighbour collides rather than surviving as two.\n const key = a < b ? `${a}:${b}` : `${b}:${a}`\n if (!unique.has(key)) unique.set(key, { a, b, ax, ay, bx, by })\n }\n }\n\n // --- Chain them into runs ---------------------------------------------\n const segments = [...unique.values()]\n const at = new Map<number, number[]>()\n segments.forEach((segment, index) => {\n for (const node of [segment.a, segment.b]) {\n const list = at.get(node)\n if (list) list.push(index)\n else at.set(node, [index])\n }\n })\n\n const used = new Uint8Array(segments.length)\n const out: BorderLine[] = []\n\n /** The next unused segment at `node`, or −1. */\n const nextAt = (node: number): number => {\n for (const index of at.get(node) ?? []) if (!used[index]) return index\n return -1\n }\n\n for (let start = 0; start < segments.length; start++) {\n if (used[start]) continue\n\n const first = segments[start]!\n used[start] = 1\n // Grown from the middle out: forward from `b`, then the backward half is\n // reversed onto the front. A junction picks an arbitrary unused neighbour,\n // which is fine — every line is the same colour and weight, so where one run\n // ends and the next begins is not visible.\n const forward: number[] = [first.ax, first.ay, first.bx, first.by]\n let node = first.b\n for (;;) {\n const index = nextAt(node)\n if (index < 0) break\n used[index] = 1\n const segment = segments[index]!\n const far = segment.a === node ? segment.b : segment.a\n const fx = segment.a === node ? segment.bx : segment.ax\n const fy = segment.a === node ? segment.by : segment.ay\n forward.push(fx, fy)\n node = far\n }\n\n const backward: number[] = []\n node = first.a\n for (;;) {\n const index = nextAt(node)\n if (index < 0) break\n used[index] = 1\n const segment = segments[index]!\n const far = segment.a === node ? segment.b : segment.a\n const fx = segment.a === node ? segment.bx : segment.ax\n const fy = segment.a === node ? segment.by : segment.ay\n backward.push(fx, fy)\n node = far\n }\n\n if (backward.length === 0) {\n out.push(Float64Array.from(forward))\n continue\n }\n // Reverse the backward half pairwise and prepend it.\n const points = new Float64Array(backward.length + forward.length)\n let write = 0\n for (let i = backward.length - 2; i >= 0; i -= 2) {\n points[write++] = backward[i]!\n points[write++] = backward[i + 1]!\n }\n points.set(forward, write)\n out.push(points)\n }\n\n return out\n}\n", "import {\n command,\n driveCommand,\n easeInOut,\n node,\n type Command,\n type CommandArgs,\n Canvas3D,\n Geo,\n Graphics3D,\n Mat,\n Scene3D,\n property,\n type Canvas3DProps,\n type Color,\n type NodeConfig,\n type NormalizedColor,\n type SurfaceTexture3D,\n type Transform3D,\n} from \"@motionscript/sdk\"\n\nimport {\n lerpColor3D,\n resolveColor3D,\n snapFlag,\n snapValue,\n cameraOrbit,\n orbitProps,\n type OrbitTarget,\n} from \"@motionscript/sdk/component\"\nimport { atmosphereMaterial } from \"./atmosphere\"\nimport { arcSegments, drawableArcs, drawableMarkers } from \"./places\"\nimport { greatCircle, latLonToPosition } from \"./projection\"\nimport { mapHeight, worldMapGraphics, type WorldMapStyle } from \"./world-map\"\n\n/**\n * The globe's radius, in scene units.\n *\n * One, and not a prop. Every other length the node takes — a marker's size, an\n * arc's width and lift, the camera's `zoom` — is a fraction or a multiple of it,\n * which is what makes those numbers mean the same thing at any framing and is\n * why there is nothing for a radius prop to be relative *to*. The Protein's\n * radius is a prop because a molecule's size is a fact about the molecule; the\n * Earth's is a choice about units.\n */\nconst RADIUS = 1\n\n/** How far off the surface a marker's centre sits, as a fraction of its size. */\nconst MARKER_LIFT = 0.35\n\nexport interface GlobeProps extends Canvas3DProps {\n // ── The map ──\n resolution: number\n ocean: Color\n land: Color\n border: Color\n borderWidth: number\n graticule: boolean\n graticuleColor: Color\n graticuleStep: number\n graticuleWidth: number\n\n // ── The camera ──\n orbit: number\n elevation: number\n zoom: number\n fov: number\n\n // ── Lighting ──\n ambientIntensity: number\n ambientColor: Color\n keyIntensity: number\n keyColor: Color\n\n // ── The atmosphere ──\n atmosphere: boolean\n atmosphereColor: Color\n atmosphereSize: number\n atmosphereFalloff: number\n atmosphereIntensity: number\n\n // ── What is placed on it ──\n markers: string\n arcs: string\n}\n\n/** What the map cache is holding, keyed by the style that produced it. */\ninterface BakedMap {\n texture: SurfaceTexture3D\n}\n\n/**\n * A globe: country boundaries on a lit sphere, flown by an orbit camera.\n *\n * <Globe width=\"fill\" height=\"fill\" orbit={20} elevation={25} zoom={2.6} />\n *\n * Like the Protein and unlike the Canvas 3D viewport, it draws **one subject**\n * derived from its own props rather than being a room the author fills. Four\n * things about it are worth knowing before reading the parts:\n *\n * **The map is a texture, drawn in 2D.** See `world-map.ts`: a WebGL line\n * ignores any width above one pixel, so borders drawn as 3D lines are hairlines\n * forever. Baked, a border is an ordinary Skia stroke at any weight.\n *\n * **That texture is cached against its style, and the cache is not an\n * optimisation.** motion-script re-rasterizes a surface every frame unless the\n * descriptor says otherwise, and re-rasterizing this one means redrawing ten\n * thousand paths, stalling on a GPU read-back and re-uploading a few megabytes —\n * sixty times a second, for an identical image. {@link bakedMap} holds one\n * descriptor per style and marks it `static`; the schema then refuses to animate\n * any field that style is made of, so an export cannot mint a raster per frame.\n *\n * **The camera is three tweenable numbers, and two of them are places.** `orbit`\n * is a longitude and `elevation` is a latitude — see `projection.ts`, which is\n * where that convention is established and defended. There is no `OrbitControls`\n * here for the reason the other 3D nodes have none: a rendered timeline has no\n * pointer, and every frame has to be reproducible under scrubbing and export.\n *\n * **Markers and arcs are real 3D, never baked.** They are the animated content;\n * putting them in the texture would run every frame of a marker's fade through a\n * full re-rasterize.\n */\n@node({\n key: \"globe\",\n parentKey: \"node\",\n forkable: true,\n layout: {\n children: \"freeform\",\n acceptsChildren: false,\n defaultWidthMode: \"fixed\",\n defaultHeightMode: \"fixed\",\n },\n seed: {\n width: 640,\n height: 640,\n },\n})\nexport class Globe extends Canvas3D<GlobeProps> {\n // ── The map ──\n //\n // Every prop in this group is part of the texture's cache key, and every one\n // of them is `animatable: false` in the appearance schema. They are plain\n // strings rather than resolved colours for the same reason: a tween would need\n // a mapper, and there is deliberately no tween to have.\n\n /**\n * Texture width in pixels; the height is half of it.\n *\n * Structural, and capped in the schema rather than here. The buffer is\n * re-uploaded to the GPU every frame even when its pixels are cached, so this\n * is a per-frame bandwidth number as much as a sharpness one — 2048 is 8 MB a\n * frame and already finer than the 110m boundaries it draws.\n */\n @property({ default: 2048, tween: snapValue }) declare resolution: number\n\n @property({ default: \"#0b1a2b\", tween: snapValue }) declare ocean: Color\n @property({ default: \"#2c3e50\", tween: snapValue }) declare land: Color\n /**\n * The colour of every coast and border.\n *\n * Alpha works. It did not while the country paths carried the stroke — a\n * border belongs to two countries, so it was drawn twice and came out at\n * double density beside the coastlines. `borders.ts` deduplicates the lines\n * and `world-map.ts` strokes them once.\n */\n @property({ default: \"#4a6076\", tween: snapValue }) declare border: Color\n @property({ default: 1.5, tween: snapValue }) declare borderWidth: number\n\n @property({ default: true, tween: snapFlag }) declare graticule: boolean\n @property({ default: \"#ffffff20\", tween: snapValue })\n declare graticuleColor: Color\n @property({ default: 15, tween: snapValue }) declare graticuleStep: number\n @property({ default: 1, tween: snapValue }) declare graticuleWidth: number\n\n // ── The camera ──\n\n /**\n * The camera's heading, in degrees, in exactly the sense every other 3D node\n * uses it — which is what keeps the canvas drag consistent with them.\n *\n * It is *not* a longitude: a camera at heading θ is centred over longitude −θ\n * (see `orbitForLongitude` in `projection.ts`). Unbounded, like every other\n * viewport's, because the drag wraps it into `[0, 360)` and a range here would\n * clamp half of them.\n */\n @property({ default: -10 }) declare orbit: number\n /**\n * Degrees above the equator, which on a globe *is* the latitude the camera\n * stands over — no conversion, unlike the heading. Held short of the poles by\n * the schema, as every orbit camera's is.\n */\n @property({ default: 25 }) declare elevation: number\n /** Distance from the centre, as a multiple of the globe's radius. */\n @property({ default: 2.8 }) declare zoom: number\n @property({ default: 45 }) declare fov: number\n\n // ── Lighting ──\n\n @property({ default: 0.55 }) declare ambientIntensity: number\n @property({ default: \"#ffffff\", mapper: resolveColor3D, tween: lerpColor3D })\n declare ambientColor: Color\n @property({ default: 1.9 }) declare keyIntensity: number\n @property({ default: \"#ffffff\", mapper: resolveColor3D, tween: lerpColor3D })\n declare keyColor: Color\n\n // ── The atmosphere ──\n //\n // Shading rather than pixels, so unlike the map group these all animate.\n\n @property({ default: true, tween: snapFlag }) declare atmosphere: boolean\n @property({ default: \"#4da3ff\", mapper: resolveColor3D, tween: lerpColor3D })\n declare atmosphereColor: Color\n /** The shell's radius as a multiple of the globe's. */\n @property({ default: 1.06 }) declare atmosphereSize: number\n /** How tightly the glow hugs the edge. Higher is a thinner rim. */\n @property({ default: 3 }) declare atmosphereFalloff: number\n @property({ default: 1.1 }) declare atmosphereIntensity: number\n\n // ── What is placed on it ──\n //\n // Serialized lists, as the graphs store their equations: an appearance value\n // is a number, a string or a boolean, so a list arrives as a string a mapper\n // reads. Parsing is in `places.ts` and is deliberately tolerant — the field is\n // invalid far more often than valid while somebody is typing into it.\n\n @property({ default: \"[]\", tween: snapValue }) declare markers: string\n @property({ default: \"[]\", tween: snapValue }) declare arcs: string\n\n constructor(props?: NodeConfig<Globe, GlobeProps>) {\n super(props as NodeConfig<Canvas3D<GlobeProps>, GlobeProps>)\n }\n\n /**\n * Frame the scene at a spherical camera placement. Every axis is optional,\n * so \"pull back\" and \"spin round\" stay separate intentions — see\n * {@link OrbitTarget}.\n */\n @command({\n args: [\n {\n key: \"target\", kind: \"orbit\", properties: {\n orbit: { kind: \"number\", step: 1, unit: \"°\" },\n elevation: { kind: \"number\", min: -89, max: 89, step: 1, unit: \"°\" },\n zoom: { kind: \"number\", min: 0.2, max: 24, step: 0.1, unit: \"×\" },\n },\n },\n ],\n })\n orbitTo(args: CommandArgs<{ target: OrbitTarget }> & { duration: number }): Command<GlobeProps> {\n return this.to({\n data: orbitProps(args.data?.target ?? {}) as Partial<GlobeProps>,\n duration: args.duration,\n easing: args.easing ?? easeInOut(),\n })\n }\n\n /**\n * Fly the camera to a place on the globe. `latitude`/`longitude` are the\n * point to bring under the camera and `framing` the distance to settle at.\n *\n * **`arc` is what makes it a flight rather than a pan** — above `0` the\n * distance bows outward at the midpoint by that fraction, so a long journey\n * rises off the surface and settles back down rather than scraping the\n * horizon the whole way. Longitude takes the **short way round**.\n */\n @command({ args: [{ key: \"latitude\", kind: \"number\", default: 0, min: -89, max: 89, step: 1, unit: \"°\" }, { key: \"longitude\", kind: \"number\", default: 0, min: -180, max: 180, step: 1, unit: \"°\" }, { key: \"framing\", kind: \"number\", default: 2.2, min: 1.05, max: 12, step: 0.1, unit: \"×\" }, { key: \"arc\", kind: \"number\", default: 0.35, min: 0, max: 3, step: 0.05, scale: 100, unit: \"%\" }] })\n flyTo(args: CommandArgs<{ latitude: number; longitude: number; framing?: number; arc?: number }> & { duration?: number }): Command<GlobeProps> {\n const data = args.data ?? { latitude: 0, longitude: 0 }\n const { latitude, longitude, framing = 2.2, arc = 0.35 } = data\n const duration = args.duration ?? 1.6\n const easing = args.easing ?? easeInOut()\n\n const fromOrbit = this.orbit\n const fromElevation = this.elevation\n const fromZoom = this.zoom\n\n // The globe spins under a fixed camera, so a longitude is reached by\n // orbiting to its negation — and the shortest signed turn is what keeps a\n // crossing of the antimeridian from unwinding the long way.\n const toOrbit = fromOrbit + shortestTurn(fromOrbit, -longitude)\n\n return driveCommand(duration, (t) => {\n const eased = easing(t)\n this.set({\n orbit: fromOrbit + (toOrbit - fromOrbit) * eased,\n elevation: fromElevation + (latitude - fromElevation) * eased,\n // The bow: a half-sine that is 0 at both ends, so the command still\n // lands exactly on `framing` however large `arc` is.\n zoom: (fromZoom + (framing - fromZoom) * eased) * (1 + arc * Math.sin(Math.PI * eased)),\n } as Partial<GlobeProps>)\n }) as Command<GlobeProps>\n }\n\n protected override buildScene3D(): Scene3D {\n const scene = new Scene3D()\n const distance = RADIUS * Math.max(1.02, this.zoom)\n\n // Cut to the globe rather than left to the camera's own derivation from the\n // scene bounds: the atmosphere shell is the outermost thing in the scene and\n // sizing the planes to it would spend depth precision on the halo. The near\n // plane has to survive `zoom` coming right down to the surface, which is\n // what the fraction of the gap is for.\n scene.perspective({\n fov: this.fov,\n near: Math.max(0.01, (distance - RADIUS) * 0.5),\n far: distance + RADIUS * 4,\n // Exactly what every other 3D viewport does — the quarter turn between\n // the stored zero and the camera's, and nothing else. Anything extra here\n // is a globe whose canvas drag runs backwards against every other node's;\n // the longitude convention is handled in the *geometry* instead. See\n // `projection.ts`.\n orbit: cameraOrbit(this.orbit),\n elevation: this.elevation,\n distance,\n })\n\n // The same rig the Protein and the 3D viewport use, at the globe's scale: a\n // key, a rim that is the key from the other side at a fraction of its\n // strength, and enough ambient that the night side is a planet rather than a\n // silhouette. The backdrop is the node's own Fills stack — a `Canvas3D`\n // composites its 3D pass over its 2D fill layers — so there is no space to\n // paint here and no clear colour to set.\n scene\n .light({\n type: \"ambient\",\n intensity: this.ambientIntensity,\n color: this.ambientColor,\n })\n .light(\n { type: \"directional\", intensity: this.keyIntensity, color: this.keyColor },\n { position: [RADIUS * 3, RADIUS * 2, RADIUS * 3] }\n )\n .light(\n {\n type: \"directional\",\n intensity: this.keyIntensity * 0.35,\n color: this.keyColor,\n },\n { position: [-RADIUS * 3, -RADIUS, -RADIUS * 2] }\n )\n\n const g3 = new Graphics3D()\n this.addPlanet(g3)\n this.addArcs(g3)\n this.addMarkers(g3)\n if (this.atmosphere) this.addAtmosphere(g3)\n\n scene.draw(g3)\n return scene\n }\n\n /** The sphere, wearing the baked map. */\n private addPlanet(g3: Graphics3D): void {\n g3.sphere({\n radius: RADIUS,\n // Longitude segments matter more than latitude: the silhouette is a\n // circle of longitude, and a coarse one shows as a faceted rim against\n // the atmosphere's own smooth curve.\n segments: [128, 64],\n fill: this.bakedMap().texture,\n // Land and sea are matte at this distance; a specular highlight on an\n // ocean this size reads as a lens flare rather than as water.\n roughness: 0.95,\n metalness: 0,\n })\n }\n\n /** The halo. A shell, kept for its back faces — see `atmosphere.ts`. */\n private addAtmosphere(g3: Graphics3D): void {\n g3.sphere({\n radius: RADIUS * Math.max(1.001, this.atmosphereSize),\n segments: [96, 48],\n material: atmosphereMaterial(\n this.atmosphereColor as unknown as NormalizedColor,\n this.atmosphereFalloff,\n this.atmosphereIntensity\n ),\n })\n }\n\n /**\n * The markers, as one instanced draw.\n *\n * Instanced rather than a mesh apiece because a marker list is the one thing\n * here with no ceiling — a network map is thousands of points, and a draw call\n * each would not keep up. One geometry, one material, one upload.\n *\n * Note the material carries **no** `vertexColors`: an instanced mesh that asks\n * for it makes the shader read a per-vertex `color` attribute the geometry does\n * not have, gets zeroes, and every marker renders black. The per-instance\n * colours ride the `colors` option instead, which is a different channel.\n */\n private addMarkers(g3: Graphics3D): void {\n const markers = drawableMarkers(this.markers)\n if (markers.length === 0) return\n\n const placements: Transform3D[] = []\n const colors: Color[] = []\n\n for (const marker of markers) {\n const size = marker.size * RADIUS\n placements.push({\n // Lifted by a fraction of its own size so a marker sits *on* the\n // surface rather than half-buried in it, at any size.\n position: latLonToPosition(marker, RADIUS + size * MARKER_LIFT),\n scale: size,\n })\n colors.push(marker.color)\n }\n\n g3.instances(\n Geo.sphere({ radius: 1, segments: [16, 12] }),\n // Unlit, and deliberately: a marker is a signal rather than an object, and\n // one shaded by the scene's key light would go dark exactly when it\n // rotated to the night side — which is where it most needs to be seen.\n Mat.basic({ transparent: true }),\n placements,\n { colors }\n )\n }\n\n /** The arcs, one swept tube each. */\n private addArcs(g3: Graphics3D): void {\n // Resolved against the marker list, because an end may be *pinned* to one —\n // which is what keeps an arc attached when the place it points at moves.\n for (const arc of drawableArcs(this.arcs, this.markers)) {\n const points = greatCircle(arc.from, arc.to, {\n radius: RADIUS,\n lift: arc.lift,\n segments: arcSegments(arc),\n })\n\n // `progress` trims the point list rather than scaling the geometry, so a\n // half-drawn arc is the first half of the real path — the same shape the\n // finished arc has, stopping early. Two points is the floor a tube can be\n // swept along.\n const drawn = Math.max(2, Math.round(points.length * arc.progress))\n\n g3.mesh(\n Geo.tube({\n points: points.slice(0, drawn),\n radius: arc.width * RADIUS,\n segments: [drawn, 8],\n }),\n // Unlit for the reason the markers are: an arc is an annotation, and one\n // that dimmed over the night side would vanish halfway across.\n Mat.basic({ color: arc.color, transparent: true })\n )\n }\n }\n\n // --- The map cache -------------------------------------------------------\n\n /**\n * The baked map, and the descriptor that lets it be baked once.\n *\n * Two caches are being kept in step here, and the key is what keeps them in\n * step. This one holds the `Graphics2D` and its descriptor so the node hands\n * the renderer the *same object* every frame — surface identity is object\n * identity, so a fresh one each frame would defeat the texture cache and\n * orphan a GPU texture per frame. The renderer's own `staticRasters` holds the\n * rasterized pixels against the `identity` string below.\n *\n * They share one key, which is the point: edit a colour and this cache misses\n * (a new `Graphics2D`) *and* that one misses (a new identity string). Derive\n * the identity from anything else — a counter, the node id — and a colour\n * change would serve the old pixels forever, because nothing invalidates\n * `staticRasters` short of tearing down the render context.\n *\n * The descriptor is written out rather than built with `Tex.surface` because\n * the builder's options do not include `static` or `identity`. Handing a bare\n * `Graphics2D` to `fill` instead takes `resolveFill3D`'s surface path, which\n * sets neither — and that is the per-frame read-back this whole arrangement\n * exists to avoid.\n */\n private cache: { key: string; map: BakedMap } | null = null\n\n private bakedMap(): BakedMap {\n const style = this.mapStyle()\n const key = [\n style.width,\n style.ocean,\n style.land,\n style.border,\n style.borderWidth,\n style.graticule,\n style.graticuleColor,\n style.graticuleStep,\n style.graticuleWidth,\n ].join(\"|\")\n\n const cached = this.cache\n if (cached?.key === key) return cached.map\n\n const map: BakedMap = {\n texture: {\n source: worldMapGraphics(style),\n width: style.width,\n height: mapHeight(style.width),\n static: true,\n identity: `globe:${key}`,\n },\n }\n this.cache = { key, map }\n return map\n }\n\n /** The style props as the one value the baker takes. Also the cache key. */\n private mapStyle(): WorldMapStyle {\n return {\n // Rounded to an even number so the 2:1 height is a whole one; a half-pixel\n // buffer height is rounded by the rasterizer and the map then samples a\n // fraction of a row off, which reads as a seam at the equator.\n width: Math.max(256, Math.round(this.resolution / 2) * 2),\n ocean: hexOf(this.ocean),\n land: hexOf(this.land),\n border: hexOf(this.border),\n borderWidth: this.borderWidth,\n graticule: this.graticule,\n graticuleColor: hexOf(this.graticuleColor),\n graticuleStep: this.graticuleStep,\n graticuleWidth: this.graticuleWidth,\n }\n }\n}\n\n/**\n * The signed turn from `from` to `to` that travels less than half a circle.\n *\n * Degrees. What stops a flight from 170° to −170° unwinding 340° the wrong way\n * when it could cross the antimeridian in 20°.\n */\nfunction shortestTurn(from: number, to: number): number {\n return ((((to - from) % 360) + 540) % 360) - 180\n}\n\n\n/**\n * A colour prop as the string the baker and the cache key both want.\n *\n * These props carry no mapper — they are not animatable, so there is no resolved\n * form to hold — but a caller writing JSX is still free to hand one a tuple, and\n * a tuple in a cache key would stringify to something that compares equal for\n * two different colours.\n */\nfunction hexOf(value: Color): string {\n if (typeof value === \"string\") return value\n const [r, g, b, a = 1] = value as unknown as NormalizedColor\n const byte = (channel: number) =>\n Math.round(Math.min(1, Math.max(0, channel)) * 255)\n return `rgba(${byte(r)}, ${byte(g)}, ${byte(b)}, ${a})`\n}\n", "/**\n * What an author places on a Globe — the marked points, and the arcs between\n * them — as the panel edits them and the stored field holds them.\n *\n * Beside `graph-equations.ts` and shaped like it, because it is the same\n * problem: an appearance value is `number | string | boolean`, so a *list* has\n * to arrive as one string that a mapper reads. What lives here is the authored\n * shape and its serialization, shared by the inspector's tiles and the node's\n * builder; what a frame actually draws is `nodes/globe/impl/places.ts`, which\n * resolves this into coordinates and clamps it to what the render can use.\n *\n * The split matters in one direction: **reading must be faithful and must not\n * mint identity**. The panel reads on every render and the builder on every\n * rebuild, so a random id here would be a different id every time — and two\n * things key off it (a tile's React key, and which arc endpoint points at which\n * marker). {@link createMarker} mints ids; the readers derive a positional one\n * and never invent.\n */\n\n/**\n * A marked point on the surface.\n *\n * `label` is **not drawn**. It names the tile in the inspector and the entries\n * in an arc's endpoint menus, which is the whole of its job today — a label\n * rendered against the globe is a separate problem (it has to face the camera,\n * hide when it rotates behind the planet, and not collide with its neighbours),\n * and storing the text now is what lets that arrive without a migration.\n */\nexport interface GlobeMarker {\n /** Identity across list edits — a tween matches like with like. */\n id: string\n /** A name for this place. Editor-facing only; see the note above. */\n label: string\n /** Degrees north, −90…90. */\n lat: number\n /** Degrees east, −180…180. */\n lon: number\n /** Any colour string the fill parser takes. Empty means the palette entry. */\n color: string\n /** Radius as a fraction of the globe's own. */\n size: number\n /** 0–1. A fade, unlike {@link enabled}, which is a switch. */\n opacity: number\n /** Whether it draws. Off keeps the tile in place, editable, with its colour. */\n enabled: boolean\n}\n\n/**\n * One end of an arc: a marker it is pinned to, or a place of its own.\n *\n * The pinned form is the one the tile offers first, and it is not merely\n * convenient — an arc between two *marked* places moves when the place does,\n * where a copied pair of coordinates silently stops matching the dot it was\n * drawn to. That is the same reasoning a state machine's connection names its\n * ends by state id rather than by position.\n *\n * The free form stays because not every end wants a dot on it, and because a\n * list written by hand or by an agent reaches for a coordinate pair first.\n */\nexport type ArcEnd =\n | { readonly kind: \"marker\"; readonly markerId: string }\n | { readonly kind: \"place\"; readonly lat: number; readonly lon: number }\n\n/** A great-circle path between two ends. */\nexport interface GlobeArc {\n id: string\n from: ArcEnd\n to: ArcEnd\n color: string\n /** Tube radius as a fraction of the globe's own. */\n width: number\n /** How far the middle lifts off the surface, as a fraction of the radius. */\n lift: number\n /**\n * How much of the path is drawn, 0–1 — a line that draws itself on.\n *\n * A fraction of the *path* rather than a time, so it means the same thing\n * whatever the arc's length and is the author's to tween from wherever they\n * like. Zero draws nothing and is not an error.\n */\n progress: number\n enabled: boolean\n}\n\n/**\n * The palette an uncoloured marker takes its colour from, by position.\n *\n * Warm-to-cool rather than a spectrum: markers are read against a dark ocean and\n * usually mean something ranked — the first is the subject and the rest are\n * context — so the order runs from the one that carries furthest to the one that\n * recedes. Six, then it wraps; a seventh place that has to stand out sets its\n * own colour.\n */\nexport const DEFAULT_MARKER_COLORS = [\n \"#ff3b30\",\n \"#ff9f0a\",\n \"#ffd60a\",\n \"#30d158\",\n \"#5ac8fa\",\n \"#bf5af2\",\n] as const\n\n/** The colour a marker at `index` is drawn in when it names none. */\nexport function markerColorAt(index: number): string {\n const palette = DEFAULT_MARKER_COLORS\n return palette[((index % palette.length) + palette.length) % palette.length]!\n}\n\n/** The colour an arc falls back to. */\nexport const DEFAULT_ARC_COLOR = \"#ffd60a\"\n\nconst DEFAULT_MARKER_SIZE = 0.02\nconst DEFAULT_ARC_WIDTH = 0.004\nconst DEFAULT_ARC_LIFT = 0.25\n\n/**\n * A fresh id for a tile.\n *\n * A counter plus a short random suffix rather than `crypto.randomUUID`, exactly\n * as `graph-equations.ts` explains: this package loads in a bare Node process\n * with no DOM and no assumed globals, and an id only has to be unique within one\n * node's list. The suffix is what stops two clients editing the same scene\n * colliding on `mk-3`.\n *\n * Never called during a build — only when an author adds a tile.\n */\nlet placeSeq = 0\nfunction nextId(prefix: string): string {\n placeSeq += 1\n return `${prefix}-${placeSeq}-${Math.random().toString(36).slice(2, 8)}`\n}\n\n/** A new marker tile: showing, opaque, and at the given place. */\nexport function createMarker(\n at: { lat: number; lon: number } = { lat: 0, lon: 0 }\n): GlobeMarker {\n return {\n id: nextId(\"mk\"),\n label: \"\",\n lat: at.lat,\n lon: at.lon,\n color: \"\",\n size: DEFAULT_MARKER_SIZE,\n opacity: 1,\n enabled: true,\n }\n}\n\n/** A new arc tile, between two ends. */\nexport function createArc(from: ArcEnd, to: ArcEnd): GlobeArc {\n return {\n id: nextId(\"arc\"),\n from,\n to,\n color: DEFAULT_ARC_COLOR,\n width: DEFAULT_ARC_WIDTH,\n lift: DEFAULT_ARC_LIFT,\n progress: 1,\n enabled: true,\n }\n}\n\n/** An end pinned to a marker. */\nexport function markerEnd(markerId: string): ArcEnd {\n return { kind: \"marker\", markerId }\n}\n\n/** An end at a place of its own. */\nexport function placeEnd(lat: number, lon: number): ArcEnd {\n return { kind: \"place\", lat, lon }\n}\n\n// --- Reading ---------------------------------------------------------------\n\n/**\n * Reads a stored marker list, defensively.\n *\n * Never throws, and drops only what it genuinely cannot place: the field is\n * edited a keystroke at a time by hand as well as through the tiles, so it is\n * invalid far more often than it is valid, and a reader that threw would blank\n * the canvas on the way from `[` to `[{`.\n *\n * A row with **no position at all** is the one thing that is dropped rather than\n * defaulted. Every other field has an honest default; a latitude does not, and\n * putting an unplaced marker on the equator would draw a dot somewhere nobody\n * asked for and call it the author's.\n */\nexport function markersOf(value: unknown): GlobeMarker[] {\n return rowsOf(value).flatMap((row, index) => {\n const lat = finite(row.lat ?? row.latitude)\n const lon = finite(row.lon ?? row.lng ?? row.longitude)\n if (lat === null || lon === null) return []\n return [\n {\n id: idOf(row.id, `mk:${index}`),\n label: text(row.label ?? row.name) ?? \"\",\n lat: clamp(lat, -90, 90),\n lon: wrapLongitude(lon),\n color: text(row.color) ?? \"\",\n size: positive(row.size, DEFAULT_MARKER_SIZE),\n opacity: unit(row.opacity),\n // Absent means on, as everywhere else a switch is stored: only an\n // explicit `false` turns a tile off.\n enabled: row.enabled !== false,\n },\n ]\n })\n}\n\n/** Reads a stored arc list, on the same terms as {@link markersOf}. */\nexport function arcsOf(value: unknown): GlobeArc[] {\n return rowsOf(value).flatMap((row, index) => {\n const from = endOf(row.from)\n const to = endOf(row.to)\n if (!from || !to) return []\n return [\n {\n id: idOf(row.id, `arc:${index}`),\n from,\n to,\n color: text(row.color) ?? DEFAULT_ARC_COLOR,\n width: positive(row.width, DEFAULT_ARC_WIDTH),\n lift: clamp(finite(row.lift) ?? DEFAULT_ARC_LIFT, 0, 4),\n progress: unit(row.progress),\n enabled: row.enabled !== false,\n },\n ]\n })\n}\n\n/** Serializes a marker list into the stored string form. */\nexport function markersToValue(markers: readonly GlobeMarker[]): string {\n return JSON.stringify(markers)\n}\n\n/**\n * Serializes an arc list, writing each end back in the shape it was authored in.\n *\n * A pinned end is a bare **string** and a free one a `[lat, lon]` **pair**,\n * rather than the tagged union this module works in. Two reasons, and the second\n * is the load-bearing one: those are the two shapes somebody writing this list\n * by hand reaches for, and a stored document is read by whatever version opens\n * it later — so the wire form is public API and a discriminant that only exists\n * to make the TypeScript convenient does not belong in it.\n */\nexport function arcsToValue(arcs: readonly GlobeArc[]): string {\n return JSON.stringify(\n arcs.map((arc) => ({ ...arc, from: endToValue(arc.from), to: endToValue(arc.to) }))\n )\n}\n\nfunction endToValue(end: ArcEnd): string | [number, number] {\n return end.kind === \"marker\" ? end.markerId : [end.lat, end.lon]\n}\n\n/**\n * One end, from any of the three shapes a stored list holds it in.\n *\n * A **string** is a marker id; a **pair** is `[lat, lon]`, which is how a\n * coordinate is written everywhere outside a program; an **object** with `lat`\n * and `lon` is the long form. Refusing any of them would make the field's most\n * obvious content its most surprising failure.\n */\nfunction endOf(value: unknown): ArcEnd | null {\n if (typeof value === \"string\") {\n return value.trim() === \"\" ? null : markerEnd(value)\n }\n if (Array.isArray(value)) {\n const lat = finite(value[0])\n const lon = finite(value[1])\n return lat === null || lon === null\n ? null\n : placeEnd(clamp(lat, -90, 90), wrapLongitude(lon))\n }\n if (typeof value !== \"object\" || value === null) return null\n const row = value as Record<string, unknown>\n if (typeof row.markerId === \"string\") return markerEnd(row.markerId)\n const lat = finite(row.lat ?? row.latitude)\n const lon = finite(row.lon ?? row.lng ?? row.longitude)\n return lat === null || lon === null\n ? null\n : placeEnd(clamp(lat, -90, 90), wrapLongitude(lon))\n}\n\n// --- Reading helpers -------------------------------------------------------\n\ntype Row = Record<string, unknown>\n\nfunction rowsOf(value: unknown): Row[] {\n if (typeof value !== \"string\" || value.trim() === \"\") return []\n try {\n const parsed: unknown = JSON.parse(value)\n if (!Array.isArray(parsed)) return []\n return parsed.filter(\n (row): row is Row => typeof row === \"object\" && row !== null\n )\n } catch {\n return []\n }\n}\n\n/**\n * A row's identity, or one derived from where it sits.\n *\n * Positional rather than random, and the difference is the whole point: a random\n * id here would be a different one on every read, and both the tile's React key\n * and an arc's pin to a marker would change under the author's hands.\n */\nfunction idOf(value: unknown, positional: string): string {\n return text(value) ?? positional\n}\n\nfunction text(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() !== \"\" ? value : null\n}\n\nfunction finite(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null\n}\n\n/** A stored 0–1 value; anything unreadable is fully on. */\nfunction unit(value: unknown): number {\n const n = finite(value)\n return n === null ? 1 : clamp(n, 0, 1)\n}\n\n/** A stored size, which must be above zero to draw at all. */\nfunction positive(value: unknown, fallback: number): number {\n const n = finite(value)\n return n === null || n <= 0 ? fallback : n\n}\n\n/**\n * A longitude into −180…180.\n *\n * Wrapped rather than clamped, unlike latitude: 190°E is a real place (170°W)\n * and clamping would put it on the antimeridian, where there is nothing north of\n * the north pole for a latitude to mean.\n *\n * A value already in range is returned untouched — the modulo round-trip is not\n * exact in binary floating point (139.7 comes back as 139.70000000000005), and a\n * stored longitude that differs from the one the author typed shows up later as\n * a diff nobody made.\n */\nfunction wrapLongitude(value: number): number {\n if (value >= -180 && value <= 180) return value\n return ((((value + 180) % 360) + 360) % 360) - 180\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value\n}\n", "/**\n * The marker and arc lists, resolved into the things a frame draws.\n *\n * The authored shape and its serialization live in `model/globe-places.ts`,\n * shared with the inspector's tiles. What is here is the other half: turning a\n * pinned arc end into a coordinate, dropping what cannot draw, and deciding how\n * finely a tube is swept. None of it is meaningful to the panel, and all of it\n * runs on every rebuild — which is why the two halves are separate modules\n * rather than one with a flag.\n */\n\nimport {\n arcsOf,\n markersOf,\n markerColorAt,\n type ArcEnd,\n type GlobeArc,\n type GlobeMarker,\n} from \"./globe-places\"\n\n/** A marker with everything the render needs decided. */\nexport interface DrawableMarker {\n id: string\n lat: number\n lon: number\n color: string\n size: number\n opacity: number\n}\n\n/** An arc with both ends resolved to real coordinates. */\nexport interface DrawableArc {\n id: string\n from: { lat: number; lon: number }\n to: { lat: number; lon: number }\n color: string\n width: number\n lift: number\n progress: number\n}\n\n/**\n * The markers a frame draws, in list order.\n *\n * The palette is applied **here** rather than left to the drawing code, so the\n * one place that decides what colour an uncoloured marker is also the place the\n * swatch in the panel reads — see `markerColorAt`. Position in the list is the\n * palette index, which is why a reorder recolours: the list is a ranking, and\n * the first place being the loudest is the point.\n */\nexport function drawableMarkers(value: string): DrawableMarker[] {\n return markersOf(value).flatMap((marker, index) =>\n marker.enabled && marker.opacity > 0\n ? [\n {\n id: marker.id,\n lat: marker.lat,\n lon: marker.lon,\n color: marker.color === \"\" ? markerColorAt(index) : marker.color,\n size: clamp(marker.size, 0.001, 0.5),\n opacity: marker.opacity,\n },\n ]\n : []\n )\n}\n\n/**\n * The arcs a frame draws, with pinned ends looked up in the marker list.\n *\n * An end pinned to a marker that is gone drops the whole arc rather than falling\n * back to the origin. A line to null island is a picture of something that is\n * not true, and it is *harder* to notice than a missing one: an arc that\n * vanishes when its endpoint is deleted reads as a consequence, where one that\n * swings to the Gulf of Guinea reads as a bug in the projection.\n *\n * A **disabled** marker still anchors an arc, deliberately. Switching a dot off\n * is about the dot; an arc that also wanted to go is switched off itself.\n */\nexport function drawableArcs(\n arcsValue: string,\n markersValue: string\n): DrawableArc[] {\n const byId = new Map<string, GlobeMarker>()\n for (const marker of markersOf(markersValue)) byId.set(marker.id, marker)\n\n return arcsOf(arcsValue).flatMap((arc) => {\n if (!arc.enabled || arc.progress <= 0) return []\n const from = resolveEnd(arc.from, byId)\n const to = resolveEnd(arc.to, byId)\n if (!from || !to) return []\n return [\n {\n id: arc.id,\n from,\n to,\n color: arc.color,\n width: clamp(arc.width, 0.0005, 0.1),\n lift: arc.lift,\n progress: arc.progress,\n },\n ]\n })\n}\n\nfunction resolveEnd(\n end: ArcEnd,\n markers: Map<string, GlobeMarker>\n): { lat: number; lon: number } | null {\n if (end.kind === \"place\") return { lat: end.lat, lon: end.lon }\n const marker = markers.get(end.markerId)\n return marker ? { lat: marker.lat, lon: marker.lon } : null\n}\n\n/**\n * How many segments an arc's tube is swept along.\n *\n * Proportional to how far it goes, so a hop between neighbours is not paying for\n * a pole-to-pole path's resolution and a long haul does not visibly chord. The\n * floor keeps a very short arc from degenerating into a two-point tube, which\n * three cannot frame.\n */\nexport function arcSegments(arc: Pick<GlobeArc | DrawableArc, \"from\" | \"to\">): number {\n const from = arc.from as { lat: number; lon: number }\n const to = arc.to as { lat: number; lon: number }\n const span = Math.abs(to.lat - from.lat) + Math.abs(to.lon - from.lon)\n return Math.max(8, Math.min(128, Math.round(span * 0.7)))\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value\n}\n", "/**\n * Where a latitude and a longitude are, in the three spaces the Globe works in:\n * the unit sphere it draws on, the equirectangular texture it paints, and the\n * orbit camera it is looked at through.\n *\n * All three are fixed by one decision, and it is the decision every other file\n * in this node depends on, so it is made here and nowhere else.\n *\n * ## The convention, and why it is not the obvious one\n *\n * Two things have to be true at once, and motion-script's camera lets you have\n * either but not both by default:\n *\n * 1. **The stored `orbit` field reads directly as a longitude.** That would let\n * the camera be three appearance numbers *and* the Fly To command be\n * arithmetic on two of them with nothing in between.\n * 2. **East is to the right.** Looking at the Atlantic from space, Africa is\n * right of Brazil. A globe that fails this is a mirrored Earth, which no\n * amount of convenience elsewhere pays for.\n *\n * The clash: `resolveCameraPlacement` puts a camera at azimuth `a` at\n * `(sin a, ·, cos a)`, and `cameraOrbit` (`view3d-kit/shared.ts`) feeds it\n * `90 - orbit`, so a camera at stored orbit θ sits at `(cos θ, ·, sin θ)` and its\n * screen-right is `-Z`. Increasing θ therefore swings the scene **rightward** —\n * measured, not reasoned: it is what every existing 3D node does, and the globe\n * has to match or it is the one viewport whose drag goes backwards.\n *\n * So (1) is what gives. Longitude runs the *other* way round the Y axis —\n * {@link latLonToVector} negates Z, which is what puts east on the right — and a\n * camera at heading θ is consequently centred over longitude −θ. The stored\n * field is a heading, labelled \"Orbit\" like every other viewport's, and\n * {@link orbitForLongitude} is the one place the two are converted.\n *\n * The Fly To command is where that conversion earns its keep: its arguments\n * genuinely are a latitude and a longitude, and it turns them into a heading\n * here rather than anywhere else.\n *\n * ## The texture\n *\n * Plain equirectangular, the orientation any world map image already has:\n * longitude −180…180 left to right, latitude +90…−90 top to bottom. That falls\n * out of the convention above rather than being chosen — see {@link latLonToUV},\n * which derives it from three's own sphere generator — and it is the strongest\n * evidence the convention is right: get the handedness wrong and the map that\n * wraps correctly is a mirrored one.\n */\n\n/** A point on the unit sphere. */\nexport interface Vec3 {\n x: number\n y: number\n z: number\n}\n\n/** A position on the globe, in degrees. */\nexport interface LatLon {\n /** Degrees north of the equator, −90…90. */\n lat: number\n /** Degrees east of the prime meridian, −180…180. */\n lon: number\n}\n\n/**\n * The bounding box every country path is centred against.\n *\n * A `Path` centres on its *own* bounding box unless it is given one, so drawing\n * the world as one path per country and leaving this off stacks all 177 of them\n * on the origin. Passing the same frame to each is what keeps them in place —\n * the same reason the LaTeX renderer passes whole-formula bounds to every glyph.\n */\nexport const WORLD_BOUNDS = [-180, -90, 180, 90] as const\n\nconst DEG = Math.PI / 180\n\n/**\n * The unit-sphere direction of a latitude and longitude.\n *\n * `z` is negated against the textbook spherical formula, which is the whole of\n * the convention above: it is what puts east on the right.\n */\nexport function latLonToVector({ lat, lon }: LatLon): Vec3 {\n const phi = lat * DEG\n const lambda = lon * DEG\n const ring = Math.cos(phi)\n return {\n x: ring * Math.cos(lambda),\n y: Math.sin(phi),\n z: -ring * Math.sin(lambda),\n }\n}\n\n/** {@link latLonToVector}, scaled off the surface — markers, arc endpoints. */\nexport function latLonToPosition(\n at: LatLon,\n radius: number\n): [number, number, number] {\n const { x, y, z } = latLonToVector(at)\n return [x * radius, y * radius, z * radius]\n}\n\n/**\n * Where a latitude and longitude land in the equirectangular texture, as `uv`\n * in `[0,1]²`.\n *\n * Derived rather than chosen, from the two pieces of machinery underneath:\n *\n * - three's `SphereGeometry` puts vertex `u` at `(-cos 2πu, ·, sin 2πu)` and\n * writes `uv = (u, 1 - v)`, with `v = 0` at the north pole.\n * - motion-script uploads a rasterized surface with `flipY = true`\n * (`skia-render/src/three/handlers/texture.ts`), so the buffer's **first row\n * is `uv.y = 1`**.\n *\n * Solving `(-cos 2πu, sin 2πu)` against {@link latLonToVector}'s `(x, z)` gives\n * `2πu = π + λ`, and the latitude falls straight out of `y = cos θ`. The result\n * is the ordinary world-map layout, which is the point.\n */\nexport function latLonToUV({ lat, lon }: LatLon): { u: number; v: number } {\n return { u: (lon + 180) / 360, v: 0.5 + lat / 180 }\n}\n\n/**\n * Where a latitude and longitude land in the **drawing space** of the baked\n * texture: pixels, **y upward**, origin at the buffer's centre.\n *\n * Two of motion-script's conventions meet here, and neither is guessable from a\n * picture that comes out wrong, so both are written down:\n *\n * - **The origin is the buffer's centre**, because `SkiaRenderContext.rasterize`\n * translates the offscreen canvas by half its size before handing it to the\n * source. Drawn from a top-left origin the map lands a quarter of the world\n * off the edge — and still wraps onto the sphere without complaint.\n * - **`y` is up.** A `PathCommand[]`, and a line's `points`, are authored y-up\n * and mirrored by the backend on the way to Skia (`flipPathY`, and the\n * `points` map beside it in `render-context.ts`). Drawn y-down the world is\n * simply upside down — and every continent still has its own shape, so it\n * reads as a texture flipped somewhere in the pipeline rather than as a sign\n * in the one function that decides.\n *\n * Deliberately *not* the raw buffer's own row order. The backend's flip lands\n * north on the first row, and `flipY` on the uploaded texture maps that row to\n * `uv.y = 1` — which is where {@link latLonToUV} independently puts the north\n * pole. A test ties the two together rather than trusting them to agree.\n */\nexport function latLonToCanvas(\n { lat, lon }: LatLon,\n width: number,\n height: number\n): { x: number; y: number } {\n return { x: (lon / 360) * width, y: (lat / 180) * height }\n}\n\n/**\n * The frame every country path is centred against, in that same space.\n *\n * See {@link WORLD_BOUNDS} for why passing it to each path matters.\n */\nexport function canvasBounds(\n width: number,\n height: number\n): [number, number, number, number] {\n return [-width / 2, -height / 2, width / 2, height / 2]\n}\n\n/**\n * The stored `orbit` heading that puts `lon` at the centre of the frame.\n *\n * **A negation, and it is the price of two things that matter more than the\n * field reading as a longitude.**\n *\n * `orbit` has to behave exactly as it does on every other 3D node: the canvas\n * drag adds to it (`orbitByDrag`), and increasing it must swing the scene the\n * same way it swings a molecule or a surface, or the globe is the one viewport\n * whose drag goes backwards. That pins `orbit` to `cameraOrbit` with no\n * conversion in between.\n *\n * East also has to be on the right, which pins {@link latLonToVector}'s sign.\n *\n * Those two together force the third: a camera at heading θ is centred over\n * longitude −θ. So the stored field is a **heading**, not a longitude — which is\n * why the panel labels it \"Orbit\" like every other viewport's, and why the Fly\n * To command, whose arguments genuinely are a latitude and a longitude,\n * converts through here.\n */\nexport function orbitForLongitude(lon: number): number {\n return -lon\n}\n\n/** The longitude a stored `orbit` heading is centred over. Its own inverse. */\nexport function longitudeForOrbit(orbit: number): number {\n return -orbit\n}\n\n/**\n * Points along the great circle from `from` to `to`, `segments` spans of them.\n *\n * Spherical linear interpolation rather than a lerp of the two lat/lons: the\n * latter is a rhumb line, which crosses the antimeridian the long way and bulges\n * badly at high latitudes — a \"London to Tokyo\" arc drawn that way runs through\n * Kazakhstan instead of over the pole, which is the one thing the picture exists\n * to show.\n *\n * `lift` raises the middle of the arc off the surface, as a fraction of the\n * radius, on a sine so both ends meet the sphere flush. Zero draws the path on\n * the ground.\n */\nexport function greatCircle(\n from: LatLon,\n to: LatLon,\n options: { radius?: number; lift?: number; segments?: number } = {}\n): [number, number, number][] {\n const radius = options.radius ?? 1\n const lift = options.lift ?? 0\n const segments = Math.max(1, Math.floor(options.segments ?? 64))\n\n const a = latLonToVector(from)\n const b = latLonToVector(to)\n\n const dot = clamp(a.x * b.x + a.y * b.y + a.z * b.z, -1, 1)\n const omega = Math.acos(dot)\n\n const points: [number, number, number][] = []\n for (let i = 0; i <= segments; i++) {\n const t = i / segments\n // Antipodal or coincident endpoints leave the plane of the circle\n // undefined; a straight blend is the honest answer for both, and\n // renormalising below puts it back on the sphere either way.\n const [wa, wb] =\n Math.abs(omega) < 1e-6\n ? [1 - t, t]\n : [\n Math.sin((1 - t) * omega) / Math.sin(omega),\n Math.sin(t * omega) / Math.sin(omega),\n ]\n\n const x = a.x * wa + b.x * wb\n const y = a.y * wa + b.y * wb\n const z = a.z * wa + b.z * wb\n const length = Math.hypot(x, y, z) || 1\n const scale = (radius * (1 + lift * Math.sin(Math.PI * t))) / length\n\n points.push([x * scale, y * scale, z * scale])\n }\n return points\n}\n\n/**\n * The signed turn from one heading to another, taking whichever way round is\n * shorter — so 170° to −170° is a 20° nudge east rather than 340° west.\n *\n * The same arithmetic `camera-kit`'s unused `shortestTurn` states; it is\n * duplicated rather than imported because that one is private to a module this\n * package's 3D nodes do not otherwise depend on, and because a Fly To that got\n * this wrong would be the command's single most visible failure.\n */\nexport function shortestTurn(from: number, to: number): number {\n return ((((to - from) % 360) + 540) % 360) - 180\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value\n}\n", "/**\n * The world as a flat drawing — the one `Graphics2D` that becomes the sphere's\n * texture.\n *\n * Baking the map in 2D rather than tessellating it in 3D is the node's central\n * decision, and it is not a shortcut. A WebGL line ignores any width above one\n * pixel (motion-script says so outright on `LineStroke3D`), so borders drawn as\n * 3D lines are hairlines at every zoom and every resolution, and the only way to\n * thicken one is to sweep a tube along it — three hundred tubes, for a picture\n * that is flat. Drawn here, a border is an ordinary stroke: any weight, any\n * colour, joined and antialiased by Skia, and it costs one rasterize rather than\n * one per frame.\n *\n * Everything here is therefore *style*, and the node's cache key is exactly the\n * arguments below. Nothing that moves — a marker, an arc, the camera — is drawn\n * into this, because baking something that moves would put every frame of its\n * animation through a full re-rasterize.\n *\n * ## One path per country, and this is the whole performance story\n *\n * The obvious shape is one `path` op holding all 289 rings — the nonzero fill\n * rule sorts out what is land, and it is one op instead of 177. **Do not do\n * that.** Skia's cost for filling and stroking a single path is badly\n * superlinear in its *contour* count, and the difference is not marginal:\n *\n * one path, 289 contours, 10,649 commands 10,691 ms\n * one path per country (177 of them) 205 ms\n *\n * Measured in the browser, on the same data, at the same resolution — a 52×\n * difference, and the reason adding a Globe to a scene used to lock the app for\n * ten seconds. It is also almost independent of the texture's resolution (256²\n * and 2048² are within 10% of each other), which is the tell that the cost is\n * geometry, not pixels, and that turning the map down would not have saved it.\n *\n * Splitting per country is safe for the fill: each country's rings — exterior\n * and holes together — stay in *its* path, so the nonzero rule still cuts\n * Lesotho out of South Africa, and Lesotho's own path paints it back.\n *\n * ## The lines are a separate pass, and have to be\n *\n * The country paths are filled and **not** stroked. Stroking them would draw\n * every international border twice — once from each side, since both countries\n * carry it — and a doubly-composited antialiased fringe reads as a line half\n * again as wide as the coastlines beside it. `borders.ts` deduplicates the\n * segments and stitches them into runs; this file strokes those instead, so\n * every line on the map is drawn exactly once at exactly one weight.\n */\n\nimport { Graphics2D, type PathCommand } from \"@motionscript/sdk\"\n\nimport { canvasBounds, latLonToCanvas } from \"./projection\"\nimport { borderLines } from \"./borders\"\nimport { world, type Ring } from \"./world\"\n\n/** Everything that changes the baked pixels. Also the node's cache key. */\nexport interface WorldMapStyle {\n /** Buffer width in pixels. Height is half of it — the equirectangular ratio. */\n width: number\n ocean: string\n land: string\n /**\n * The colour of every coast and border.\n *\n * Alpha is fine here, and that is worth saying because it briefly was not:\n * while the country paths were stroked, a shared border was drawn twice and a\n * translucent one came out at double density. `drawBoundaries` draws each line\n * exactly once, so the colour means what it says.\n */\n border: string\n borderWidth: number\n graticule: boolean\n graticuleColor: string\n /** Degrees between graticule lines. */\n graticuleStep: number\n graticuleWidth: number\n}\n\n/** The buffer's height for a given width — equirectangular is always 2:1. */\nexport function mapHeight(width: number): number {\n return Math.round(width / 2)\n}\n\n/**\n * The map, drawn.\n *\n * **Hoist the result.** motion-script identifies a surface texture by its source\n * object, so a fresh `Graphics2D` every frame misses the raster cache, redraws\n * ten thousand paths, reads the buffer back off the GPU and uploads it again —\n * sixty times a second, to produce the same image. `Globe` holds one against\n * this style; nothing else should call this.\n */\nexport function worldMapGraphics(style: WorldMapStyle): Graphics2D {\n const width = style.width\n const height = mapHeight(width)\n const bounds = canvasBounds(width, height)\n\n const g = new Graphics2D()\n\n // The ocean is the whole buffer rather than a sphere-coloured backdrop,\n // because the texture has to be opaque: the sphere is lit, and a transparent\n // texel would show the inside of the far side through it.\n g.rect({ width, height }).fill(style.ocean)\n\n // Land, filled and **not** stroked — see `drawBoundaries` for where the lines\n // come from and why they cannot come from here.\n //\n // One path per country, not one for the world: see the module note for what\n // that costs.\n for (const country of world().countries) {\n const commands: PathCommand[] = []\n for (const ring of country.rings) appendRing(commands, ring, width, height)\n if (commands.length === 0) continue\n g.path({ data: commands, centerBounds: bounds }).fill(style.land)\n }\n\n if (style.borderWidth > 0) drawBoundaries(g, style, width, height, bounds)\n\n // Last, and over the land. The graticule is reference rather than art\n // direction — the same reading the Canvas 3D viewport's grid takes — so it\n // reads as an overlay on whatever it crosses rather than as terrain.\n if (style.graticule) {\n for (const line of graticuleLines(style.graticuleStep, width, height)) {\n g.line({ points: line }).stroke({\n fill: style.graticuleColor,\n weight: style.graticuleWidth,\n })\n }\n }\n\n return g\n}\n\nfunction appendRing(\n commands: PathCommand[],\n ring: Ring,\n width: number,\n height: number\n): void {\n const count = ring.points.length / 2\n for (let i = 0; i < count; i++) {\n const { x, y } = latLonToCanvas(\n { lon: ring.points[i * 2]!, lat: ring.points[i * 2 + 1]! },\n width,\n height\n )\n commands.push(i === 0 ? { type: \"M\", x, y } : { type: \"L\", x, y })\n }\n // Closed explicitly: the ring's repeated last point was dropped when it was\n // vendored, so without this the stroke leaves a notch at every country's\n // starting vertex and the fill's last edge is implied rather than drawn.\n commands.push({ type: \"Z\" })\n}\n\n/**\n * Every coast and border, stroked once each.\n *\n * **One path per run**, for exactly the reason the countries are one path each:\n * a path's stroke cost is superlinear in its contour count. Gathering the 277\n * runs into two paths of ~200 contours put this straight back on the cliff the\n * countries were moved off — measured at 2.5 s of stall, against none at one\n * run per path.\n *\n * One-per-run rather than a tuned chunk size because there is no number to\n * defend: 277 paths is the same order as the 177 the countries already use, and\n * a constant here would be a knob whose safe range nobody could state.\n */\nfunction drawBoundaries(\n g: Graphics2D,\n style: WorldMapStyle,\n width: number,\n height: number,\n bounds: readonly [number, number, number, number]\n): void {\n const paint = { fill: style.border, weight: style.borderWidth }\n\n for (const line of borderLines()) {\n const count = line.length / 2\n if (count < 2) continue\n const commands: PathCommand[] = []\n for (let i = 0; i < count; i++) {\n const { x, y } = latLonToCanvas(\n { lon: line[i * 2]!, lat: line[i * 2 + 1]! },\n width,\n height\n )\n commands.push(i === 0 ? { type: \"M\", x, y } : { type: \"L\", x, y })\n }\n // Left open: a boundary run is a line, not a ring, and closing it would draw\n // a chord back to wherever the run happened to start.\n g.path({ data: commands, centerBounds: bounds }).stroke(paint)\n }\n}\n\n/**\n * The meridians and parallels, as polylines in drawing space.\n *\n * Straight lines, because an equirectangular projection is exactly the one where\n * meridians and parallels are straight — the grid is curved on the sphere only\n * because the sphere curves. Meridians run pole to pole and parallels edge to\n * edge, and both stop short of the poles by one step so the drawing does not\n * pile every meridian onto the same two points.\n */\nfunction graticuleLines(\n step: number,\n width: number,\n height: number\n): { x: number; y: number }[][] {\n const spacing = Math.max(5, Math.min(90, step))\n const lines: { x: number; y: number }[][] = []\n\n for (let lon = -180; lon <= 180; lon += spacing) {\n const meridian: { x: number; y: number }[] = []\n for (let lat = -90; lat <= 90; lat += 5) {\n meridian.push(latLonToCanvas({ lat, lon }, width, height))\n }\n lines.push(meridian)\n }\n\n for (let lat = -90 + spacing; lat <= 90 - spacing; lat += spacing) {\n lines.push([\n latLonToCanvas({ lat, lon: -180 }, width, height),\n latLonToCanvas({ lat, lon: 180 }, width, height),\n ])\n }\n\n return lines\n}\n", "import { GeoBorder } from \"./border\";\nimport { Globe } from \"./globe\";\n\n/**\n * Every node type this package publishes.\n *\n * A host registers these by handing the array to an engine —\n * `new Engine(platform, { nodes: NODES })` — which reads each class's `@node()`\n * key. The decorator only *declares* that key: nothing is registered by the mere\n * act of importing a module, so a registry holds exactly what its owner asked\n * for and two engines in one process can differ about it.\n *\n * Listing class **values** is also what survives bundling. This package declares\n * `sideEffects: false`, which licenses a bundler to drop a module nothing\n * imports a value from, and a document names a node type by string — so\n * `import \"./globe\"` for its side effect is exactly what gets shaken out, where an\n * array of bindings is a data dependency that cannot be.\n */\nexport const NODES = [Globe, GeoBorder];\n"],
5
+ "mappings": "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",
6
6
  "names": ["Adder", "x", "p", "i", "j", "y", "hi", "lo", "n", "flatten", "arrays", "array", "merge", "epsilon", "epsilon2", "pi", "halfPi", "quarterPi", "tau", "degrees", "radians", "abs", "atan", "atan2", "cos", "exp", "log", "sin", "sign", "x", "sqrt", "tan", "acos", "pi", "asin", "halfPi", "noop", "streamGeometry", "geometry", "stream", "streamGeometryType", "streamObjectType", "object", "features", "i", "n", "coordinates", "streamLine", "streamPolygon", "geometries", "closed", "coordinate", "stream_default", "areaRingSum", "Adder", "areaSum", "lambda00", "phi00", "lambda0", "cosPhi0", "sinPhi0", "areaStream", "noop", "areaRingStart", "areaRingEnd", "areaRing", "tau", "areaPointFirst", "areaPoint", "lambda", "phi", "radians", "cos", "quarterPi", "sin", "dLambda", "sdLambda", "adLambda", "cosPhi", "sinPhi", "k", "u", "v", "atan2", "area_default", "object", "stream_default", "spherical", "cartesian", "atan2", "asin", "lambda", "phi", "cosPhi", "cos", "sin", "cartesianDot", "a", "b", "cartesianCross", "cartesianAddInPlace", "cartesianScale", "vector", "k", "cartesianNormalizeInPlace", "d", "l", "sqrt", "lambda0", "phi0", "lambda1", "phi1", "lambda2", "lambda00", "phi00", "p0", "deltaSum", "ranges", "range", "boundsStream", "boundsPoint", "boundsLineStart", "boundsLineEnd", "boundsRingPoint", "boundsRingStart", "boundsRingEnd", "Adder", "areaStream", "areaRingSum", "epsilon", "lambda", "phi", "linePoint", "p", "cartesian", "radians", "normal", "cartesianCross", "equatorial", "inflection", "cartesianNormalizeInPlace", "spherical", "delta", "sign", "lambdai", "degrees", "phii", "antimeridian", "abs", "angle", "rangeCompare", "a", "b", "rangeContains", "x", "bounds_default", "feature", "i", "n", "merged", "deltaMax", "stream_default", "compose_default", "a", "b", "compose", "x", "y", "rotationIdentity", "lambda", "phi", "abs", "pi", "tau", "rotateRadians", "deltaLambda", "deltaPhi", "deltaGamma", "compose_default", "rotationLambda", "rotationPhiGamma", "forwardRotationLambda", "rotation", "cosDeltaPhi", "cos", "sinDeltaPhi", "sin", "cosDeltaGamma", "sinDeltaGamma", "cosPhi", "x", "y", "z", "k", "atan2", "asin", "rotation_default", "rotate", "radians", "forward", "coordinates", "degrees", "circleStream", "stream", "radius", "delta", "direction", "t0", "t1", "cosRadius", "cos", "sinRadius", "sin", "step", "tau", "circleRadius", "point", "t", "spherical", "cartesian", "cartesianNormalizeInPlace", "acos", "epsilon", "buffer_default", "lines", "line", "x", "y", "m", "noop", "result", "pointEqual_default", "a", "b", "abs", "epsilon", "Intersection", "point", "points", "other", "entry", "rejoin_default", "segments", "compareIntersection", "startInside", "interpolate", "stream", "subject", "clip", "i", "n", "segment", "p0", "p1", "x", "pointEqual_default", "epsilon", "link", "start", "current", "isSubject", "array", "a", "b", "longitude", "point", "abs", "pi", "sign", "tau", "polygonContains_default", "polygon", "lambda", "phi", "sinPhi", "sin", "normal", "cos", "angle", "winding", "sum", "Adder", "halfPi", "epsilon", "i", "n", "m", "ring", "point0", "lambda0", "phi0", "quarterPi", "sinPhi0", "cosPhi0", "j", "lambda1", "sinPhi1", "cosPhi1", "point1", "phi1", "delta", "absDelta", "antimeridian", "k", "atan2", "arc", "cartesianCross", "cartesian", "cartesianNormalizeInPlace", "intersection", "phiArc", "asin", "epsilon2", "clip_default", "pointVisible", "clipLine", "interpolate", "start", "sink", "line", "ringBuffer", "buffer_default", "ringSink", "polygonStarted", "polygon", "segments", "ring", "clip", "point", "lineStart", "lineEnd", "pointRing", "ringStart", "ringEnd", "merge", "startInside", "polygonContains_default", "rejoin_default", "compareIntersection", "lambda", "phi", "pointLine", "clean", "ringSegments", "i", "n", "m", "segment", "validSegment", "a", "b", "halfPi", "epsilon", "antimeridian_default", "clip_default", "clipAntimeridianLine", "clipAntimeridianInterpolate", "pi", "halfPi", "stream", "lambda0", "phi0", "sign0", "clean", "lambda1", "phi1", "sign1", "delta", "abs", "epsilon", "clipAntimeridianIntersect", "cosPhi0", "cosPhi1", "sinLambda0Lambda1", "sin", "atan", "cos", "from", "to", "direction", "phi", "lambda", "circle_default", "radius", "cr", "cos", "delta", "radians", "smallRadius", "notHemisphere", "abs", "epsilon", "interpolate", "from", "to", "direction", "stream", "circleStream", "visible", "lambda", "phi", "clipLine", "point0", "c0", "v0", "v00", "clean", "point1", "point2", "v", "c", "code", "pi", "intersect", "pointEqual_default", "t", "a", "b", "two", "pa", "cartesian", "pb", "n1", "n2", "cartesianCross", "n2n2", "cartesianDot", "n1n2", "determinant", "c1", "c2", "n1xn2", "A", "cartesianScale", "B", "cartesianAddInPlace", "u", "w", "uu", "t2", "sqrt", "q", "spherical", "lambda0", "lambda1", "phi0", "phi1", "z", "polar", "meridian", "q1", "r", "clip_default", "line_default", "a", "b", "x0", "y0", "x1", "y1", "ax", "ay", "bx", "by", "t0", "t1", "dx", "dy", "r", "clipMax", "clipMin", "clipRectangle", "x0", "y0", "x1", "y1", "visible", "x", "y", "interpolate", "from", "to", "direction", "stream", "a", "a1", "corner", "comparePoint", "p", "abs", "epsilon", "compareIntersection", "b", "ca", "cb", "activeStream", "bufferStream", "buffer_default", "segments", "polygon", "ring", "x__", "y__", "v__", "x_", "y_", "v_", "first", "clean", "clipStream", "point", "lineStart", "lineEnd", "polygonStart", "polygonEnd", "polygonInside", "winding", "i", "n", "j", "m", "a0", "b0", "b1", "startInside", "cleanInside", "merge", "rejoin_default", "linePoint", "v", "line_default", "identity_default", "x", "areaSum", "Adder", "areaRingSum", "x00", "y00", "x0", "y0", "areaStream", "noop", "areaRingStart", "areaRingEnd", "abs", "area", "areaPointFirst", "x", "y", "areaPoint", "area_default", "x0", "y0", "x1", "y1", "boundsStream", "boundsPoint", "noop", "bounds", "x", "y", "bounds_default", "X0", "Y0", "Z0", "X1", "Y1", "Z1", "X2", "Y2", "Z2", "x00", "y00", "x0", "y0", "centroidStream", "centroidPoint", "centroidLineStart", "centroidLineEnd", "centroidRingStart", "centroidRingEnd", "centroid", "x", "y", "centroidPointFirstLine", "centroidPointLine", "dx", "dy", "z", "sqrt", "centroidPointFirstRing", "centroidPointRing", "centroid_default", "PathContext", "context", "_", "x", "y", "tau", "noop", "lengthSum", "Adder", "lengthRing", "x00", "y00", "x0", "y0", "lengthStream", "noop", "lengthPointFirst", "lengthPoint", "length", "x", "y", "sqrt", "measure_default", "cacheDigits", "cacheAppend", "cacheRadius", "cacheCircle", "PathString", "digits", "append", "appendRound", "_", "x", "y", "s", "result", "strings", "i", "j", "d", "k", "path_default", "projection", "context", "digits", "pointRadius", "projectionStream", "contextStream", "path", "object", "stream_default", "area_default", "measure_default", "bounds_default", "centroid_default", "_", "identity_default", "PathString", "PathContext", "d", "transformer", "methods", "stream", "s", "TransformStream", "key", "x", "y", "fit", "projection", "fitBounds", "object", "clip", "stream_default", "bounds_default", "fitExtent", "extent", "b", "w", "h", "k", "x", "y", "fitSize", "size", "fitWidth", "width", "fitHeight", "height", "maxDepth", "cosMinDistance", "cos", "radians", "resample_default", "project", "delta2", "resample", "resampleNone", "transformer", "x", "y", "resampleLineTo", "x0", "y0", "lambda0", "a0", "b0", "c0", "x1", "y1", "lambda1", "a1", "b1", "c1", "depth", "stream", "dx", "dy", "d2", "a", "b", "c", "m", "sqrt", "phi2", "asin", "lambda2", "abs", "epsilon", "atan2", "p", "x2", "y2", "dx2", "dy2", "dz", "lambda00", "x00", "y00", "a00", "b00", "c00", "resampleStream", "point", "lineStart", "lineEnd", "ringStart", "linePoint", "lambda", "phi", "cartesian", "ringPoint", "ringEnd", "transformRadians", "transformer", "x", "y", "radians", "transformRotate", "rotate", "scaleTranslate", "k", "dx", "dy", "sx", "sy", "transform", "scaleTranslateRotate", "alpha", "cosAlpha", "cos", "sinAlpha", "sin", "a", "b", "ai", "bi", "ci", "fi", "projection", "project", "projectionMutator", "projectAt", "lambda", "phi", "deltaLambda", "deltaPhi", "deltaGamma", "theta", "preclip", "antimeridian_default", "x0", "y0", "x1", "y1", "postclip", "identity_default", "delta2", "projectResample", "projectTransform", "projectRotateTransform", "cache", "cacheStream", "point", "invert", "degrees", "stream", "_", "reset", "circle_default", "clipRectangle", "recenter", "resample_default", "sqrt", "extent", "object", "fitExtent", "size", "fitSize", "width", "fitWidth", "height", "fitHeight", "center", "rotateRadians", "compose_default", "conicProjection", "projectAt", "phi0", "phi1", "pi", "m", "projectionMutator", "p", "_", "radians", "degrees", "cylindricalEqualAreaRaw", "phi0", "cosPhi0", "cos", "forward", "lambda", "phi", "sin", "x", "y", "asin", "conicEqualAreaRaw", "y0", "y1", "sy0", "sin", "n", "abs", "epsilon", "cylindricalEqualAreaRaw", "c", "r0", "sqrt", "project", "x", "y", "r", "cos", "r0y", "l", "atan2", "sign", "pi", "asin", "conicEqualArea_default", "conicProjection", "azimuthalInvert", "angle", "x", "y", "z", "sqrt", "c", "sc", "sin", "cc", "cos", "atan2", "asin", "mercatorRaw", "lambda", "phi", "log", "tan", "halfPi", "x", "y", "atan", "exp", "mercator_default", "mercatorProjection", "tau", "project", "m", "projection", "center", "scale", "translate", "clipExtent", "x0", "y0", "x1", "y1", "_", "reclip", "k", "pi", "t", "rotation_default", "equirectangularRaw", "lambda", "phi", "equirectangular_default", "projection", "orthographicRaw", "x", "y", "cos", "sin", "azimuthalInvert", "asin", "orthographic_default", "projection", "epsilon", "GEO_DATA_FORMAT", "decodeArc", "encoded", "key", "kx", "ky", "tx", "ty", "count", "points", "buckets", "x", "y", "i", "ringCoordinates", "ring", "out", "arc", "reversed", "n", "j", "ringArea", "coordinates", "area", "area_default", "decodeGeoFile", "data", "arcs", "ref", "index", "features", "f", "mainland", "rings", "resolved", "r", "Clip", "Graphics2D", "ShapeNode", "node", "property", "snapValue", "FIT", "POINT_BASE", "POINT_RANGE", "POLYGON_BASE", "POLYGON_RANGE", "clamp01", "value", "pointBucketLimit", "detail", "area", "minWeight", "polygonAreaLimit", "partsOf", "features", "frame", "parts", "feature", "mainland", "p", "polygons", "largest", "polygon", "centerLongitude", "west", "east", "mid", "makeProjection", "kind", "south", "north", "lon", "lat", "mercator_default", "equirectangular_default", "orthographic_default", "span", "conicEqualArea_default", "fitFrame", "shape", "ringCoordinates", "bounds_default", "candidate", "projection", "x0", "y0", "x1", "y1", "path_default", "size", "project", "object", "closed", "contours", "current", "centerX", "centerY", "sink", "x", "y", "flat", "isClosed", "n", "points", "contourLength", "stream_default", "length", "i", "MAX_EDGE_DEGREES", "keepMask", "arc", "limit", "mask", "lastLon", "lastLat", "far", "dLon", "filteredPoints", "refs", "maskFor", "out", "reversed", "j", "ringLimit", "ring", "kept", "buckets", "a", "b", "windsAsOriginal", "exterior", "area_default", "endKey", "last", "chainArcs", "arcs", "atNode", "key", "list", "visited", "chains", "refStart", "refEnd", "nextAt", "node", "next", "prev", "buildGeometry", "fitted", "borders", "sum", "pointLimit", "polygonLimit", "_", "limits", "usage", "rings", "use", "masks", "index", "fills", "holes", "hole", "lineArcs", "count", "lines", "chain", "total", "c", "bytes", "ByteCache", "_budget", "previous", "oldest", "entry", "frames", "geometries", "geoGeometry", "request", "frameKey", "cached", "made", "geometry", "clearGeoGeometry", "ringBuckets", "points", "n", "buckets", "radians", "weight", "prev", "next", "i", "area", "a", "b", "c", "cos", "ax", "ay", "bx", "by", "cx", "cy", "heap", "position", "less", "j", "swap", "up", "parent", "down", "l", "r", "smallest", "push", "remove", "at", "last", "floor", "final", "p", "q", "weightBucket", "GEO_DATA_VERSION", "GEO_DATA_FORMAT", "geoUrlSource", "base", "init", "key", "url", "response", "geoLoaderSource", "load", "value", "definedFeature", "code", "definition", "serial", "shape", "feature", "polygons", "arcIndex", "toRing", "ring", "coordinates", "points", "lon", "lat", "i", "ringBuckets", "measured", "rings", "resolved", "ringAreas", "area", "area_default", "a", "name", "GeoRegistry", "source", "shapes", "codes", "rawCode", "failure", "error", "geoRegistry", "entries", "inflight", "loaders", "warned", "version", "countryFileKey", "code", "GEO_DATA_VERSION", "statesFileKey", "country", "geoDataVersion", "geoFileEntry", "key", "fetchEntry", "data", "geoRegistry", "decodeGeoFile", "error", "loadGeoFile", "current", "job", "entry", "geoLoader", "load", "clearGeoFiles", "CODE", "normalizeIso", "value", "raw", "out", "item", "code", "isSubdivision", "geoFilesFor", "codes", "level", "files", "geoRegistry", "statesFileKey", "countryFileKey", "selectGeoFeatures", "frame", "features", "seen", "unknown", "pending", "add", "feature", "defined", "subdivision", "key", "entry", "geoFileEntry", "file", "children", "f", "CONTOURS_PER_PATH", "POINTS_PER_PATH", "coordinate", "value", "chunk", "contours", "total", "scale", "chunks", "parts", "count", "points", "from", "length", "flush", "to", "contour", "p", "i", "GeoBorder", "ShapeNode", "props", "assets", "file", "geoFilesFor", "geoLoader", "ctx", "drawn", "fill", "shadow", "g", "Graphics2D", "overlay", "stroke", "centred", "layer", "castsShadow", "Clip", "start", "end", "width", "height", "centerBounds", "span", "localStart", "localEnd", "codes", "level", "frame", "selection", "selectGeoFeatures", "code", "geometry", "geoGeometry", "geoRegistry", "geoDataVersion", "cached", "__decorate", "property", "normalizeIso", "snapValue", "node", "Mat", "VERTEX", "FRAGMENT", "atmosphereMaterial", "color", "falloff", "intensity", "COUNTRIES", "POINTS", "decoded", "world", "decode", "countries", "rings", "cursor", "row", "COUNTRIES", "own", "size", "ring", "readRing", "POINTS", "count", "points", "lon", "lat", "readValue", "shift", "result", "byte", "lines", "borderLines", "build", "nodeKey", "lon", "lat", "unique", "ring", "world", "count", "i", "j", "ax", "ay", "bx", "by", "a", "key", "segments", "at", "segment", "index", "node", "list", "used", "out", "nextAt", "start", "first", "forward", "far", "fx", "fy", "backward", "points", "write", "command", "driveCommand", "easeInOut", "node", "Canvas3D", "Geo", "Graphics3D", "Mat", "Scene3D", "property", "lerpColor3D", "resolveColor3D", "snapFlag", "snapValue", "cameraOrbit", "orbitProps", "DEFAULT_MARKER_COLORS", "markerColorAt", "index", "palette", "DEFAULT_ARC_COLOR", "DEFAULT_MARKER_SIZE", "DEFAULT_ARC_WIDTH", "DEFAULT_ARC_LIFT", "placeSeq", "nextId", "prefix", "createMarker", "at", "createArc", "from", "to", "markerEnd", "markerId", "placeEnd", "lat", "lon", "markersOf", "value", "rowsOf", "row", "finite", "idOf", "text", "clamp", "wrapLongitude", "positive", "unit", "arcsOf", "endOf", "markersToValue", "markers", "arcsToValue", "arcs", "arc", "endToValue", "end", "parsed", "positional", "n", "fallback", "min", "max", "drawableMarkers", "value", "markersOf", "marker", "index", "markerColorAt", "clamp", "drawableArcs", "arcsValue", "markersValue", "byId", "arcsOf", "arc", "from", "resolveEnd", "to", "end", "markers", "arcSegments", "span", "min", "max", "WORLD_BOUNDS", "DEG", "latLonToVector", "lat", "lon", "phi", "lambda", "ring", "latLonToPosition", "at", "radius", "x", "y", "z", "latLonToUV", "latLonToCanvas", "width", "height", "canvasBounds", "orbitForLongitude", "longitudeForOrbit", "orbit", "greatCircle", "from", "to", "options", "lift", "segments", "a", "b", "dot", "clamp", "omega", "points", "i", "t", "wa", "wb", "length", "scale", "shortestTurn", "value", "min", "max", "Graphics2D", "mapHeight", "width", "worldMapGraphics", "style", "height", "bounds", "canvasBounds", "g", "Graphics2D", "country", "world", "commands", "ring", "appendRing", "drawBoundaries", "line", "graticuleLines", "count", "x", "y", "latLonToCanvas", "paint", "borderLines", "i", "step", "spacing", "lines", "lon", "meridian", "lat", "RADIUS", "MARKER_LIFT", "Globe", "Canvas3D", "props", "args", "orbitProps", "easeInOut", "data", "latitude", "longitude", "framing", "arc", "duration", "easing", "fromOrbit", "fromElevation", "fromZoom", "toOrbit", "shortestTurn", "driveCommand", "t", "eased", "scene", "Scene3D", "distance", "cameraOrbit", "g3", "Graphics3D", "atmosphereMaterial", "markers", "drawableMarkers", "placements", "colors", "marker", "size", "latLonToPosition", "Geo", "Mat", "drawableArcs", "points", "greatCircle", "arcSegments", "drawn", "style", "key", "cached", "map", "worldMapGraphics", "mapHeight", "hexOf", "__decorate", "property", "snapValue", "snapFlag", "resolveColor3D", "lerpColor3D", "command", "node", "shortestTurn", "from", "to", "hexOf", "value", "r", "g", "b", "a", "byte", "channel", "NODES", "Globe", "GeoBorder"]
7
7
  }