├── .github
└── workflows
│ └── gh-pages.yml
├── .gitignore
├── LICENSE
├── README.md
├── data
├── README.md
├── data.bin
├── maxRect.js
├── process.js
├── protobuf.wrapper.js
└── protocol.proto
├── index.html
├── package.json
├── pnpm-lock.yaml
├── src
├── core
│ ├── Input.ts
│ └── Viewport.ts
├── main.css
├── main.ts
├── meshes
│ ├── Buildings.ts
│ ├── Grid.ts
│ └── Starfield.ts
└── vite-env.d.ts
├── tsconfig.json
└── vite.config.ts
/.github/workflows/gh-pages.yml:
--------------------------------------------------------------------------------
1 | name: gh-pages
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 |
8 | permissions:
9 | contents: read
10 | pages: write
11 | id-token: write
12 |
13 | concurrency:
14 | group: 'gh-pages'
15 | cancel-in-progress: false
16 |
17 | jobs:
18 | deploy:
19 | environment:
20 | name: github-pages
21 | url: ${{ steps.deployment.outputs.page_url }}
22 | runs-on: ubuntu-latest
23 | steps:
24 | - uses: actions/checkout@v4
25 | - uses: pnpm/action-setup@v4
26 | with:
27 | version: 9
28 | - uses: actions/setup-node@v4
29 | with:
30 | node-version: 20
31 | cache: 'pnpm'
32 | - name: Install
33 | run: pnpm install
34 | - name: Build
35 | run: pnpm build
36 | - uses: actions/configure-pages@v5
37 | - uses: actions/upload-pages-artifact@v3
38 | with:
39 | path: 'dist'
40 | - id: deployment
41 | uses: actions/deploy-pages@v4
42 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | dist
2 | node_modules
3 | data/data.geojson
4 | data/protocol.d.ts
5 | data/protocol.js
6 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License
2 |
3 | Copyright © 2025 Daniel Esteban Nombela
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [nyc](https://nyc.gatunes.com)
2 | ==
3 |
4 | ```bash
5 | # clone repo:
6 | git clone https://github.com/danielesteban/nyc.git
7 | cd nyc
8 | # install dependencies:
9 | pnpm install
10 | # start environment:
11 | pnpm start
12 | # open http://localhost:8080/ in your browser
13 | ```
14 |
--------------------------------------------------------------------------------
/data/README.md:
--------------------------------------------------------------------------------
1 | Download GeoJSON from:
2 | https://nycmaps-nyc.hub.arcgis.com/datasets/nyc::building/about
3 |
4 | Place it at: `data/data.geojson`
5 |
6 | ```
7 | # Parse & Process
8 | node process.js
9 | ```
10 |
11 | Output will be generated at: `data/data.bin`
12 |
--------------------------------------------------------------------------------
/data/data.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/danielesteban/nyc/3522ec635e084aaa42e679febf8e832cf376188a/data/data.bin
--------------------------------------------------------------------------------
/data/maxRect.js:
--------------------------------------------------------------------------------
1 | import { parentPort } from 'worker_threads';
2 | import * as turf from '@turf/turf';
3 |
4 | // I found this code at:
5 | // https://louisz.medium.com/how-to-find-the-maximum-rectangle-within-a-convex-gis-polygon-in-javascript-16364e8f7f4
6 | // Seems to work fine for most cases. It can prolly be optimized, tho.
7 | // But since it only needs to run offline once I haven't bothered.
8 |
9 | function maxRect(coords) {
10 | let polygon = turf.polygon([coords]);
11 |
12 | const unitsOption = {units: 'kilometers'};
13 | let polyline, length, bbox, percentage1, percentage2, fraction, point1, point2, bearing;
14 | let point1a, point1b, point2a, point2b, line1, line2;
15 | let largest, diagonalLength;
16 |
17 | polyline = turf.polygonToLine(polygon);
18 | length = turf.length(polyline, unitsOption);
19 | bbox = turf.bbox(polygon);
20 | diagonalLength = turf.length(turf.lineString([[bbox[0], bbox[1]], [bbox[2], bbox[3]]]));
21 |
22 | const SEARCH_PARTS = 20;
23 | for (let i = 0; i < SEARCH_PARTS; i++) {
24 | percentage1 = i / SEARCH_PARTS;
25 | point1 = turf.along(polyline, percentage1 * length, unitsOption);
26 |
27 | for (let j = 1; j < SEARCH_PARTS; j++) {
28 | fraction = j / SEARCH_PARTS;
29 | percentage2 = percentage1 + fraction;
30 |
31 | if (percentage2 > 1) { percentage2 -= 1; }
32 |
33 | let distance = percentage2 * length;
34 | point2 = turf.along(polyline, distance, unitsOption);
35 |
36 | //process as side
37 | //get bearing between points
38 | bearing = turf.bearing(point1, point2);
39 |
40 | //create perpendicual lines at start and end
41 | point1a = turf.destination(point1, diagonalLength, bearing + 90, unitsOption);
42 | point1b = turf.destination(point1, diagonalLength, bearing - 90, unitsOption);
43 | line1 = turf.lineString([turf.getCoord(point1a), turf.getCoord(point1b)]);
44 |
45 | point2a = turf.destination(point2, diagonalLength, bearing + 90, unitsOption);
46 | point2b = turf.destination(point2, diagonalLength, bearing - 90, unitsOption);
47 | line2 = turf.lineString([turf.getCoord(point2a), turf.getCoord(point2b)]);
48 |
49 | //intersect by polygon (assume single parts)
50 | let intersect1 = turf.lineIntersect(line1, polygon);
51 | let intersect2 = turf.lineIntersect(line2, polygon);
52 |
53 | let intersectObjArray = [];
54 | turf.coordAll(intersect1)
55 | .filter(coord => {
56 | return turf.distance(point1, turf.point(coord), unitsOption) > 0.001;
57 | })
58 | .forEach(coord => {
59 | intersectObjArray.push({
60 | coord: coord,
61 | origin: turf.getCoord(point1),
62 | opp: turf.getCoord(point2),
63 | oppLine: line2,
64 | p: point1,
65 | op: point2,
66 | });
67 | });
68 |
69 | turf.coordAll(intersect2)
70 | .filter(coord => {
71 | return turf.distance(point2, turf.point(coord), unitsOption) > 0.001;
72 | })
73 | .forEach(coord => {
74 | intersectObjArray.push({
75 | coord: coord,
76 | origin: turf.getCoord(point2),
77 | opp: turf.getCoord(point1),
78 | oppLine: line1,
79 | p: point2,
80 | op: point1,
81 | });
82 | });
83 |
84 | if (intersectObjArray.length === 0)
85 | continue;
86 |
87 | intersectObjArray.forEach((obj, k) => {
88 | const { origin, coord, opp, oppLine, p, op } = obj;
89 | let dest = turf.destination(
90 | turf.point(coord),
91 | turf.distance(p, op, unitsOption),
92 | turf.bearing(p, op),
93 | unitsOption
94 | );
95 |
96 | //form rectangle and add to dest
97 | let coords = [
98 | origin, opp,
99 | turf.getCoord(dest),
100 | coord, origin,
101 | ];
102 |
103 | let rectangle = turf.polygon([[...coords]]);
104 |
105 | //all 4 coordinates must be within the polygon
106 | //what has been sliced by polygon should be empty
107 | if (
108 | !turf.booleanContains(polygon, rectangle)
109 | || turf.flatten(turf.difference(turf.featureCollection([rectangle, polygon])) || turf.featureCollection([])).features.length > 0
110 | ) {
111 | return;
112 | }
113 |
114 | if (largest === undefined || turf.area(rectangle) > turf.area(largest)) {
115 | largest = rectangle;
116 | }
117 | });
118 | }
119 | }
120 |
121 | return largest;
122 | }
123 |
124 | parentPort.on('message', (coords) => {
125 | let rect;
126 | try {
127 | rect = maxRect(coords);
128 | } catch (e) {}
129 | parentPort.postMessage(rect && rect.geometry.coordinates[0].map((p) => turf.toMercator(p)));
130 | });
131 |
--------------------------------------------------------------------------------
/data/process.js:
--------------------------------------------------------------------------------
1 | import fs from 'fs';
2 | import os from 'os';
3 | import path from 'path';
4 | import { fileURLToPath } from 'url';
5 | import { Worker } from 'worker_threads';
6 | import geojson from 'geojson-stream';
7 | // import * as turf from '@turf/turf';
8 | import { Buildings, Building } from './protocol.js';
9 |
10 | const __dirname = path.dirname(fileURLToPath(import.meta.url));
11 | // const origin = turf.point([-73.971321, 40.776676]);
12 | // const radius = 1;
13 | const workers = Array.from({ length: os.cpus().length }, () => new Worker(path.join(__dirname, 'maxRect.js')));
14 | const output = new Buildings();
15 |
16 | let parsed = 0;
17 | let processed = 0;
18 | const queue = [];
19 | const log = () => process.stdout.write(
20 | parsed + ' parsed - ' + queue.length + ' queued - ' + processed + ' processed' + '\x1b[0G'
21 | );
22 |
23 | const stream = fs.createReadStream(path.join(__dirname, 'data.geojson'))
24 | .pipe(geojson.parse((building) => {
25 | parsed++;
26 | log();
27 | if (
28 | building.geometry.type !== 'Polygon'
29 | || building.geometry.coordinates === null
30 | || building.geometry.coordinates.length === 0
31 | || building.properties.HEIGHT_ROOF === 0
32 | ) {
33 | return;
34 | }
35 | // if (!building.geometry.coordinates[0].some((p) => (turf.distance(origin, p, {units: 'kilometers'}) < radius))) {
36 | // return;
37 | // }
38 | queue.push(building);
39 | processQueue();
40 | }));
41 |
42 | const processQueue = () => {
43 | if (!queue.length) {
44 | finish();
45 | return;
46 | }
47 | const worker = workers.find((worker) => !worker.isBusy);
48 | if (!worker) {
49 | log();
50 | return;
51 | }
52 | const building = queue.pop();
53 | log();
54 | worker.isBusy = true;
55 | worker.once('message', (rect) => {
56 | worker.isBusy = false;
57 | if (!rect) {
58 | processQueue();
59 | return;
60 | }
61 | const min = { x: Infinity, y: Infinity };
62 | const max = { x: -Infinity, y: -Infinity };
63 | rect.forEach((p) => {
64 | min.x = Math.min(min.x, p[0]);
65 | min.y = Math.min(min.y, p[1]);
66 | max.x = Math.max(max.x, p[0]);
67 | max.y = Math.max(max.y, p[1]);
68 | });
69 | const position = { x: (min.x + max.x) / 2, y: (min.y + max.y) / 2 };
70 | const width = Math.sqrt(
71 | (rect[0][0] - rect[1][0]) ** 2
72 | + (rect[0][1] - rect[1][1]) ** 2
73 | );
74 | const depth = Math.sqrt(
75 | (rect[1][0] - rect[2][0]) ** 2
76 | + (rect[1][1] - rect[2][1]) ** 2
77 | );
78 | const rotation = -Math.atan2(rect[0][1] - rect[1][1], rect[0][0] - rect[1][0]);
79 | output.buildings.push(new Building({
80 | position,
81 | scale: { x: width, y: building.properties.HEIGHT_ROOF, z: depth },
82 | rotation,
83 | }));
84 | processed++;
85 | log();
86 | processQueue();
87 | });
88 | worker.postMessage(building.geometry.coordinates[0]);
89 | };
90 |
91 | stream.on('end', () => finish());
92 |
93 | const finish = () => {
94 | if (
95 | stream.readable
96 | || workers.some((worker) => worker.isBusy)
97 | ) {
98 | return;
99 | }
100 | const min = { x: Infinity, y: Infinity };
101 | const max = { x: -Infinity, y: -Infinity };
102 | output.buildings.forEach(({ position }) => {
103 | min.x = Math.min(min.x, position.x);
104 | min.y = Math.min(min.y, position.y);
105 | max.x = Math.max(max.x, position.x);
106 | max.y = Math.max(max.y, position.y);
107 | });
108 | const origin = { x: (min.x + max.x) / 2, y: (min.y + max.y) / 2 };
109 | output.buildings.forEach((building) => {
110 | building.position.x -= origin.x;
111 | building.position.y -= origin.y;
112 | });
113 | fs.writeFileSync(
114 | path.join(__dirname, 'data.bin'),
115 | Buildings.encode(output).finish()
116 | );
117 | console.log('\ndone!');
118 | process.exit();
119 | };
120 |
--------------------------------------------------------------------------------
/data/protobuf.wrapper.js:
--------------------------------------------------------------------------------
1 | import $protobuf from $DEPENDENCY;
2 |
3 | $OUTPUT;
4 |
5 | export default $root;
6 |
--------------------------------------------------------------------------------
/data/protocol.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 |
3 | message Vector2 {
4 | float x = 1;
5 | float y = 2;
6 | }
7 |
8 | message Vector3 {
9 | float x = 1;
10 | float y = 2;
11 | float z = 3;
12 | }
13 |
14 | message Building {
15 | Vector2 position = 1;
16 | Vector3 scale = 2;
17 | float rotation = 3;
18 | }
19 |
20 | message Buildings {
21 | repeated Building buildings = 1;
22 | }
23 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | nyc
6 |
7 |
8 |
9 |
10 |
14 | Loading...
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nyc",
3 | "private": true,
4 | "type": "module",
5 | "scripts": {
6 | "build": "vite build",
7 | "build:protocol": "pbjs -t static-module -w ./data/protobuf.wrapper.js --dependency protobufjs/minimal.js --es6 ./data/protocol.proto -o ./data/protocol.js && pbts -o ./data/protocol.d.ts ./data/protocol.js",
8 | "postinstall": "pnpm build:protocol",
9 | "start": "vite"
10 | },
11 | "dependencies": {
12 | "protobufjs": "^7.4.0",
13 | "three": "^0.173.0"
14 | },
15 | "devDependencies": {
16 | "@turf/turf": "^7.2.0",
17 | "@types/node": "^22.13.0",
18 | "@types/three": "^0.173.0",
19 | "geojson-stream": "^0.1.0",
20 | "protobufjs-cli": "^1.1.3",
21 | "typescript": "^5.7.3",
22 | "vite": "^6.0.11"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | dependencies:
11 | protobufjs:
12 | specifier: ^7.4.0
13 | version: 7.4.0
14 | three:
15 | specifier: ^0.173.0
16 | version: 0.173.0
17 | devDependencies:
18 | '@turf/turf':
19 | specifier: ^7.2.0
20 | version: 7.2.0
21 | '@types/node':
22 | specifier: ^22.13.0
23 | version: 22.13.0
24 | '@types/three':
25 | specifier: ^0.173.0
26 | version: 0.173.0
27 | geojson-stream:
28 | specifier: ^0.1.0
29 | version: 0.1.0
30 | protobufjs-cli:
31 | specifier: ^1.1.3
32 | version: 1.1.3(protobufjs@7.4.0)
33 | typescript:
34 | specifier: ^5.7.3
35 | version: 5.7.3
36 | vite:
37 | specifier: ^6.0.11
38 | version: 6.0.11(@types/node@22.13.0)
39 |
40 | packages:
41 |
42 | '@babel/helper-string-parser@7.25.9':
43 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
44 | engines: {node: '>=6.9.0'}
45 |
46 | '@babel/helper-validator-identifier@7.25.9':
47 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
48 | engines: {node: '>=6.9.0'}
49 |
50 | '@babel/parser@7.26.7':
51 | resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==}
52 | engines: {node: '>=6.0.0'}
53 | hasBin: true
54 |
55 | '@babel/types@7.26.7':
56 | resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==}
57 | engines: {node: '>=6.9.0'}
58 |
59 | '@esbuild/aix-ppc64@0.24.2':
60 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
61 | engines: {node: '>=18'}
62 | cpu: [ppc64]
63 | os: [aix]
64 |
65 | '@esbuild/android-arm64@0.24.2':
66 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==}
67 | engines: {node: '>=18'}
68 | cpu: [arm64]
69 | os: [android]
70 |
71 | '@esbuild/android-arm@0.24.2':
72 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==}
73 | engines: {node: '>=18'}
74 | cpu: [arm]
75 | os: [android]
76 |
77 | '@esbuild/android-x64@0.24.2':
78 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==}
79 | engines: {node: '>=18'}
80 | cpu: [x64]
81 | os: [android]
82 |
83 | '@esbuild/darwin-arm64@0.24.2':
84 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==}
85 | engines: {node: '>=18'}
86 | cpu: [arm64]
87 | os: [darwin]
88 |
89 | '@esbuild/darwin-x64@0.24.2':
90 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==}
91 | engines: {node: '>=18'}
92 | cpu: [x64]
93 | os: [darwin]
94 |
95 | '@esbuild/freebsd-arm64@0.24.2':
96 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==}
97 | engines: {node: '>=18'}
98 | cpu: [arm64]
99 | os: [freebsd]
100 |
101 | '@esbuild/freebsd-x64@0.24.2':
102 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==}
103 | engines: {node: '>=18'}
104 | cpu: [x64]
105 | os: [freebsd]
106 |
107 | '@esbuild/linux-arm64@0.24.2':
108 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==}
109 | engines: {node: '>=18'}
110 | cpu: [arm64]
111 | os: [linux]
112 |
113 | '@esbuild/linux-arm@0.24.2':
114 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==}
115 | engines: {node: '>=18'}
116 | cpu: [arm]
117 | os: [linux]
118 |
119 | '@esbuild/linux-ia32@0.24.2':
120 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==}
121 | engines: {node: '>=18'}
122 | cpu: [ia32]
123 | os: [linux]
124 |
125 | '@esbuild/linux-loong64@0.24.2':
126 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==}
127 | engines: {node: '>=18'}
128 | cpu: [loong64]
129 | os: [linux]
130 |
131 | '@esbuild/linux-mips64el@0.24.2':
132 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==}
133 | engines: {node: '>=18'}
134 | cpu: [mips64el]
135 | os: [linux]
136 |
137 | '@esbuild/linux-ppc64@0.24.2':
138 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==}
139 | engines: {node: '>=18'}
140 | cpu: [ppc64]
141 | os: [linux]
142 |
143 | '@esbuild/linux-riscv64@0.24.2':
144 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==}
145 | engines: {node: '>=18'}
146 | cpu: [riscv64]
147 | os: [linux]
148 |
149 | '@esbuild/linux-s390x@0.24.2':
150 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==}
151 | engines: {node: '>=18'}
152 | cpu: [s390x]
153 | os: [linux]
154 |
155 | '@esbuild/linux-x64@0.24.2':
156 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==}
157 | engines: {node: '>=18'}
158 | cpu: [x64]
159 | os: [linux]
160 |
161 | '@esbuild/netbsd-arm64@0.24.2':
162 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==}
163 | engines: {node: '>=18'}
164 | cpu: [arm64]
165 | os: [netbsd]
166 |
167 | '@esbuild/netbsd-x64@0.24.2':
168 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==}
169 | engines: {node: '>=18'}
170 | cpu: [x64]
171 | os: [netbsd]
172 |
173 | '@esbuild/openbsd-arm64@0.24.2':
174 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==}
175 | engines: {node: '>=18'}
176 | cpu: [arm64]
177 | os: [openbsd]
178 |
179 | '@esbuild/openbsd-x64@0.24.2':
180 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==}
181 | engines: {node: '>=18'}
182 | cpu: [x64]
183 | os: [openbsd]
184 |
185 | '@esbuild/sunos-x64@0.24.2':
186 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==}
187 | engines: {node: '>=18'}
188 | cpu: [x64]
189 | os: [sunos]
190 |
191 | '@esbuild/win32-arm64@0.24.2':
192 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==}
193 | engines: {node: '>=18'}
194 | cpu: [arm64]
195 | os: [win32]
196 |
197 | '@esbuild/win32-ia32@0.24.2':
198 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==}
199 | engines: {node: '>=18'}
200 | cpu: [ia32]
201 | os: [win32]
202 |
203 | '@esbuild/win32-x64@0.24.2':
204 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==}
205 | engines: {node: '>=18'}
206 | cpu: [x64]
207 | os: [win32]
208 |
209 | '@jsdoc/salty@0.2.9':
210 | resolution: {integrity: sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==}
211 | engines: {node: '>=v12.0.0'}
212 |
213 | '@protobufjs/aspromise@1.1.2':
214 | resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
215 |
216 | '@protobufjs/base64@1.1.2':
217 | resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
218 |
219 | '@protobufjs/codegen@2.0.4':
220 | resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
221 |
222 | '@protobufjs/eventemitter@1.1.0':
223 | resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
224 |
225 | '@protobufjs/fetch@1.1.0':
226 | resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
227 |
228 | '@protobufjs/float@1.0.2':
229 | resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
230 |
231 | '@protobufjs/inquire@1.1.0':
232 | resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
233 |
234 | '@protobufjs/path@1.1.2':
235 | resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
236 |
237 | '@protobufjs/pool@1.1.0':
238 | resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
239 |
240 | '@protobufjs/utf8@1.1.0':
241 | resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
242 |
243 | '@rollup/rollup-android-arm-eabi@4.34.0':
244 | resolution: {integrity: sha512-Eeao7ewDq79jVEsrtWIj5RNqB8p2knlm9fhR6uJ2gqP7UfbLrTrxevudVrEPDM7Wkpn/HpRC2QfazH7MXLz3vQ==}
245 | cpu: [arm]
246 | os: [android]
247 |
248 | '@rollup/rollup-android-arm64@4.34.0':
249 | resolution: {integrity: sha512-yVh0Kf1f0Fq4tWNf6mWcbQBCLDpDrDEl88lzPgKhrgTcDrTtlmun92ywEF9dCjmYO3EFiSuJeeo9cYRxl2FswA==}
250 | cpu: [arm64]
251 | os: [android]
252 |
253 | '@rollup/rollup-darwin-arm64@4.34.0':
254 | resolution: {integrity: sha512-gCs0ErAZ9s0Osejpc3qahTsqIPUDjSKIyxK/0BGKvL+Tn0n3Kwvj8BrCv7Y5sR1Ypz1K2qz9Ny0VvkVyoXBVUQ==}
255 | cpu: [arm64]
256 | os: [darwin]
257 |
258 | '@rollup/rollup-darwin-x64@4.34.0':
259 | resolution: {integrity: sha512-aIB5Anc8hngk15t3GUkiO4pv42ykXHfmpXGS+CzM9CTyiWyT8HIS5ygRAy7KcFb/wiw4Br+vh1byqcHRTfq2tQ==}
260 | cpu: [x64]
261 | os: [darwin]
262 |
263 | '@rollup/rollup-freebsd-arm64@4.34.0':
264 | resolution: {integrity: sha512-kpdsUdMlVJMRMaOf/tIvxk8TQdzHhY47imwmASOuMajg/GXpw8GKNd8LNwIHE5Yd1onehNpcUB9jHY6wgw9nHQ==}
265 | cpu: [arm64]
266 | os: [freebsd]
267 |
268 | '@rollup/rollup-freebsd-x64@4.34.0':
269 | resolution: {integrity: sha512-D0RDyHygOBCQiqookcPevrvgEarN0CttBecG4chOeIYCNtlKHmf5oi5kAVpXV7qs0Xh/WO2RnxeicZPtT50V0g==}
270 | cpu: [x64]
271 | os: [freebsd]
272 |
273 | '@rollup/rollup-linux-arm-gnueabihf@4.34.0':
274 | resolution: {integrity: sha512-mCIw8j5LPDXmCOW8mfMZwT6F/Kza03EnSr4wGYEswrEfjTfVsFOxvgYfuRMxTuUF/XmRb9WSMD5GhCWDe2iNrg==}
275 | cpu: [arm]
276 | os: [linux]
277 |
278 | '@rollup/rollup-linux-arm-musleabihf@4.34.0':
279 | resolution: {integrity: sha512-AwwldAu4aCJPob7zmjuDUMvvuatgs8B/QiVB0KwkUarAcPB3W+ToOT+18TQwY4z09Al7G0BvCcmLRop5zBLTag==}
280 | cpu: [arm]
281 | os: [linux]
282 |
283 | '@rollup/rollup-linux-arm64-gnu@4.34.0':
284 | resolution: {integrity: sha512-e7kDUGVP+xw05pV65ZKb0zulRploU3gTu6qH1qL58PrULDGxULIS0OSDQJLH7WiFnpd3ZKUU4VM3u/Z7Zw+e7Q==}
285 | cpu: [arm64]
286 | os: [linux]
287 |
288 | '@rollup/rollup-linux-arm64-musl@4.34.0':
289 | resolution: {integrity: sha512-SXYJw3zpwHgaBqTXeAZ31qfW/v50wq4HhNVvKFhRr5MnptRX2Af4KebLWR1wpxGJtLgfS2hEPuALRIY3LPAAcA==}
290 | cpu: [arm64]
291 | os: [linux]
292 |
293 | '@rollup/rollup-linux-loongarch64-gnu@4.34.0':
294 | resolution: {integrity: sha512-e5XiCinINCI4RdyU3sFyBH4zzz7LiQRvHqDtRe9Dt8o/8hTBaYpdPimayF00eY2qy5j4PaaWK0azRgUench6WQ==}
295 | cpu: [loong64]
296 | os: [linux]
297 |
298 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.0':
299 | resolution: {integrity: sha512-3SWN3e0bAsm9ToprLFBSro8nJe6YN+5xmB11N4FfNf92wvLye/+Rh5JGQtKOpwLKt6e61R1RBc9g+luLJsc23A==}
300 | cpu: [ppc64]
301 | os: [linux]
302 |
303 | '@rollup/rollup-linux-riscv64-gnu@4.34.0':
304 | resolution: {integrity: sha512-B1Oqt3GLh7qmhvfnc2WQla4NuHlcxAD5LyueUi5WtMc76ZWY+6qDtQYqnxARx9r+7mDGfamD+8kTJO0pKUJeJA==}
305 | cpu: [riscv64]
306 | os: [linux]
307 |
308 | '@rollup/rollup-linux-s390x-gnu@4.34.0':
309 | resolution: {integrity: sha512-UfUCo0h/uj48Jq2lnhX0AOhZPSTAq3Eostas+XZ+GGk22pI+Op1Y6cxQ1JkUuKYu2iU+mXj1QjPrZm9nNWV9rg==}
310 | cpu: [s390x]
311 | os: [linux]
312 |
313 | '@rollup/rollup-linux-x64-gnu@4.34.0':
314 | resolution: {integrity: sha512-chZLTUIPbgcpm+Z7ALmomXW8Zh+wE2icrG+K6nt/HenPLmtwCajhQC5flNSk1Xy5EDMt/QAOz2MhzfOfJOLSiA==}
315 | cpu: [x64]
316 | os: [linux]
317 |
318 | '@rollup/rollup-linux-x64-musl@4.34.0':
319 | resolution: {integrity: sha512-jo0UolK70O28BifvEsFD/8r25shFezl0aUk2t0VJzREWHkq19e+pcLu4kX5HiVXNz5qqkD+aAq04Ct8rkxgbyQ==}
320 | cpu: [x64]
321 | os: [linux]
322 |
323 | '@rollup/rollup-win32-arm64-msvc@4.34.0':
324 | resolution: {integrity: sha512-Vmg0NhAap2S54JojJchiu5An54qa6t/oKT7LmDaWggpIcaiL8WcWHEN6OQrfTdL6mQ2GFyH7j2T5/3YPEDOOGA==}
325 | cpu: [arm64]
326 | os: [win32]
327 |
328 | '@rollup/rollup-win32-ia32-msvc@4.34.0':
329 | resolution: {integrity: sha512-CV2aqhDDOsABKHKhNcs1SZFryffQf8vK2XrxP6lxC99ELZAdvsDgPklIBfd65R8R+qvOm1SmLaZ/Fdq961+m7A==}
330 | cpu: [ia32]
331 | os: [win32]
332 |
333 | '@rollup/rollup-win32-x64-msvc@4.34.0':
334 | resolution: {integrity: sha512-g2ASy1QwHP88y5KWvblUolJz9rN+i4ZOsYzkEwcNfaNooxNUXG+ON6F5xFo0NIItpHqxcdAyls05VXpBnludGw==}
335 | cpu: [x64]
336 | os: [win32]
337 |
338 | '@turf/along@7.2.0':
339 | resolution: {integrity: sha512-Cf+d2LozABdb0TJoIcJwFKB+qisJY4nMUW9z6PAuZ9UCH7AR//hy2Z06vwYCKFZKP4a7DRPkOMBadQABCyoYuw==}
340 |
341 | '@turf/angle@7.2.0':
342 | resolution: {integrity: sha512-b28rs1NO8Dt/MXadFhnpqH7GnEWRsl+xF5JeFtg9+eM/+l/zGrdliPYMZtAj12xn33w22J1X4TRprAI0rruvVQ==}
343 |
344 | '@turf/area@7.2.0':
345 | resolution: {integrity: sha512-zuTTdQ4eoTI9nSSjerIy4QwgvxqwJVciQJ8tOPuMHbXJ9N/dNjI7bU8tasjhxas/Cx3NE9NxVHtNpYHL0FSzoA==}
346 |
347 | '@turf/bbox-clip@7.2.0':
348 | resolution: {integrity: sha512-q6RXTpqeUQAYLAieUL1n3J6ukRGsNVDOqcYtfzaJbPW+0VsAf+1cI16sN700t0sekbeU1DH/RRVAHhpf8+36wA==}
349 |
350 | '@turf/bbox-polygon@7.2.0':
351 | resolution: {integrity: sha512-Aj4G1GAAy26fmOqMjUk0Z+Lcax5VQ9g1xYDbHLQWXvfTsaueBT+RzdH6XPnZ/seEEnZkio2IxE8V5af/osupgA==}
352 |
353 | '@turf/bbox@7.2.0':
354 | resolution: {integrity: sha512-wzHEjCXlYZiDludDbXkpBSmv8Zu6tPGLmJ1sXQ6qDwpLE1Ew3mcWqt8AaxfTP5QwDNQa3sf2vvgTEzNbPQkCiA==}
355 |
356 | '@turf/bearing@7.2.0':
357 | resolution: {integrity: sha512-Jm0Xt3GgHjRrWvBtAGvgfnADLm+4exud2pRlmCYx8zfiKuNXQFkrcTZcOiJOgTfG20Agq28iSh15uta47jSIbg==}
358 |
359 | '@turf/bezier-spline@7.2.0':
360 | resolution: {integrity: sha512-7BPkc3ufYB9KLvcaTpTsnpXzh9DZoENxCS0Ms9XUwuRXw45TpevwUpOsa3atO76iKQ5puHntqFO4zs8IUxBaaA==}
361 |
362 | '@turf/boolean-clockwise@7.2.0':
363 | resolution: {integrity: sha512-0fJeFSARxy6ealGBM4Gmgpa1o8msQF87p2Dx5V6uSqzT8VPDegX1NSWl4b7QgXczYa9qv7IAABttdWP0K7Q7eQ==}
364 |
365 | '@turf/boolean-concave@7.2.0':
366 | resolution: {integrity: sha512-v3dTN04dfO6VqctQj1a+pjDHb6+/Ev90oAR2QjJuAntY4ubhhr7vKeJdk/w+tWNSMKULnYwfe65Du3EOu3/TeA==}
367 |
368 | '@turf/boolean-contains@7.2.0':
369 | resolution: {integrity: sha512-dgRQm4uVO5XuLee4PLVH7CFQZKdefUBMIXTPITm2oRIDmPLJKHDOFKQTNkGJ73mDKKBR2lmt6eVH3br6OYrEYg==}
370 |
371 | '@turf/boolean-crosses@7.2.0':
372 | resolution: {integrity: sha512-9GyM4UUWFKQOoNhHVSfJBf5XbPy8Fxfz9djjJNAnm/IOl8NmFUSwFPAjKlpiMcr6yuaAoc9R/1KokS9/eLqPvA==}
373 |
374 | '@turf/boolean-disjoint@7.2.0':
375 | resolution: {integrity: sha512-xdz+pYKkLMuqkNeJ6EF/3OdAiJdiHhcHCV0ykX33NIuALKIEpKik0+NdxxNsZsivOW6keKwr61SI+gcVtHYcnQ==}
376 |
377 | '@turf/boolean-equal@7.2.0':
378 | resolution: {integrity: sha512-TmjKYLsxXqEmdDtFq3QgX4aSogiISp3/doeEtDOs3NNSR8susOtBEZkmvwO6DLW+g/rgoQJIBR6iVoWiRqkBxw==}
379 |
380 | '@turf/boolean-intersects@7.2.0':
381 | resolution: {integrity: sha512-GLRyLQgK3F14drkK5Qi9Mv7Z9VT1bgQUd9a3DB3DACTZWDSwfh8YZUFn/HBwRkK8dDdgNEXaavggQHcPi1k9ow==}
382 |
383 | '@turf/boolean-overlap@7.2.0':
384 | resolution: {integrity: sha512-ieM5qIE4anO+gUHIOvEN7CjyowF+kQ6v20/oNYJCp63TVS6eGMkwgd+I4uMzBXfVW66nVHIXjODdUelU+Xyctw==}
385 |
386 | '@turf/boolean-parallel@7.2.0':
387 | resolution: {integrity: sha512-iOtuzzff8nmwv05ROkSvyeGLMrfdGkIi+3hyQ+DH4IVyV37vQbqR5oOJ0Nt3Qq1Tjrq9fvF8G3OMdAv3W2kY9w==}
388 |
389 | '@turf/boolean-point-in-polygon@7.2.0':
390 | resolution: {integrity: sha512-lvEOjxeXIp+wPXgl9kJA97dqzMfNexjqHou+XHVcfxQgolctoJiRYmcVCWGpiZ9CBf/CJha1KmD1qQoRIsjLaA==}
391 |
392 | '@turf/boolean-point-on-line@7.2.0':
393 | resolution: {integrity: sha512-H/bXX8+2VYeSyH8JWrOsu8OGmeA9KVZfM7M6U5/fSqGsRHXo9MyYJ94k39A9kcKSwI0aWiMXVD2UFmiWy8423Q==}
394 |
395 | '@turf/boolean-touches@7.2.0':
396 | resolution: {integrity: sha512-8qb1CO+cwFATGRGFgTRjzL9aibfsbI91pdiRl7KIEkVdeN/H9k8FDrUA1neY7Yq48IaciuwqjbbojQ16FD9b0w==}
397 |
398 | '@turf/boolean-valid@7.2.0':
399 | resolution: {integrity: sha512-xb7gdHN8VV6ivPJh6rPpgxmAEGReiRxqY+QZoEZVGpW2dXcmU1BdY6FA6G/cwvggXAXxJBREoANtEDgp/0ySbA==}
400 |
401 | '@turf/boolean-within@7.2.0':
402 | resolution: {integrity: sha512-zB3AiF59zQZ27Dp1iyhp9mVAKOFHat8RDH45TZhLY8EaqdEPdmLGvwMFCKfLryQcUDQvmzP8xWbtUR82QM5C4g==}
403 |
404 | '@turf/buffer@7.2.0':
405 | resolution: {integrity: sha512-QH1FTr5Mk4z1kpQNztMD8XBOZfpOXPOtlsxaSAj2kDIf5+LquA6HtJjZrjUngnGtzG5+XwcfyRL4ImvLnFjm5Q==}
406 |
407 | '@turf/center-mean@7.2.0':
408 | resolution: {integrity: sha512-NaW6IowAooTJ35O198Jw3U4diZ6UZCCeJY+4E+WMLpks3FCxMDSHEfO2QjyOXQMGWZnVxVelqI5x9DdniDbQ+A==}
409 |
410 | '@turf/center-median@7.2.0':
411 | resolution: {integrity: sha512-/CgVyHNG4zAoZpvkl7qBCe4w7giWNVtLyTU5PoIfg1vWM4VpYw+N7kcBBH46bbzvVBn0vhmZr586r543EwdC/A==}
412 |
413 | '@turf/center-of-mass@7.2.0':
414 | resolution: {integrity: sha512-ij3pmG61WQPHGTQvOziPOdIgwTMegkYTwIc71Gl7xn4C0vWH6KLDSshCphds9xdWSXt2GbHpUs3tr4XGntHkEQ==}
415 |
416 | '@turf/center@7.2.0':
417 | resolution: {integrity: sha512-UTNp9abQ2kuyRg5gCIGDNwwEQeF3NbpYsd1Q0KW9lwWuzbLVNn0sOwbxjpNF4J2HtMOs5YVOcqNvYyuoa2XrXw==}
418 |
419 | '@turf/centroid@7.2.0':
420 | resolution: {integrity: sha512-yJqDSw25T7P48au5KjvYqbDVZ7qVnipziVfZ9aSo7P2/jTE7d4BP21w0/XLi3T/9bry/t9PR1GDDDQljN4KfDw==}
421 |
422 | '@turf/circle@7.2.0':
423 | resolution: {integrity: sha512-1AbqBYtXhstrHmnW6jhLwsv7TtmT0mW58Hvl1uZXEDM1NCVXIR50yDipIeQPjrCuJ/Zdg/91gU8+4GuDCAxBGA==}
424 |
425 | '@turf/clean-coords@7.2.0':
426 | resolution: {integrity: sha512-+5+J1+D7wW7O/RDXn46IfCHuX1gIV1pIAQNSA7lcDbr3HQITZj334C4mOGZLEcGbsiXtlHWZiBtm785Vg8i+QQ==}
427 |
428 | '@turf/clone@7.2.0':
429 | resolution: {integrity: sha512-JlGUT+/5qoU5jqZmf6NMFIoLDY3O7jKd53Up+zbpJ2vzUp6QdwdNzwrsCeONhynWM13F0MVtPXH4AtdkrgFk4g==}
430 |
431 | '@turf/clusters-dbscan@7.2.0':
432 | resolution: {integrity: sha512-VWVUuDreev56g3/BMlnq/81yzczqaz+NVTypN5CigGgP67e+u/CnijphiuhKjtjDd/MzGjXgEWBJc26Y6LYKAw==}
433 |
434 | '@turf/clusters-kmeans@7.2.0':
435 | resolution: {integrity: sha512-BxQdK8jc8Mwm9yoClCYkktm4W004uiQGqb/i/6Y7a8xqgJITWDgTu/cy//wOxAWPk4xfe6MThjnqkszWW8JdyQ==}
436 |
437 | '@turf/clusters@7.2.0':
438 | resolution: {integrity: sha512-sKOrIKHHtXAuTKNm2USnEct+6/MrgyzMW42deZ2YG2RRKWGaaxHMFU2Yw71Yk4DqStOqTIBQpIOdrRuSOwbuQw==}
439 |
440 | '@turf/collect@7.2.0':
441 | resolution: {integrity: sha512-zRVGDlYS8Bx/Zz4vnEUyRg4dmqHhkDbW/nIUIJh657YqaMj1SFi4Iv2i9NbcurlUBDJFkpuOhCvvEvAdskJ8UA==}
442 |
443 | '@turf/combine@7.2.0':
444 | resolution: {integrity: sha512-VEjm3IvnbMt3IgeRIhCDhhQDbLqCU1/5uN1+j1u6fyA095pCizPThGp4f/COSzC3t1s/iiV+fHuDsB6DihHffQ==}
445 |
446 | '@turf/concave@7.2.0':
447 | resolution: {integrity: sha512-cpaDDlumK762kdadexw5ZAB6g/h2pJdihZ+e65lbQVe3WukJHAANnIEeKsdFCuIyNKrwTz2gWu5ws+OpjP48Yw==}
448 |
449 | '@turf/convex@7.2.0':
450 | resolution: {integrity: sha512-HsgHm+zHRE8yPCE/jBUtWFyaaBmpXcSlyHd5/xsMhSZRImFzRzBibaONWQo7xbKZMISC3Nc6BtUjDi/jEVbqyA==}
451 |
452 | '@turf/destination@7.2.0':
453 | resolution: {integrity: sha512-8DUxtOO0Fvrh1xclIUj3d9C5WS20D21F5E+j+X9Q+ju6fcM4huOqTg5ckV1DN2Pg8caABEc5HEZJnGch/5YnYQ==}
454 |
455 | '@turf/difference@7.2.0':
456 | resolution: {integrity: sha512-NHKD1v3s8RX+9lOpvHJg6xRuJOKiY3qxHhz5/FmE0VgGqnCkE7OObqWZ5SsXG+Ckh0aafs5qKhmDdDV/gGi6JA==}
457 |
458 | '@turf/dissolve@7.2.0':
459 | resolution: {integrity: sha512-gPG5TE3mAYuZqBut8tPYCKwi4hhx5Cq0ALoQMB9X0hrVtFIKrihrsj98XQM/5pL/UIpAxQfwisQvy6XaOFaoPA==}
460 |
461 | '@turf/distance-weight@7.2.0':
462 | resolution: {integrity: sha512-NeoyV0fXDH+7nIoNtLjAoH9XL0AS1pmTIyDxEE6LryoDTsqjnuR0YQxIkLCCWDqECoqaOmmBqpeWONjX5BwWCg==}
463 |
464 | '@turf/distance@7.2.0':
465 | resolution: {integrity: sha512-HBjjXIgEcD/wJYjv7/6OZj5yoky2oUvTtVeIAqO3lL80XRvoYmVg6vkOIu6NswkerwLDDNT9kl7+BFLJoHbh6Q==}
466 |
467 | '@turf/ellipse@7.2.0':
468 | resolution: {integrity: sha512-/Y75S5hE2+xjnTw4dXpQ5r/Y2HPM4xrwkPRCCQRpuuboKdEvm42azYmh7isPnMnBTVcmGb9UmGKj0HHAbiwt1g==}
469 |
470 | '@turf/envelope@7.2.0':
471 | resolution: {integrity: sha512-xOMtDeNKHwUuDfzQeoSNmdabsP0/IgVDeyzitDe/8j9wTeW+MrKzVbGz7627PT3h6gsO+2nUv5asfKtUbmTyHA==}
472 |
473 | '@turf/explode@7.2.0':
474 | resolution: {integrity: sha512-jyMXg93J1OI7/65SsLE1k9dfQD3JbcPNMi4/O3QR2Qb3BAs2039oFaSjtW+YqhMqVC4V3ZeKebMcJ8h9sK1n+A==}
475 |
476 | '@turf/flatten@7.2.0':
477 | resolution: {integrity: sha512-q38Qsqr4l7mxp780zSdn0gp/WLBX+sa+gV6qIbDQ1HKCrrPK8QQJmNx7gk1xxEXVot6tq/WyAPysCQdX+kLmMA==}
478 |
479 | '@turf/flip@7.2.0':
480 | resolution: {integrity: sha512-X0TQ0U/UYh4tyXdLO5itP1sO2HOvfrZC0fYSWmTfLDM14jEPkEK8PblofznfBygL+pIFtOS2is8FuVcp5XxYpQ==}
481 |
482 | '@turf/geojson-rbush@7.2.0':
483 | resolution: {integrity: sha512-ST8fLv+EwxVkDgsmhHggM0sPk2SfOHTZJkdgMXVFT7gB9o4lF8qk4y4lwvCCGIfFQAp2yv/PN5EaGMEKutk6xw==}
484 |
485 | '@turf/great-circle@7.2.0':
486 | resolution: {integrity: sha512-n30OiADyOKHhor0aXNgYfXQYXO3UtsOKmhQsY1D89/Oh1nCIXG/1ZPlLL9ZoaRXXBTUBjh99a+K8029NQbGDhw==}
487 |
488 | '@turf/helpers@7.2.0':
489 | resolution: {integrity: sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==}
490 |
491 | '@turf/hex-grid@7.2.0':
492 | resolution: {integrity: sha512-Yo2yUGxrTCQfmcVsSjDt0G3Veg8YD26WRd7etVPD9eirNNgXrIyZkbYA7zVV/qLeRWVmYIKRXg1USWl7ORQOGA==}
493 |
494 | '@turf/interpolate@7.2.0':
495 | resolution: {integrity: sha512-Ifgjm1SEo6XujuSAU6lpRMvoJ1SYTreil1Rf5WsaXj16BQJCedht/4FtWCTNhSWTwEz2motQ1WNrjTCuPG94xA==}
496 |
497 | '@turf/intersect@7.2.0':
498 | resolution: {integrity: sha512-81GMzKS9pKqLPa61qSlFxLFeAC8XbwyCQ9Qv4z6o5skWk1qmMUbEHeMqaGUTEzk+q2XyhZ0sju1FV4iLevQ/aw==}
499 |
500 | '@turf/invariant@7.2.0':
501 | resolution: {integrity: sha512-kV4u8e7Gkpq+kPbAKNC21CmyrXzlbBgFjO1PhrHPgEdNqXqDawoZ3i6ivE3ULJj2rSesCjduUaC/wyvH/sNr2Q==}
502 |
503 | '@turf/isobands@7.2.0':
504 | resolution: {integrity: sha512-lYoHeRieFzpBp29Jh19QcDIb0E+dzo/K5uwZuNga4wxr6heNU0AfkD4ByAHYIXHtvmp4m/JpSKq/2N6h/zvBkg==}
505 |
506 | '@turf/isolines@7.2.0':
507 | resolution: {integrity: sha512-4ZXKxvA/JKkxAXixXhN3UVza5FABsdYgOWXyYm3L5ryTPJVOYTVSSd9A+CAVlv9dZc3YdlsqMqLTXNOOre/kwg==}
508 |
509 | '@turf/jsts@2.7.2':
510 | resolution: {integrity: sha512-zAezGlwWHPyU0zxwcX2wQY3RkRpwuoBmhhNE9HY9kWhFDkCxZ3aWK5URKwa/SWKJbj9aztO+8vtdiBA28KVJFg==}
511 |
512 | '@turf/kinks@7.2.0':
513 | resolution: {integrity: sha512-BtxDxGewJR0Q5WR9HKBSxZhirFX+GEH1rD7/EvgDsHS8e1Y5/vNQQUmXdURjdPa4StzaUBsWRU5T3A356gLbPA==}
514 |
515 | '@turf/length@7.2.0':
516 | resolution: {integrity: sha512-LBmYN+iCgVtWNLsckVnpQIJENqIIPO63mogazMp23lrDGfWXu07zZQ9ZinJVO5xYurXNhc/QI2xxoqt2Xw90Ig==}
517 |
518 | '@turf/line-arc@7.2.0':
519 | resolution: {integrity: sha512-kfWzA5oYrTpslTg5fN50G04zSypiYQzjZv3FLjbZkk6kta5fo4JkERKjTeA8x4XNojb+pfmjMBB0yIh2w2dDRw==}
520 |
521 | '@turf/line-chunk@7.2.0':
522 | resolution: {integrity: sha512-1ODyL5gETtWSL85MPI0lgp/78vl95M39gpeBxePXyDIqx8geDP9kXfAzctuKdxBoR4JmOVM3NT7Fz7h+IEkC+g==}
523 |
524 | '@turf/line-intersect@7.2.0':
525 | resolution: {integrity: sha512-GhCJVEkc8EmggNi85EuVLoXF5T5jNVxmhIetwppiVyJzMrwkYAkZSYB3IBFYGUUB9qiNFnTwungVSsBV/S8ZiA==}
526 |
527 | '@turf/line-offset@7.2.0':
528 | resolution: {integrity: sha512-1+OkYueDCbnEWzbfBh3taVr+3SyM2bal5jfnSEuDiLA6jnlScgr8tn3INo+zwrUkPFZPPAejL1swVyO5TjUahw==}
529 |
530 | '@turf/line-overlap@7.2.0':
531 | resolution: {integrity: sha512-NNn7/jg53+N10q2Kyt66bEDqN3101iW/1zA5FW7J6UbKApDFkByh+18YZq1of71kS6oUYplP86WkDp16LFpqqw==}
532 |
533 | '@turf/line-segment@7.2.0':
534 | resolution: {integrity: sha512-E162rmTF9XjVN4rINJCd15AdQGCBlNqeWN3V0YI1vOUpZFNT2ii4SqEMCcH2d+5EheHLL8BWVwZoOsvHZbvaWA==}
535 |
536 | '@turf/line-slice-along@7.2.0':
537 | resolution: {integrity: sha512-4/gPgP0j5Rp+1prbhXqn7kIH/uZTmSgiubUnn67F8nb9zE+MhbRglhSlRYEZxAVkB7VrGwjyolCwvrROhjHp2A==}
538 |
539 | '@turf/line-slice@7.2.0':
540 | resolution: {integrity: sha512-bHotzZIaU1GPV3RMwttYpDrmcvb3X2i1g/WUttPZWtKrEo2VVAkoYdeZ2aFwtogERYS4quFdJ/TDzAtquBC8WQ==}
541 |
542 | '@turf/line-split@7.2.0':
543 | resolution: {integrity: sha512-yJTZR+c8CwoKqdW/aIs+iLbuFwAa3Yan+EOADFQuXXIUGps3bJUXx/38rmowNoZbHyP1np1+OtrotyHu5uBsfQ==}
544 |
545 | '@turf/line-to-polygon@7.2.0':
546 | resolution: {integrity: sha512-iKpJqc7EYc5NvlD4KaqrKKO6mXR7YWO/YwtW60E2FnsF/blnsy9OfAOcilYHgH3S/V/TT0VedC7DW7Kgjy2EIA==}
547 |
548 | '@turf/mask@7.2.0':
549 | resolution: {integrity: sha512-ulJ6dQqXC0wrjIoqFViXuMUdIPX5Q6GPViZ3kGfeVijvlLM7kTFBsZiPQwALSr5nTQg4Ppf3FD0Jmg8IErPrgA==}
550 |
551 | '@turf/meta@7.2.0':
552 | resolution: {integrity: sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw==}
553 |
554 | '@turf/midpoint@7.2.0':
555 | resolution: {integrity: sha512-AMn5S9aSrbXdE+Q4Rj+T5nLdpfpn+mfzqIaEKkYI021HC0vb22HyhQHsQbSeX+AWcS4CjD1hFsYVcgKI+5qCfw==}
556 |
557 | '@turf/moran-index@7.2.0':
558 | resolution: {integrity: sha512-Aexh1EmXVPJhApr9grrd120vbalIthcIsQ3OAN2Tqwf+eExHXArJEJqGBo9IZiQbIpFJeftt/OvUvlI8BeO1bA==}
559 |
560 | '@turf/nearest-neighbor-analysis@7.2.0':
561 | resolution: {integrity: sha512-LmP/crXb7gilgsL0wL9hsygqc537W/a1W5r9XBKJT4SKdqjoXX5APJatJfd3nwXbRIqwDH0cDA9/YyFjBPlKnA==}
562 |
563 | '@turf/nearest-point-on-line@7.2.0':
564 | resolution: {integrity: sha512-UOhAeoDPVewBQV+PWg1YTMQcYpJsIqfW5+EuZ5vJl60XwUa0+kqB/eVfSLNXmHENjKKIlEt9Oy9HIDF4VeWmXA==}
565 |
566 | '@turf/nearest-point-to-line@7.2.0':
567 | resolution: {integrity: sha512-EorU7Qj30A7nAjh++KF/eTPDlzwuuV4neBz7tmSTB21HKuXZAR0upJsx6M2X1CSyGEgNsbFB0ivNKIvymRTKBw==}
568 |
569 | '@turf/nearest-point@7.2.0':
570 | resolution: {integrity: sha512-0wmsqXZ8CGw4QKeZmS+NdjYTqCMC+HXZvM3XAQIU6k6laNLqjad2oS4nDrtcRs/nWDvcj1CR+Io7OiQ6sbpn5Q==}
571 |
572 | '@turf/planepoint@7.2.0':
573 | resolution: {integrity: sha512-8Vno01tvi5gThUEKBQ46CmlEKDAwVpkl7stOPFvJYlA1oywjAL4PsmgwjXgleZuFtXQUPBNgv5a42Pf438XP4g==}
574 |
575 | '@turf/point-grid@7.2.0':
576 | resolution: {integrity: sha512-ai7lwBV2FREPW3XiUNohT4opC1hd6+F56qZe20xYhCTkTD9diWjXHiNudQPSmVAUjgMzQGasblQQqvOdL+bJ3Q==}
577 |
578 | '@turf/point-on-feature@7.2.0':
579 | resolution: {integrity: sha512-ksoYoLO9WtJ/qI8VI9ltF+2ZjLWrAjZNsCsu8F7nyGeCh4I8opjf4qVLytFG44XA2qI5yc6iXDpyv0sshvP82Q==}
580 |
581 | '@turf/point-to-line-distance@7.2.0':
582 | resolution: {integrity: sha512-fB9Rdnb5w5+t76Gho2dYDkGe20eRrFk8CXi4v1+l1PC8YyLXO+x+l3TrtT8HzL/dVaZeepO6WUIsIw3ditTOPg==}
583 |
584 | '@turf/point-to-polygon-distance@7.2.0':
585 | resolution: {integrity: sha512-w+WYuINgTiFjoZemQwOaQSje/8Kq+uqJOynvx7+gleQPHyWQ3VtTodtV4LwzVzXz8Sf7Mngx1Jcp2SNai5CJYA==}
586 |
587 | '@turf/points-within-polygon@7.2.0':
588 | resolution: {integrity: sha512-jRKp8/mWNMzA+hKlQhxci97H5nOio9tp14R2SzpvkOt+cswxl+NqTEi1hDd2XetA7tjU0TSoNjEgVY8FfA0S6w==}
589 |
590 | '@turf/polygon-smooth@7.2.0':
591 | resolution: {integrity: sha512-KCp9wF2IEynvGXVhySR8oQ2razKP0zwg99K+fuClP21pSKCFjAPaihPEYq6e8uI/1J7ibjL5++6EMl+LrUTrLg==}
592 |
593 | '@turf/polygon-tangents@7.2.0':
594 | resolution: {integrity: sha512-AHUUPmOjiQDrtP/ODXukHBlUG0C/9I1je7zz50OTfl2ZDOdEqFJQC3RyNELwq07grTXZvg5TS5wYx/Y7nsm47g==}
595 |
596 | '@turf/polygon-to-line@7.2.0':
597 | resolution: {integrity: sha512-9jeTN3LiJ933I5sd4K0kwkcivOYXXm1emk0dHorwXeSFSHF+nlYesEW3Hd889wb9lZd7/SVLMUeX/h39mX+vCA==}
598 |
599 | '@turf/polygonize@7.2.0':
600 | resolution: {integrity: sha512-U9v+lBhUPDv+nsg/VcScdiqCB59afO6CHDGrwIl2+5i6Ve+/KQKjpTV/R+NqoC1iMXAEq3brY6HY8Ukp/pUWng==}
601 |
602 | '@turf/projection@7.2.0':
603 | resolution: {integrity: sha512-/qke5vJScv8Mu7a+fU3RSChBRijE6EVuFHU3RYihMuYm04Vw8dBMIs0enEpoq0ke/IjSbleIrGQNZIMRX9EwZQ==}
604 |
605 | '@turf/quadrat-analysis@7.2.0':
606 | resolution: {integrity: sha512-fDQh3+ldYNxUqS6QYlvJ7GZLlCeDZR6tD3ikdYtOsSemwW1n/4gm2xcgWJqy3Y0uszBwxc13IGGY7NGEjHA+0w==}
607 |
608 | '@turf/random@7.2.0':
609 | resolution: {integrity: sha512-fNXs5mOeXsrirliw84S8UCNkpm4RMNbefPNsuCTfZEXhcr1MuHMzq4JWKb4FweMdN1Yx2l/xcytkO0s71cJ50w==}
610 |
611 | '@turf/rectangle-grid@7.2.0':
612 | resolution: {integrity: sha512-f0o5ifvy0Ml/nHDJzMNcuSk4h11aa3BfvQNnYQhLpuTQu03j/ICZNlzKTLxwjcUqvxADUifty7Z9CX5W6zky4A==}
613 |
614 | '@turf/rewind@7.2.0':
615 | resolution: {integrity: sha512-SZpRAZiZsE22+HVz6pEID+ST25vOdpAMGk5NO1JeqzhpMALIkIGnkG+xnun2CfYHz7wv8/Z0ADiAvei9rkcQYA==}
616 |
617 | '@turf/rhumb-bearing@7.2.0':
618 | resolution: {integrity: sha512-jbdexlrR8X2ZauUciHx3tRwG+BXoMXke4B8p8/IgDlAfIrVdzAxSQN89FMzIKnjJ/kdLjo9bFGvb92bu31Etug==}
619 |
620 | '@turf/rhumb-destination@7.2.0':
621 | resolution: {integrity: sha512-U9OLgLAHlH4Wfx3fBZf3jvnkDjdTcfRan5eI7VPV1+fQWkOteATpzkiRjCvSYK575GljVwWBjkKca8LziGWitQ==}
622 |
623 | '@turf/rhumb-distance@7.2.0':
624 | resolution: {integrity: sha512-NsijTPON1yOc9tirRPEQQuJ5aQi7pREsqchQquaYKbHNWsexZjcDi4wnw2kM3Si4XjmgynT+2f7aXH7FHarHzw==}
625 |
626 | '@turf/sample@7.2.0':
627 | resolution: {integrity: sha512-f+ZbcbQJ9glQ/F26re8LadxO0ORafy298EJZe6XtbctRTJrNus6UNAsl8+GYXFqMnXM22tbTAznnJX3ZiWNorA==}
628 |
629 | '@turf/sector@7.2.0':
630 | resolution: {integrity: sha512-zL06MjbbMG4DdpiNz+Q9Ax8jsCekt3R76uxeWShulAGkyDB5smdBOUDoRwxn05UX7l4kKv4Ucq2imQXhxKFd1w==}
631 |
632 | '@turf/shortest-path@7.2.0':
633 | resolution: {integrity: sha512-6fpx8feZ2jMSaeRaFdqFShGWkNb+veUOeyLFSHA/aRD9n/e9F2pWZoRbQWKbKTpcKFJ2FnDEqCZnh/GrcAsqWA==}
634 |
635 | '@turf/simplify@7.2.0':
636 | resolution: {integrity: sha512-9YHIfSc8BXQfi5IvEMbCeQYqNch0UawIGwbboJaoV8rodhtk6kKV2wrpXdGqk/6Thg6/RWvChJFKVVTjVrULyQ==}
637 |
638 | '@turf/square-grid@7.2.0':
639 | resolution: {integrity: sha512-EmzGXa90hz+tiCOs9wX+Lak6pH0Vghb7QuX6KZej+pmWi3Yz7vdvQLmy/wuN048+wSkD5c8WUo/kTeNDe7GnmA==}
640 |
641 | '@turf/square@7.2.0':
642 | resolution: {integrity: sha512-9pMoAGFvqzCDOlO9IRSSBCGXKbl8EwMx6xRRBMKdZgpS0mZgfm9xiptMmx/t1m4qqHIlb/N+3MUF7iMBx6upcA==}
643 |
644 | '@turf/standard-deviational-ellipse@7.2.0':
645 | resolution: {integrity: sha512-+uC0pR2nRjm90JvMXe/2xOCZsYV2II1ZZ2zmWcBWv6bcFXBspcxk2QfCC3k0bj6jDapELzoQgnn3cG5lbdQV2w==}
646 |
647 | '@turf/tag@7.2.0':
648 | resolution: {integrity: sha512-TAFvsbp5TCBqXue8ui+CtcLsPZ6NPC88L8Ad6Hb/R6VAi21qe0U42WJHQYXzWmtThoTNwxi+oKSeFbRDsr0FIA==}
649 |
650 | '@turf/tesselate@7.2.0':
651 | resolution: {integrity: sha512-zHGcG85aOJJu1seCm+CYTJ3UempX4Xtyt669vFG6Hbr/Hc7ii6STQ2ysFr7lJwFtU9uyYhphVrrgwIqwglvI/Q==}
652 |
653 | '@turf/tin@7.2.0':
654 | resolution: {integrity: sha512-y24Vt3oeE6ZXvyLJamP0Ke02rPlDGE9gF7OFADnR0mT+2uectb0UTIBC3kKzON80TEAlA3GXpKFkCW5Fo/O/Kg==}
655 |
656 | '@turf/transform-rotate@7.2.0':
657 | resolution: {integrity: sha512-EMCj0Zqy3cF9d3mGRqDlYnX2ZBXe3LgT+piDR0EuF5c5sjuKErcFcaBIsn/lg1gp4xCNZFinkZ3dsFfgGHf6fw==}
658 |
659 | '@turf/transform-scale@7.2.0':
660 | resolution: {integrity: sha512-HYB+pw938eeI8s1/zSWFy6hq+t38fuUaBb0jJsZB1K9zQ1WjEYpPvKF/0//80zNPlyxLv3cOkeBucso3hzI07A==}
661 |
662 | '@turf/transform-translate@7.2.0':
663 | resolution: {integrity: sha512-zAglR8MKCqkzDTjGMIQgbg/f+Q3XcKVzr9cELw5l9CrS1a0VTSDtBZLDm0kWx0ankwtam7ZmI2jXyuQWT8Gbug==}
664 |
665 | '@turf/triangle-grid@7.2.0':
666 | resolution: {integrity: sha512-4gcAqWKh9hg6PC5nNSb9VWyLgl821cwf9yR9yEzQhEFfwYL/pZONBWCO1cwVF23vSYMSMm+/TwqxH4emxaArfw==}
667 |
668 | '@turf/truncate@7.2.0':
669 | resolution: {integrity: sha512-jyFzxYbPugK4XjV5V/k6Xr3taBjjvo210IbPHJXw0Zh7Y6sF+hGxeRVtSuZ9VP/6oRyqAOHKUrze+OOkPqBgUg==}
670 |
671 | '@turf/turf@7.2.0':
672 | resolution: {integrity: sha512-G1kKBu4hYgoNoRJgnpJohNuS7bLnoWHZ2G/4wUMym5xOSiYah6carzdTEsMoTsauyi7ilByWHx5UHwbjjCVcBw==}
673 |
674 | '@turf/union@7.2.0':
675 | resolution: {integrity: sha512-Xex/cfKSmH0RZRWSJl4RLlhSmEALVewywiEXcu0aIxNbuZGTcpNoI0h4oLFrE/fUd0iBGFg/EGLXRL3zTfpg6g==}
676 |
677 | '@turf/unkink-polygon@7.2.0':
678 | resolution: {integrity: sha512-dFPfzlIgkEr15z6oXVxTSWshWi51HeITGVFtl1GAKGMtiXJx1uMqnfRsvljqEjaQu/4AzG1QAp3b+EkSklQSiQ==}
679 |
680 | '@turf/voronoi@7.2.0':
681 | resolution: {integrity: sha512-3K6N0LtJsWTXxPb/5N2qD9e8f4q8+tjTbGV3lE3v8x06iCnNlnuJnqM5NZNPpvgvCatecBkhClO3/3RndE61Fw==}
682 |
683 | '@tweenjs/tween.js@23.1.3':
684 | resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==}
685 |
686 | '@types/d3-voronoi@1.1.12':
687 | resolution: {integrity: sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==}
688 |
689 | '@types/estree@1.0.6':
690 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
691 |
692 | '@types/geojson@7946.0.16':
693 | resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
694 |
695 | '@types/linkify-it@5.0.0':
696 | resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==}
697 |
698 | '@types/markdown-it@14.1.2':
699 | resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==}
700 |
701 | '@types/mdurl@2.0.0':
702 | resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==}
703 |
704 | '@types/node@22.13.0':
705 | resolution: {integrity: sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==}
706 |
707 | '@types/stats.js@0.17.3':
708 | resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==}
709 |
710 | '@types/three@0.173.0':
711 | resolution: {integrity: sha512-KtNjfI/CRB6JVKIVeZM1R3GYDX2wkoV2itNcQu2j4d7qkhjGOuB+s2oF6jl9mztycDLGMtrAnJQYxInC8Bb20A==}
712 |
713 | '@types/webxr@0.5.21':
714 | resolution: {integrity: sha512-geZIAtLzjGmgY2JUi6VxXdCrTb99A7yP49lxLr2Nm/uIK0PkkxcEi4OGhoGDO4pxCf3JwGz2GiJL2Ej4K2bKaA==}
715 |
716 | '@webgpu/types@0.1.54':
717 | resolution: {integrity: sha512-81oaalC8LFrXjhsczomEQ0u3jG+TqE6V9QHLA8GNZq/Rnot0KDugu3LhSYSlie8tSdooAN1Hov05asrUUp9qgg==}
718 |
719 | JSONStream@1.3.5:
720 | resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
721 | hasBin: true
722 |
723 | acorn-jsx@5.3.2:
724 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
725 | peerDependencies:
726 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
727 |
728 | acorn@8.14.0:
729 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
730 | engines: {node: '>=0.4.0'}
731 | hasBin: true
732 |
733 | ansi-styles@4.3.0:
734 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
735 | engines: {node: '>=8'}
736 |
737 | argparse@2.0.1:
738 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
739 |
740 | balanced-match@1.0.2:
741 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
742 |
743 | bignumber.js@9.1.2:
744 | resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==}
745 |
746 | bluebird@3.7.2:
747 | resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
748 |
749 | brace-expansion@2.0.1:
750 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
751 |
752 | catharsis@0.9.0:
753 | resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==}
754 | engines: {node: '>= 10'}
755 |
756 | chalk@4.1.2:
757 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
758 | engines: {node: '>=10'}
759 |
760 | color-convert@2.0.1:
761 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
762 | engines: {node: '>=7.0.0'}
763 |
764 | color-name@1.1.4:
765 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
766 |
767 | commander@2.20.3:
768 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
769 |
770 | concaveman@1.2.1:
771 | resolution: {integrity: sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==}
772 |
773 | d3-array@1.2.4:
774 | resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==}
775 |
776 | d3-geo@1.7.1:
777 | resolution: {integrity: sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==}
778 |
779 | d3-voronoi@1.1.2:
780 | resolution: {integrity: sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==}
781 |
782 | deep-is@0.1.4:
783 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
784 |
785 | earcut@2.2.4:
786 | resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==}
787 |
788 | entities@4.5.0:
789 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
790 | engines: {node: '>=0.12'}
791 |
792 | esbuild@0.24.2:
793 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==}
794 | engines: {node: '>=18'}
795 | hasBin: true
796 |
797 | escape-string-regexp@2.0.0:
798 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
799 | engines: {node: '>=8'}
800 |
801 | escodegen@1.14.3:
802 | resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==}
803 | engines: {node: '>=4.0'}
804 | hasBin: true
805 |
806 | eslint-visitor-keys@3.4.3:
807 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
808 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
809 |
810 | espree@9.6.1:
811 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
812 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
813 |
814 | esprima@4.0.1:
815 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
816 | engines: {node: '>=4'}
817 | hasBin: true
818 |
819 | estraverse@4.3.0:
820 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
821 | engines: {node: '>=4.0'}
822 |
823 | estraverse@5.3.0:
824 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
825 | engines: {node: '>=4.0'}
826 |
827 | esutils@2.0.3:
828 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
829 | engines: {node: '>=0.10.0'}
830 |
831 | fast-deep-equal@3.1.3:
832 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
833 |
834 | fast-levenshtein@2.0.6:
835 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
836 |
837 | fflate@0.8.2:
838 | resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
839 |
840 | fs.realpath@1.0.0:
841 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
842 |
843 | fsevents@2.3.3:
844 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
845 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
846 | os: [darwin]
847 |
848 | geojson-equality-ts@1.0.2:
849 | resolution: {integrity: sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ==}
850 |
851 | geojson-polygon-self-intersections@1.2.1:
852 | resolution: {integrity: sha512-/QM1b5u2d172qQVO//9CGRa49jEmclKEsYOQmWP9ooEjj63tBM51m2805xsbxkzlEELQ2REgTf700gUhhlegxA==}
853 |
854 | geojson-stream@0.1.0:
855 | resolution: {integrity: sha512-svSg5fFXPaTiqzEBGXScA+nISaeC9rLvku2PH+wM5LToATUw2bLIrvls43ymnT9Xnp51nBPVyK9m4Af40KpJ7w==}
856 |
857 | glob@8.1.0:
858 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
859 | engines: {node: '>=12'}
860 | deprecated: Glob versions prior to v9 are no longer supported
861 |
862 | graceful-fs@4.2.11:
863 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
864 |
865 | has-flag@4.0.0:
866 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
867 | engines: {node: '>=8'}
868 |
869 | inflight@1.0.6:
870 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
871 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
872 |
873 | inherits@2.0.4:
874 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
875 |
876 | js2xmlparser@4.0.2:
877 | resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==}
878 |
879 | jsdoc@4.0.4:
880 | resolution: {integrity: sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==}
881 | engines: {node: '>=12.0.0'}
882 | hasBin: true
883 |
884 | jsonparse@1.3.1:
885 | resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
886 | engines: {'0': node >= 0.2.0}
887 |
888 | jsts@2.7.1:
889 | resolution: {integrity: sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==}
890 | engines: {node: '>= 12'}
891 |
892 | klaw@3.0.0:
893 | resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==}
894 |
895 | levn@0.3.0:
896 | resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==}
897 | engines: {node: '>= 0.8.0'}
898 |
899 | linkify-it@5.0.0:
900 | resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
901 |
902 | lodash@4.17.21:
903 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
904 |
905 | long@5.2.4:
906 | resolution: {integrity: sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==}
907 |
908 | marchingsquares@1.3.3:
909 | resolution: {integrity: sha512-gz6nNQoVK7Lkh2pZulrT4qd4347S/toG9RXH2pyzhLgkL5mLkBoqgv4EvAGXcV0ikDW72n/OQb3Xe8bGagQZCg==}
910 |
911 | markdown-it-anchor@8.6.7:
912 | resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==}
913 | peerDependencies:
914 | '@types/markdown-it': '*'
915 | markdown-it: '*'
916 |
917 | markdown-it@14.1.0:
918 | resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
919 | hasBin: true
920 |
921 | marked@4.3.0:
922 | resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
923 | engines: {node: '>= 12'}
924 | hasBin: true
925 |
926 | mdurl@2.0.0:
927 | resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
928 |
929 | meshoptimizer@0.18.1:
930 | resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==}
931 |
932 | minimatch@5.1.6:
933 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
934 | engines: {node: '>=10'}
935 |
936 | minimist@1.2.8:
937 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
938 |
939 | mkdirp@1.0.4:
940 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
941 | engines: {node: '>=10'}
942 | hasBin: true
943 |
944 | nanoid@3.3.8:
945 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
946 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
947 | hasBin: true
948 |
949 | once@1.4.0:
950 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
951 |
952 | optionator@0.8.3:
953 | resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
954 | engines: {node: '>= 0.8.0'}
955 |
956 | picocolors@1.1.1:
957 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
958 |
959 | point-in-polygon-hao@1.2.4:
960 | resolution: {integrity: sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==}
961 |
962 | point-in-polygon@1.1.0:
963 | resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==}
964 |
965 | polyclip-ts@0.16.8:
966 | resolution: {integrity: sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ==}
967 |
968 | postcss@8.5.1:
969 | resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
970 | engines: {node: ^10 || ^12 || >=14}
971 |
972 | prelude-ls@1.1.2:
973 | resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
974 | engines: {node: '>= 0.8.0'}
975 |
976 | protobufjs-cli@1.1.3:
977 | resolution: {integrity: sha512-MqD10lqF+FMsOayFiNOdOGNlXc4iKDCf0ZQPkPR+gizYh9gqUeGTWulABUCdI+N67w5RfJ6xhgX4J8pa8qmMXQ==}
978 | engines: {node: '>=12.0.0'}
979 | hasBin: true
980 | peerDependencies:
981 | protobufjs: ^7.0.0
982 |
983 | protobufjs@7.4.0:
984 | resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==}
985 | engines: {node: '>=12.0.0'}
986 |
987 | punycode.js@2.3.1:
988 | resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
989 | engines: {node: '>=6'}
990 |
991 | quickselect@1.1.1:
992 | resolution: {integrity: sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==}
993 |
994 | quickselect@2.0.0:
995 | resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==}
996 |
997 | rbush@2.0.2:
998 | resolution: {integrity: sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==}
999 |
1000 | rbush@3.0.1:
1001 | resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==}
1002 |
1003 | requizzle@0.2.4:
1004 | resolution: {integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==}
1005 |
1006 | robust-predicates@2.0.4:
1007 | resolution: {integrity: sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==}
1008 |
1009 | robust-predicates@3.0.2:
1010 | resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
1011 |
1012 | rollup@4.34.0:
1013 | resolution: {integrity: sha512-+4C/cgJ9w6sudisA0nZz0+O7lTP9a3CzNLsoDwaRumM8QHwghUsu6tqHXiTmNUp/rqNiM14++7dkzHDyCRs0Jg==}
1014 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
1015 | hasBin: true
1016 |
1017 | semver@7.7.0:
1018 | resolution: {integrity: sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==}
1019 | engines: {node: '>=10'}
1020 | hasBin: true
1021 |
1022 | skmeans@0.9.7:
1023 | resolution: {integrity: sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==}
1024 |
1025 | source-map-js@1.2.1:
1026 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
1027 | engines: {node: '>=0.10.0'}
1028 |
1029 | source-map@0.6.1:
1030 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
1031 | engines: {node: '>=0.10.0'}
1032 |
1033 | splaytree-ts@1.0.2:
1034 | resolution: {integrity: sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA==}
1035 |
1036 | strip-json-comments@3.1.1:
1037 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1038 | engines: {node: '>=8'}
1039 |
1040 | supports-color@7.2.0:
1041 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1042 | engines: {node: '>=8'}
1043 |
1044 | sweepline-intersections@1.5.0:
1045 | resolution: {integrity: sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==}
1046 |
1047 | three@0.173.0:
1048 | resolution: {integrity: sha512-AUwVmViIEUgBwxJJ7stnF0NkPpZxx1aZ6WiAbQ/Qq61h6I9UR4grXtZDmO8mnlaNORhHnIBlXJ1uBxILEKuVyw==}
1049 |
1050 | through@2.3.8:
1051 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
1052 |
1053 | tinyqueue@2.0.3:
1054 | resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==}
1055 |
1056 | tmp@0.2.3:
1057 | resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
1058 | engines: {node: '>=14.14'}
1059 |
1060 | topojson-client@3.1.0:
1061 | resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==}
1062 | hasBin: true
1063 |
1064 | topojson-server@3.0.1:
1065 | resolution: {integrity: sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==}
1066 | hasBin: true
1067 |
1068 | tslib@2.8.1:
1069 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
1070 |
1071 | type-check@0.3.2:
1072 | resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==}
1073 | engines: {node: '>= 0.8.0'}
1074 |
1075 | typescript@5.7.3:
1076 | resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
1077 | engines: {node: '>=14.17'}
1078 | hasBin: true
1079 |
1080 | uc.micro@2.1.0:
1081 | resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
1082 |
1083 | uglify-js@3.19.3:
1084 | resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
1085 | engines: {node: '>=0.8.0'}
1086 | hasBin: true
1087 |
1088 | underscore@1.13.7:
1089 | resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==}
1090 |
1091 | undici-types@6.20.0:
1092 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
1093 |
1094 | vite@6.0.11:
1095 | resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==}
1096 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
1097 | hasBin: true
1098 | peerDependencies:
1099 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
1100 | jiti: '>=1.21.0'
1101 | less: '*'
1102 | lightningcss: ^1.21.0
1103 | sass: '*'
1104 | sass-embedded: '*'
1105 | stylus: '*'
1106 | sugarss: '*'
1107 | terser: ^5.16.0
1108 | tsx: ^4.8.1
1109 | yaml: ^2.4.2
1110 | peerDependenciesMeta:
1111 | '@types/node':
1112 | optional: true
1113 | jiti:
1114 | optional: true
1115 | less:
1116 | optional: true
1117 | lightningcss:
1118 | optional: true
1119 | sass:
1120 | optional: true
1121 | sass-embedded:
1122 | optional: true
1123 | stylus:
1124 | optional: true
1125 | sugarss:
1126 | optional: true
1127 | terser:
1128 | optional: true
1129 | tsx:
1130 | optional: true
1131 | yaml:
1132 | optional: true
1133 |
1134 | word-wrap@1.2.5:
1135 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
1136 | engines: {node: '>=0.10.0'}
1137 |
1138 | wrappy@1.0.2:
1139 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
1140 |
1141 | xmlcreate@2.0.4:
1142 | resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==}
1143 |
1144 | snapshots:
1145 |
1146 | '@babel/helper-string-parser@7.25.9': {}
1147 |
1148 | '@babel/helper-validator-identifier@7.25.9': {}
1149 |
1150 | '@babel/parser@7.26.7':
1151 | dependencies:
1152 | '@babel/types': 7.26.7
1153 |
1154 | '@babel/types@7.26.7':
1155 | dependencies:
1156 | '@babel/helper-string-parser': 7.25.9
1157 | '@babel/helper-validator-identifier': 7.25.9
1158 |
1159 | '@esbuild/aix-ppc64@0.24.2':
1160 | optional: true
1161 |
1162 | '@esbuild/android-arm64@0.24.2':
1163 | optional: true
1164 |
1165 | '@esbuild/android-arm@0.24.2':
1166 | optional: true
1167 |
1168 | '@esbuild/android-x64@0.24.2':
1169 | optional: true
1170 |
1171 | '@esbuild/darwin-arm64@0.24.2':
1172 | optional: true
1173 |
1174 | '@esbuild/darwin-x64@0.24.2':
1175 | optional: true
1176 |
1177 | '@esbuild/freebsd-arm64@0.24.2':
1178 | optional: true
1179 |
1180 | '@esbuild/freebsd-x64@0.24.2':
1181 | optional: true
1182 |
1183 | '@esbuild/linux-arm64@0.24.2':
1184 | optional: true
1185 |
1186 | '@esbuild/linux-arm@0.24.2':
1187 | optional: true
1188 |
1189 | '@esbuild/linux-ia32@0.24.2':
1190 | optional: true
1191 |
1192 | '@esbuild/linux-loong64@0.24.2':
1193 | optional: true
1194 |
1195 | '@esbuild/linux-mips64el@0.24.2':
1196 | optional: true
1197 |
1198 | '@esbuild/linux-ppc64@0.24.2':
1199 | optional: true
1200 |
1201 | '@esbuild/linux-riscv64@0.24.2':
1202 | optional: true
1203 |
1204 | '@esbuild/linux-s390x@0.24.2':
1205 | optional: true
1206 |
1207 | '@esbuild/linux-x64@0.24.2':
1208 | optional: true
1209 |
1210 | '@esbuild/netbsd-arm64@0.24.2':
1211 | optional: true
1212 |
1213 | '@esbuild/netbsd-x64@0.24.2':
1214 | optional: true
1215 |
1216 | '@esbuild/openbsd-arm64@0.24.2':
1217 | optional: true
1218 |
1219 | '@esbuild/openbsd-x64@0.24.2':
1220 | optional: true
1221 |
1222 | '@esbuild/sunos-x64@0.24.2':
1223 | optional: true
1224 |
1225 | '@esbuild/win32-arm64@0.24.2':
1226 | optional: true
1227 |
1228 | '@esbuild/win32-ia32@0.24.2':
1229 | optional: true
1230 |
1231 | '@esbuild/win32-x64@0.24.2':
1232 | optional: true
1233 |
1234 | '@jsdoc/salty@0.2.9':
1235 | dependencies:
1236 | lodash: 4.17.21
1237 |
1238 | '@protobufjs/aspromise@1.1.2': {}
1239 |
1240 | '@protobufjs/base64@1.1.2': {}
1241 |
1242 | '@protobufjs/codegen@2.0.4': {}
1243 |
1244 | '@protobufjs/eventemitter@1.1.0': {}
1245 |
1246 | '@protobufjs/fetch@1.1.0':
1247 | dependencies:
1248 | '@protobufjs/aspromise': 1.1.2
1249 | '@protobufjs/inquire': 1.1.0
1250 |
1251 | '@protobufjs/float@1.0.2': {}
1252 |
1253 | '@protobufjs/inquire@1.1.0': {}
1254 |
1255 | '@protobufjs/path@1.1.2': {}
1256 |
1257 | '@protobufjs/pool@1.1.0': {}
1258 |
1259 | '@protobufjs/utf8@1.1.0': {}
1260 |
1261 | '@rollup/rollup-android-arm-eabi@4.34.0':
1262 | optional: true
1263 |
1264 | '@rollup/rollup-android-arm64@4.34.0':
1265 | optional: true
1266 |
1267 | '@rollup/rollup-darwin-arm64@4.34.0':
1268 | optional: true
1269 |
1270 | '@rollup/rollup-darwin-x64@4.34.0':
1271 | optional: true
1272 |
1273 | '@rollup/rollup-freebsd-arm64@4.34.0':
1274 | optional: true
1275 |
1276 | '@rollup/rollup-freebsd-x64@4.34.0':
1277 | optional: true
1278 |
1279 | '@rollup/rollup-linux-arm-gnueabihf@4.34.0':
1280 | optional: true
1281 |
1282 | '@rollup/rollup-linux-arm-musleabihf@4.34.0':
1283 | optional: true
1284 |
1285 | '@rollup/rollup-linux-arm64-gnu@4.34.0':
1286 | optional: true
1287 |
1288 | '@rollup/rollup-linux-arm64-musl@4.34.0':
1289 | optional: true
1290 |
1291 | '@rollup/rollup-linux-loongarch64-gnu@4.34.0':
1292 | optional: true
1293 |
1294 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.0':
1295 | optional: true
1296 |
1297 | '@rollup/rollup-linux-riscv64-gnu@4.34.0':
1298 | optional: true
1299 |
1300 | '@rollup/rollup-linux-s390x-gnu@4.34.0':
1301 | optional: true
1302 |
1303 | '@rollup/rollup-linux-x64-gnu@4.34.0':
1304 | optional: true
1305 |
1306 | '@rollup/rollup-linux-x64-musl@4.34.0':
1307 | optional: true
1308 |
1309 | '@rollup/rollup-win32-arm64-msvc@4.34.0':
1310 | optional: true
1311 |
1312 | '@rollup/rollup-win32-ia32-msvc@4.34.0':
1313 | optional: true
1314 |
1315 | '@rollup/rollup-win32-x64-msvc@4.34.0':
1316 | optional: true
1317 |
1318 | '@turf/along@7.2.0':
1319 | dependencies:
1320 | '@turf/bearing': 7.2.0
1321 | '@turf/destination': 7.2.0
1322 | '@turf/distance': 7.2.0
1323 | '@turf/helpers': 7.2.0
1324 | '@turf/invariant': 7.2.0
1325 | '@types/geojson': 7946.0.16
1326 | tslib: 2.8.1
1327 |
1328 | '@turf/angle@7.2.0':
1329 | dependencies:
1330 | '@turf/bearing': 7.2.0
1331 | '@turf/helpers': 7.2.0
1332 | '@turf/invariant': 7.2.0
1333 | '@turf/rhumb-bearing': 7.2.0
1334 | '@types/geojson': 7946.0.16
1335 | tslib: 2.8.1
1336 |
1337 | '@turf/area@7.2.0':
1338 | dependencies:
1339 | '@turf/helpers': 7.2.0
1340 | '@turf/meta': 7.2.0
1341 | '@types/geojson': 7946.0.16
1342 | tslib: 2.8.1
1343 |
1344 | '@turf/bbox-clip@7.2.0':
1345 | dependencies:
1346 | '@turf/helpers': 7.2.0
1347 | '@turf/invariant': 7.2.0
1348 | '@types/geojson': 7946.0.16
1349 | tslib: 2.8.1
1350 |
1351 | '@turf/bbox-polygon@7.2.0':
1352 | dependencies:
1353 | '@turf/helpers': 7.2.0
1354 | '@types/geojson': 7946.0.16
1355 | tslib: 2.8.1
1356 |
1357 | '@turf/bbox@7.2.0':
1358 | dependencies:
1359 | '@turf/helpers': 7.2.0
1360 | '@turf/meta': 7.2.0
1361 | '@types/geojson': 7946.0.16
1362 | tslib: 2.8.1
1363 |
1364 | '@turf/bearing@7.2.0':
1365 | dependencies:
1366 | '@turf/helpers': 7.2.0
1367 | '@turf/invariant': 7.2.0
1368 | '@types/geojson': 7946.0.16
1369 | tslib: 2.8.1
1370 |
1371 | '@turf/bezier-spline@7.2.0':
1372 | dependencies:
1373 | '@turf/helpers': 7.2.0
1374 | '@turf/invariant': 7.2.0
1375 | '@types/geojson': 7946.0.16
1376 | tslib: 2.8.1
1377 |
1378 | '@turf/boolean-clockwise@7.2.0':
1379 | dependencies:
1380 | '@turf/helpers': 7.2.0
1381 | '@turf/invariant': 7.2.0
1382 | '@types/geojson': 7946.0.16
1383 | tslib: 2.8.1
1384 |
1385 | '@turf/boolean-concave@7.2.0':
1386 | dependencies:
1387 | '@turf/helpers': 7.2.0
1388 | '@turf/invariant': 7.2.0
1389 | '@types/geojson': 7946.0.16
1390 | tslib: 2.8.1
1391 |
1392 | '@turf/boolean-contains@7.2.0':
1393 | dependencies:
1394 | '@turf/bbox': 7.2.0
1395 | '@turf/boolean-point-in-polygon': 7.2.0
1396 | '@turf/boolean-point-on-line': 7.2.0
1397 | '@turf/helpers': 7.2.0
1398 | '@turf/invariant': 7.2.0
1399 | '@types/geojson': 7946.0.16
1400 | tslib: 2.8.1
1401 |
1402 | '@turf/boolean-crosses@7.2.0':
1403 | dependencies:
1404 | '@turf/boolean-point-in-polygon': 7.2.0
1405 | '@turf/helpers': 7.2.0
1406 | '@turf/invariant': 7.2.0
1407 | '@turf/line-intersect': 7.2.0
1408 | '@turf/polygon-to-line': 7.2.0
1409 | '@types/geojson': 7946.0.16
1410 | tslib: 2.8.1
1411 |
1412 | '@turf/boolean-disjoint@7.2.0':
1413 | dependencies:
1414 | '@turf/boolean-point-in-polygon': 7.2.0
1415 | '@turf/helpers': 7.2.0
1416 | '@turf/line-intersect': 7.2.0
1417 | '@turf/meta': 7.2.0
1418 | '@turf/polygon-to-line': 7.2.0
1419 | '@types/geojson': 7946.0.16
1420 | tslib: 2.8.1
1421 |
1422 | '@turf/boolean-equal@7.2.0':
1423 | dependencies:
1424 | '@turf/clean-coords': 7.2.0
1425 | '@turf/helpers': 7.2.0
1426 | '@turf/invariant': 7.2.0
1427 | '@types/geojson': 7946.0.16
1428 | geojson-equality-ts: 1.0.2
1429 | tslib: 2.8.1
1430 |
1431 | '@turf/boolean-intersects@7.2.0':
1432 | dependencies:
1433 | '@turf/boolean-disjoint': 7.2.0
1434 | '@turf/helpers': 7.2.0
1435 | '@turf/meta': 7.2.0
1436 | '@types/geojson': 7946.0.16
1437 | tslib: 2.8.1
1438 |
1439 | '@turf/boolean-overlap@7.2.0':
1440 | dependencies:
1441 | '@turf/helpers': 7.2.0
1442 | '@turf/invariant': 7.2.0
1443 | '@turf/line-intersect': 7.2.0
1444 | '@turf/line-overlap': 7.2.0
1445 | '@turf/meta': 7.2.0
1446 | '@types/geojson': 7946.0.16
1447 | geojson-equality-ts: 1.0.2
1448 | tslib: 2.8.1
1449 |
1450 | '@turf/boolean-parallel@7.2.0':
1451 | dependencies:
1452 | '@turf/clean-coords': 7.2.0
1453 | '@turf/helpers': 7.2.0
1454 | '@turf/line-segment': 7.2.0
1455 | '@turf/rhumb-bearing': 7.2.0
1456 | '@types/geojson': 7946.0.16
1457 | tslib: 2.8.1
1458 |
1459 | '@turf/boolean-point-in-polygon@7.2.0':
1460 | dependencies:
1461 | '@turf/helpers': 7.2.0
1462 | '@turf/invariant': 7.2.0
1463 | '@types/geojson': 7946.0.16
1464 | point-in-polygon-hao: 1.2.4
1465 | tslib: 2.8.1
1466 |
1467 | '@turf/boolean-point-on-line@7.2.0':
1468 | dependencies:
1469 | '@turf/helpers': 7.2.0
1470 | '@turf/invariant': 7.2.0
1471 | '@types/geojson': 7946.0.16
1472 | tslib: 2.8.1
1473 |
1474 | '@turf/boolean-touches@7.2.0':
1475 | dependencies:
1476 | '@turf/boolean-point-in-polygon': 7.2.0
1477 | '@turf/boolean-point-on-line': 7.2.0
1478 | '@turf/helpers': 7.2.0
1479 | '@turf/invariant': 7.2.0
1480 | '@types/geojson': 7946.0.16
1481 | tslib: 2.8.1
1482 |
1483 | '@turf/boolean-valid@7.2.0':
1484 | dependencies:
1485 | '@turf/bbox': 7.2.0
1486 | '@turf/boolean-crosses': 7.2.0
1487 | '@turf/boolean-disjoint': 7.2.0
1488 | '@turf/boolean-overlap': 7.2.0
1489 | '@turf/boolean-point-in-polygon': 7.2.0
1490 | '@turf/boolean-point-on-line': 7.2.0
1491 | '@turf/helpers': 7.2.0
1492 | '@turf/invariant': 7.2.0
1493 | '@turf/line-intersect': 7.2.0
1494 | '@types/geojson': 7946.0.16
1495 | geojson-polygon-self-intersections: 1.2.1
1496 | tslib: 2.8.1
1497 |
1498 | '@turf/boolean-within@7.2.0':
1499 | dependencies:
1500 | '@turf/bbox': 7.2.0
1501 | '@turf/boolean-point-in-polygon': 7.2.0
1502 | '@turf/boolean-point-on-line': 7.2.0
1503 | '@turf/helpers': 7.2.0
1504 | '@turf/invariant': 7.2.0
1505 | '@types/geojson': 7946.0.16
1506 | tslib: 2.8.1
1507 |
1508 | '@turf/buffer@7.2.0':
1509 | dependencies:
1510 | '@turf/bbox': 7.2.0
1511 | '@turf/center': 7.2.0
1512 | '@turf/helpers': 7.2.0
1513 | '@turf/jsts': 2.7.2
1514 | '@turf/meta': 7.2.0
1515 | '@turf/projection': 7.2.0
1516 | '@types/geojson': 7946.0.16
1517 | d3-geo: 1.7.1
1518 |
1519 | '@turf/center-mean@7.2.0':
1520 | dependencies:
1521 | '@turf/bbox': 7.2.0
1522 | '@turf/helpers': 7.2.0
1523 | '@turf/meta': 7.2.0
1524 | '@types/geojson': 7946.0.16
1525 | tslib: 2.8.1
1526 |
1527 | '@turf/center-median@7.2.0':
1528 | dependencies:
1529 | '@turf/center-mean': 7.2.0
1530 | '@turf/centroid': 7.2.0
1531 | '@turf/distance': 7.2.0
1532 | '@turf/helpers': 7.2.0
1533 | '@turf/meta': 7.2.0
1534 | '@types/geojson': 7946.0.16
1535 | tslib: 2.8.1
1536 |
1537 | '@turf/center-of-mass@7.2.0':
1538 | dependencies:
1539 | '@turf/centroid': 7.2.0
1540 | '@turf/convex': 7.2.0
1541 | '@turf/helpers': 7.2.0
1542 | '@turf/invariant': 7.2.0
1543 | '@turf/meta': 7.2.0
1544 | '@types/geojson': 7946.0.16
1545 | tslib: 2.8.1
1546 |
1547 | '@turf/center@7.2.0':
1548 | dependencies:
1549 | '@turf/bbox': 7.2.0
1550 | '@turf/helpers': 7.2.0
1551 | '@types/geojson': 7946.0.16
1552 | tslib: 2.8.1
1553 |
1554 | '@turf/centroid@7.2.0':
1555 | dependencies:
1556 | '@turf/helpers': 7.2.0
1557 | '@turf/meta': 7.2.0
1558 | '@types/geojson': 7946.0.16
1559 | tslib: 2.8.1
1560 |
1561 | '@turf/circle@7.2.0':
1562 | dependencies:
1563 | '@turf/destination': 7.2.0
1564 | '@turf/helpers': 7.2.0
1565 | '@types/geojson': 7946.0.16
1566 | tslib: 2.8.1
1567 |
1568 | '@turf/clean-coords@7.2.0':
1569 | dependencies:
1570 | '@turf/helpers': 7.2.0
1571 | '@turf/invariant': 7.2.0
1572 | '@types/geojson': 7946.0.16
1573 | tslib: 2.8.1
1574 |
1575 | '@turf/clone@7.2.0':
1576 | dependencies:
1577 | '@turf/helpers': 7.2.0
1578 | '@types/geojson': 7946.0.16
1579 | tslib: 2.8.1
1580 |
1581 | '@turf/clusters-dbscan@7.2.0':
1582 | dependencies:
1583 | '@turf/clone': 7.2.0
1584 | '@turf/distance': 7.2.0
1585 | '@turf/helpers': 7.2.0
1586 | '@turf/meta': 7.2.0
1587 | '@types/geojson': 7946.0.16
1588 | rbush: 3.0.1
1589 | tslib: 2.8.1
1590 |
1591 | '@turf/clusters-kmeans@7.2.0':
1592 | dependencies:
1593 | '@turf/clone': 7.2.0
1594 | '@turf/helpers': 7.2.0
1595 | '@turf/invariant': 7.2.0
1596 | '@turf/meta': 7.2.0
1597 | '@types/geojson': 7946.0.16
1598 | skmeans: 0.9.7
1599 | tslib: 2.8.1
1600 |
1601 | '@turf/clusters@7.2.0':
1602 | dependencies:
1603 | '@turf/helpers': 7.2.0
1604 | '@turf/meta': 7.2.0
1605 | '@types/geojson': 7946.0.16
1606 | tslib: 2.8.1
1607 |
1608 | '@turf/collect@7.2.0':
1609 | dependencies:
1610 | '@turf/bbox': 7.2.0
1611 | '@turf/boolean-point-in-polygon': 7.2.0
1612 | '@turf/helpers': 7.2.0
1613 | '@types/geojson': 7946.0.16
1614 | rbush: 3.0.1
1615 | tslib: 2.8.1
1616 |
1617 | '@turf/combine@7.2.0':
1618 | dependencies:
1619 | '@turf/helpers': 7.2.0
1620 | '@turf/meta': 7.2.0
1621 | '@types/geojson': 7946.0.16
1622 | tslib: 2.8.1
1623 |
1624 | '@turf/concave@7.2.0':
1625 | dependencies:
1626 | '@turf/clone': 7.2.0
1627 | '@turf/distance': 7.2.0
1628 | '@turf/helpers': 7.2.0
1629 | '@turf/invariant': 7.2.0
1630 | '@turf/meta': 7.2.0
1631 | '@turf/tin': 7.2.0
1632 | '@types/geojson': 7946.0.16
1633 | topojson-client: 3.1.0
1634 | topojson-server: 3.0.1
1635 | tslib: 2.8.1
1636 |
1637 | '@turf/convex@7.2.0':
1638 | dependencies:
1639 | '@turf/helpers': 7.2.0
1640 | '@turf/meta': 7.2.0
1641 | '@types/geojson': 7946.0.16
1642 | concaveman: 1.2.1
1643 | tslib: 2.8.1
1644 |
1645 | '@turf/destination@7.2.0':
1646 | dependencies:
1647 | '@turf/helpers': 7.2.0
1648 | '@turf/invariant': 7.2.0
1649 | '@types/geojson': 7946.0.16
1650 | tslib: 2.8.1
1651 |
1652 | '@turf/difference@7.2.0':
1653 | dependencies:
1654 | '@turf/helpers': 7.2.0
1655 | '@turf/meta': 7.2.0
1656 | '@types/geojson': 7946.0.16
1657 | polyclip-ts: 0.16.8
1658 | tslib: 2.8.1
1659 |
1660 | '@turf/dissolve@7.2.0':
1661 | dependencies:
1662 | '@turf/flatten': 7.2.0
1663 | '@turf/helpers': 7.2.0
1664 | '@turf/invariant': 7.2.0
1665 | '@turf/meta': 7.2.0
1666 | '@types/geojson': 7946.0.16
1667 | polyclip-ts: 0.16.8
1668 | tslib: 2.8.1
1669 |
1670 | '@turf/distance-weight@7.2.0':
1671 | dependencies:
1672 | '@turf/centroid': 7.2.0
1673 | '@turf/helpers': 7.2.0
1674 | '@turf/invariant': 7.2.0
1675 | '@turf/meta': 7.2.0
1676 | '@types/geojson': 7946.0.16
1677 | tslib: 2.8.1
1678 |
1679 | '@turf/distance@7.2.0':
1680 | dependencies:
1681 | '@turf/helpers': 7.2.0
1682 | '@turf/invariant': 7.2.0
1683 | '@types/geojson': 7946.0.16
1684 | tslib: 2.8.1
1685 |
1686 | '@turf/ellipse@7.2.0':
1687 | dependencies:
1688 | '@turf/helpers': 7.2.0
1689 | '@turf/invariant': 7.2.0
1690 | '@turf/rhumb-destination': 7.2.0
1691 | '@turf/transform-rotate': 7.2.0
1692 | '@types/geojson': 7946.0.16
1693 | tslib: 2.8.1
1694 |
1695 | '@turf/envelope@7.2.0':
1696 | dependencies:
1697 | '@turf/bbox': 7.2.0
1698 | '@turf/bbox-polygon': 7.2.0
1699 | '@turf/helpers': 7.2.0
1700 | '@types/geojson': 7946.0.16
1701 | tslib: 2.8.1
1702 |
1703 | '@turf/explode@7.2.0':
1704 | dependencies:
1705 | '@turf/helpers': 7.2.0
1706 | '@turf/meta': 7.2.0
1707 | '@types/geojson': 7946.0.16
1708 | tslib: 2.8.1
1709 |
1710 | '@turf/flatten@7.2.0':
1711 | dependencies:
1712 | '@turf/helpers': 7.2.0
1713 | '@turf/meta': 7.2.0
1714 | '@types/geojson': 7946.0.16
1715 | tslib: 2.8.1
1716 |
1717 | '@turf/flip@7.2.0':
1718 | dependencies:
1719 | '@turf/clone': 7.2.0
1720 | '@turf/helpers': 7.2.0
1721 | '@turf/meta': 7.2.0
1722 | '@types/geojson': 7946.0.16
1723 | tslib: 2.8.1
1724 |
1725 | '@turf/geojson-rbush@7.2.0':
1726 | dependencies:
1727 | '@turf/bbox': 7.2.0
1728 | '@turf/helpers': 7.2.0
1729 | '@turf/meta': 7.2.0
1730 | '@types/geojson': 7946.0.16
1731 | rbush: 3.0.1
1732 |
1733 | '@turf/great-circle@7.2.0':
1734 | dependencies:
1735 | '@turf/helpers': 7.2.0
1736 | '@turf/invariant': 7.2.0
1737 | '@types/geojson': 7946.0.16
1738 |
1739 | '@turf/helpers@7.2.0':
1740 | dependencies:
1741 | '@types/geojson': 7946.0.16
1742 | tslib: 2.8.1
1743 |
1744 | '@turf/hex-grid@7.2.0':
1745 | dependencies:
1746 | '@turf/distance': 7.2.0
1747 | '@turf/helpers': 7.2.0
1748 | '@turf/intersect': 7.2.0
1749 | '@turf/invariant': 7.2.0
1750 | '@types/geojson': 7946.0.16
1751 | tslib: 2.8.1
1752 |
1753 | '@turf/interpolate@7.2.0':
1754 | dependencies:
1755 | '@turf/bbox': 7.2.0
1756 | '@turf/centroid': 7.2.0
1757 | '@turf/clone': 7.2.0
1758 | '@turf/distance': 7.2.0
1759 | '@turf/helpers': 7.2.0
1760 | '@turf/hex-grid': 7.2.0
1761 | '@turf/invariant': 7.2.0
1762 | '@turf/meta': 7.2.0
1763 | '@turf/point-grid': 7.2.0
1764 | '@turf/square-grid': 7.2.0
1765 | '@turf/triangle-grid': 7.2.0
1766 | '@types/geojson': 7946.0.16
1767 |
1768 | '@turf/intersect@7.2.0':
1769 | dependencies:
1770 | '@turf/helpers': 7.2.0
1771 | '@turf/meta': 7.2.0
1772 | '@types/geojson': 7946.0.16
1773 | polyclip-ts: 0.16.8
1774 | tslib: 2.8.1
1775 |
1776 | '@turf/invariant@7.2.0':
1777 | dependencies:
1778 | '@turf/helpers': 7.2.0
1779 | '@types/geojson': 7946.0.16
1780 | tslib: 2.8.1
1781 |
1782 | '@turf/isobands@7.2.0':
1783 | dependencies:
1784 | '@turf/area': 7.2.0
1785 | '@turf/bbox': 7.2.0
1786 | '@turf/boolean-point-in-polygon': 7.2.0
1787 | '@turf/explode': 7.2.0
1788 | '@turf/helpers': 7.2.0
1789 | '@turf/invariant': 7.2.0
1790 | '@turf/meta': 7.2.0
1791 | '@types/geojson': 7946.0.16
1792 | marchingsquares: 1.3.3
1793 | tslib: 2.8.1
1794 |
1795 | '@turf/isolines@7.2.0':
1796 | dependencies:
1797 | '@turf/bbox': 7.2.0
1798 | '@turf/helpers': 7.2.0
1799 | '@turf/invariant': 7.2.0
1800 | '@turf/meta': 7.2.0
1801 | '@types/geojson': 7946.0.16
1802 | marchingsquares: 1.3.3
1803 | tslib: 2.8.1
1804 |
1805 | '@turf/jsts@2.7.2':
1806 | dependencies:
1807 | jsts: 2.7.1
1808 |
1809 | '@turf/kinks@7.2.0':
1810 | dependencies:
1811 | '@turf/helpers': 7.2.0
1812 | '@types/geojson': 7946.0.16
1813 | tslib: 2.8.1
1814 |
1815 | '@turf/length@7.2.0':
1816 | dependencies:
1817 | '@turf/distance': 7.2.0
1818 | '@turf/helpers': 7.2.0
1819 | '@turf/meta': 7.2.0
1820 | '@types/geojson': 7946.0.16
1821 | tslib: 2.8.1
1822 |
1823 | '@turf/line-arc@7.2.0':
1824 | dependencies:
1825 | '@turf/circle': 7.2.0
1826 | '@turf/destination': 7.2.0
1827 | '@turf/helpers': 7.2.0
1828 | '@types/geojson': 7946.0.16
1829 | tslib: 2.8.1
1830 |
1831 | '@turf/line-chunk@7.2.0':
1832 | dependencies:
1833 | '@turf/helpers': 7.2.0
1834 | '@turf/length': 7.2.0
1835 | '@turf/line-slice-along': 7.2.0
1836 | '@turf/meta': 7.2.0
1837 | '@types/geojson': 7946.0.16
1838 |
1839 | '@turf/line-intersect@7.2.0':
1840 | dependencies:
1841 | '@turf/helpers': 7.2.0
1842 | '@types/geojson': 7946.0.16
1843 | sweepline-intersections: 1.5.0
1844 | tslib: 2.8.1
1845 |
1846 | '@turf/line-offset@7.2.0':
1847 | dependencies:
1848 | '@turf/helpers': 7.2.0
1849 | '@turf/invariant': 7.2.0
1850 | '@turf/meta': 7.2.0
1851 | '@types/geojson': 7946.0.16
1852 |
1853 | '@turf/line-overlap@7.2.0':
1854 | dependencies:
1855 | '@turf/boolean-point-on-line': 7.2.0
1856 | '@turf/geojson-rbush': 7.2.0
1857 | '@turf/helpers': 7.2.0
1858 | '@turf/invariant': 7.2.0
1859 | '@turf/line-segment': 7.2.0
1860 | '@turf/meta': 7.2.0
1861 | '@turf/nearest-point-on-line': 7.2.0
1862 | '@types/geojson': 7946.0.16
1863 | fast-deep-equal: 3.1.3
1864 | tslib: 2.8.1
1865 |
1866 | '@turf/line-segment@7.2.0':
1867 | dependencies:
1868 | '@turf/helpers': 7.2.0
1869 | '@turf/invariant': 7.2.0
1870 | '@turf/meta': 7.2.0
1871 | '@types/geojson': 7946.0.16
1872 | tslib: 2.8.1
1873 |
1874 | '@turf/line-slice-along@7.2.0':
1875 | dependencies:
1876 | '@turf/bearing': 7.2.0
1877 | '@turf/destination': 7.2.0
1878 | '@turf/distance': 7.2.0
1879 | '@turf/helpers': 7.2.0
1880 | '@types/geojson': 7946.0.16
1881 |
1882 | '@turf/line-slice@7.2.0':
1883 | dependencies:
1884 | '@turf/helpers': 7.2.0
1885 | '@turf/invariant': 7.2.0
1886 | '@turf/nearest-point-on-line': 7.2.0
1887 | '@types/geojson': 7946.0.16
1888 |
1889 | '@turf/line-split@7.2.0':
1890 | dependencies:
1891 | '@turf/bbox': 7.2.0
1892 | '@turf/geojson-rbush': 7.2.0
1893 | '@turf/helpers': 7.2.0
1894 | '@turf/invariant': 7.2.0
1895 | '@turf/line-intersect': 7.2.0
1896 | '@turf/line-segment': 7.2.0
1897 | '@turf/meta': 7.2.0
1898 | '@turf/nearest-point-on-line': 7.2.0
1899 | '@turf/square': 7.2.0
1900 | '@turf/truncate': 7.2.0
1901 | '@types/geojson': 7946.0.16
1902 |
1903 | '@turf/line-to-polygon@7.2.0':
1904 | dependencies:
1905 | '@turf/bbox': 7.2.0
1906 | '@turf/clone': 7.2.0
1907 | '@turf/helpers': 7.2.0
1908 | '@turf/invariant': 7.2.0
1909 | '@types/geojson': 7946.0.16
1910 | tslib: 2.8.1
1911 |
1912 | '@turf/mask@7.2.0':
1913 | dependencies:
1914 | '@turf/clone': 7.2.0
1915 | '@turf/helpers': 7.2.0
1916 | '@types/geojson': 7946.0.16
1917 | polyclip-ts: 0.16.8
1918 | tslib: 2.8.1
1919 |
1920 | '@turf/meta@7.2.0':
1921 | dependencies:
1922 | '@turf/helpers': 7.2.0
1923 | '@types/geojson': 7946.0.16
1924 |
1925 | '@turf/midpoint@7.2.0':
1926 | dependencies:
1927 | '@turf/bearing': 7.2.0
1928 | '@turf/destination': 7.2.0
1929 | '@turf/distance': 7.2.0
1930 | '@turf/helpers': 7.2.0
1931 | '@types/geojson': 7946.0.16
1932 | tslib: 2.8.1
1933 |
1934 | '@turf/moran-index@7.2.0':
1935 | dependencies:
1936 | '@turf/distance-weight': 7.2.0
1937 | '@turf/helpers': 7.2.0
1938 | '@turf/meta': 7.2.0
1939 | '@types/geojson': 7946.0.16
1940 | tslib: 2.8.1
1941 |
1942 | '@turf/nearest-neighbor-analysis@7.2.0':
1943 | dependencies:
1944 | '@turf/area': 7.2.0
1945 | '@turf/bbox': 7.2.0
1946 | '@turf/bbox-polygon': 7.2.0
1947 | '@turf/centroid': 7.2.0
1948 | '@turf/distance': 7.2.0
1949 | '@turf/helpers': 7.2.0
1950 | '@turf/meta': 7.2.0
1951 | '@turf/nearest-point': 7.2.0
1952 | '@types/geojson': 7946.0.16
1953 | tslib: 2.8.1
1954 |
1955 | '@turf/nearest-point-on-line@7.2.0':
1956 | dependencies:
1957 | '@turf/distance': 7.2.0
1958 | '@turf/helpers': 7.2.0
1959 | '@turf/invariant': 7.2.0
1960 | '@turf/meta': 7.2.0
1961 | '@types/geojson': 7946.0.16
1962 | tslib: 2.8.1
1963 |
1964 | '@turf/nearest-point-to-line@7.2.0':
1965 | dependencies:
1966 | '@turf/helpers': 7.2.0
1967 | '@turf/invariant': 7.2.0
1968 | '@turf/meta': 7.2.0
1969 | '@turf/point-to-line-distance': 7.2.0
1970 | '@types/geojson': 7946.0.16
1971 | tslib: 2.8.1
1972 |
1973 | '@turf/nearest-point@7.2.0':
1974 | dependencies:
1975 | '@turf/clone': 7.2.0
1976 | '@turf/distance': 7.2.0
1977 | '@turf/helpers': 7.2.0
1978 | '@turf/meta': 7.2.0
1979 | '@types/geojson': 7946.0.16
1980 | tslib: 2.8.1
1981 |
1982 | '@turf/planepoint@7.2.0':
1983 | dependencies:
1984 | '@turf/helpers': 7.2.0
1985 | '@turf/invariant': 7.2.0
1986 | '@types/geojson': 7946.0.16
1987 | tslib: 2.8.1
1988 |
1989 | '@turf/point-grid@7.2.0':
1990 | dependencies:
1991 | '@turf/boolean-within': 7.2.0
1992 | '@turf/distance': 7.2.0
1993 | '@turf/helpers': 7.2.0
1994 | '@turf/invariant': 7.2.0
1995 | '@types/geojson': 7946.0.16
1996 | tslib: 2.8.1
1997 |
1998 | '@turf/point-on-feature@7.2.0':
1999 | dependencies:
2000 | '@turf/boolean-point-in-polygon': 7.2.0
2001 | '@turf/center': 7.2.0
2002 | '@turf/explode': 7.2.0
2003 | '@turf/helpers': 7.2.0
2004 | '@turf/nearest-point': 7.2.0
2005 | '@types/geojson': 7946.0.16
2006 | tslib: 2.8.1
2007 |
2008 | '@turf/point-to-line-distance@7.2.0':
2009 | dependencies:
2010 | '@turf/bearing': 7.2.0
2011 | '@turf/distance': 7.2.0
2012 | '@turf/helpers': 7.2.0
2013 | '@turf/invariant': 7.2.0
2014 | '@turf/meta': 7.2.0
2015 | '@turf/nearest-point-on-line': 7.2.0
2016 | '@turf/projection': 7.2.0
2017 | '@turf/rhumb-bearing': 7.2.0
2018 | '@turf/rhumb-distance': 7.2.0
2019 | '@types/geojson': 7946.0.16
2020 | tslib: 2.8.1
2021 |
2022 | '@turf/point-to-polygon-distance@7.2.0':
2023 | dependencies:
2024 | '@turf/boolean-point-in-polygon': 7.2.0
2025 | '@turf/helpers': 7.2.0
2026 | '@turf/invariant': 7.2.0
2027 | '@turf/meta': 7.2.0
2028 | '@turf/point-to-line-distance': 7.2.0
2029 | '@turf/polygon-to-line': 7.2.0
2030 | '@types/geojson': 7946.0.16
2031 | tslib: 2.8.1
2032 |
2033 | '@turf/points-within-polygon@7.2.0':
2034 | dependencies:
2035 | '@turf/boolean-point-in-polygon': 7.2.0
2036 | '@turf/helpers': 7.2.0
2037 | '@turf/meta': 7.2.0
2038 | '@types/geojson': 7946.0.16
2039 | tslib: 2.8.1
2040 |
2041 | '@turf/polygon-smooth@7.2.0':
2042 | dependencies:
2043 | '@turf/helpers': 7.2.0
2044 | '@turf/meta': 7.2.0
2045 | '@types/geojson': 7946.0.16
2046 | tslib: 2.8.1
2047 |
2048 | '@turf/polygon-tangents@7.2.0':
2049 | dependencies:
2050 | '@turf/bbox': 7.2.0
2051 | '@turf/boolean-within': 7.2.0
2052 | '@turf/explode': 7.2.0
2053 | '@turf/helpers': 7.2.0
2054 | '@turf/invariant': 7.2.0
2055 | '@turf/nearest-point': 7.2.0
2056 | '@types/geojson': 7946.0.16
2057 | tslib: 2.8.1
2058 |
2059 | '@turf/polygon-to-line@7.2.0':
2060 | dependencies:
2061 | '@turf/helpers': 7.2.0
2062 | '@turf/invariant': 7.2.0
2063 | '@types/geojson': 7946.0.16
2064 | tslib: 2.8.1
2065 |
2066 | '@turf/polygonize@7.2.0':
2067 | dependencies:
2068 | '@turf/boolean-point-in-polygon': 7.2.0
2069 | '@turf/envelope': 7.2.0
2070 | '@turf/helpers': 7.2.0
2071 | '@turf/invariant': 7.2.0
2072 | '@turf/meta': 7.2.0
2073 | '@types/geojson': 7946.0.16
2074 | tslib: 2.8.1
2075 |
2076 | '@turf/projection@7.2.0':
2077 | dependencies:
2078 | '@turf/clone': 7.2.0
2079 | '@turf/helpers': 7.2.0
2080 | '@turf/meta': 7.2.0
2081 | '@types/geojson': 7946.0.16
2082 | tslib: 2.8.1
2083 |
2084 | '@turf/quadrat-analysis@7.2.0':
2085 | dependencies:
2086 | '@turf/area': 7.2.0
2087 | '@turf/bbox': 7.2.0
2088 | '@turf/bbox-polygon': 7.2.0
2089 | '@turf/centroid': 7.2.0
2090 | '@turf/helpers': 7.2.0
2091 | '@turf/invariant': 7.2.0
2092 | '@turf/point-grid': 7.2.0
2093 | '@turf/random': 7.2.0
2094 | '@turf/square-grid': 7.2.0
2095 | '@types/geojson': 7946.0.16
2096 | tslib: 2.8.1
2097 |
2098 | '@turf/random@7.2.0':
2099 | dependencies:
2100 | '@turf/helpers': 7.2.0
2101 | '@types/geojson': 7946.0.16
2102 | tslib: 2.8.1
2103 |
2104 | '@turf/rectangle-grid@7.2.0':
2105 | dependencies:
2106 | '@turf/boolean-intersects': 7.2.0
2107 | '@turf/distance': 7.2.0
2108 | '@turf/helpers': 7.2.0
2109 | '@types/geojson': 7946.0.16
2110 | tslib: 2.8.1
2111 |
2112 | '@turf/rewind@7.2.0':
2113 | dependencies:
2114 | '@turf/boolean-clockwise': 7.2.0
2115 | '@turf/clone': 7.2.0
2116 | '@turf/helpers': 7.2.0
2117 | '@turf/invariant': 7.2.0
2118 | '@turf/meta': 7.2.0
2119 | '@types/geojson': 7946.0.16
2120 | tslib: 2.8.1
2121 |
2122 | '@turf/rhumb-bearing@7.2.0':
2123 | dependencies:
2124 | '@turf/helpers': 7.2.0
2125 | '@turf/invariant': 7.2.0
2126 | '@types/geojson': 7946.0.16
2127 | tslib: 2.8.1
2128 |
2129 | '@turf/rhumb-destination@7.2.0':
2130 | dependencies:
2131 | '@turf/helpers': 7.2.0
2132 | '@turf/invariant': 7.2.0
2133 | '@types/geojson': 7946.0.16
2134 | tslib: 2.8.1
2135 |
2136 | '@turf/rhumb-distance@7.2.0':
2137 | dependencies:
2138 | '@turf/helpers': 7.2.0
2139 | '@turf/invariant': 7.2.0
2140 | '@types/geojson': 7946.0.16
2141 | tslib: 2.8.1
2142 |
2143 | '@turf/sample@7.2.0':
2144 | dependencies:
2145 | '@turf/helpers': 7.2.0
2146 | '@types/geojson': 7946.0.16
2147 | tslib: 2.8.1
2148 |
2149 | '@turf/sector@7.2.0':
2150 | dependencies:
2151 | '@turf/circle': 7.2.0
2152 | '@turf/helpers': 7.2.0
2153 | '@turf/invariant': 7.2.0
2154 | '@turf/line-arc': 7.2.0
2155 | '@turf/meta': 7.2.0
2156 | '@types/geojson': 7946.0.16
2157 | tslib: 2.8.1
2158 |
2159 | '@turf/shortest-path@7.2.0':
2160 | dependencies:
2161 | '@turf/bbox': 7.2.0
2162 | '@turf/bbox-polygon': 7.2.0
2163 | '@turf/boolean-point-in-polygon': 7.2.0
2164 | '@turf/clean-coords': 7.2.0
2165 | '@turf/distance': 7.2.0
2166 | '@turf/helpers': 7.2.0
2167 | '@turf/invariant': 7.2.0
2168 | '@turf/meta': 7.2.0
2169 | '@turf/transform-scale': 7.2.0
2170 | '@types/geojson': 7946.0.16
2171 | tslib: 2.8.1
2172 |
2173 | '@turf/simplify@7.2.0':
2174 | dependencies:
2175 | '@turf/clean-coords': 7.2.0
2176 | '@turf/clone': 7.2.0
2177 | '@turf/helpers': 7.2.0
2178 | '@turf/meta': 7.2.0
2179 | '@types/geojson': 7946.0.16
2180 | tslib: 2.8.1
2181 |
2182 | '@turf/square-grid@7.2.0':
2183 | dependencies:
2184 | '@turf/helpers': 7.2.0
2185 | '@turf/rectangle-grid': 7.2.0
2186 | '@types/geojson': 7946.0.16
2187 | tslib: 2.8.1
2188 |
2189 | '@turf/square@7.2.0':
2190 | dependencies:
2191 | '@turf/distance': 7.2.0
2192 | '@turf/helpers': 7.2.0
2193 | '@types/geojson': 7946.0.16
2194 | tslib: 2.8.1
2195 |
2196 | '@turf/standard-deviational-ellipse@7.2.0':
2197 | dependencies:
2198 | '@turf/center-mean': 7.2.0
2199 | '@turf/ellipse': 7.2.0
2200 | '@turf/helpers': 7.2.0
2201 | '@turf/invariant': 7.2.0
2202 | '@turf/meta': 7.2.0
2203 | '@turf/points-within-polygon': 7.2.0
2204 | '@types/geojson': 7946.0.16
2205 | tslib: 2.8.1
2206 |
2207 | '@turf/tag@7.2.0':
2208 | dependencies:
2209 | '@turf/boolean-point-in-polygon': 7.2.0
2210 | '@turf/clone': 7.2.0
2211 | '@turf/helpers': 7.2.0
2212 | '@turf/meta': 7.2.0
2213 | '@types/geojson': 7946.0.16
2214 | tslib: 2.8.1
2215 |
2216 | '@turf/tesselate@7.2.0':
2217 | dependencies:
2218 | '@turf/helpers': 7.2.0
2219 | '@types/geojson': 7946.0.16
2220 | earcut: 2.2.4
2221 | tslib: 2.8.1
2222 |
2223 | '@turf/tin@7.2.0':
2224 | dependencies:
2225 | '@turf/helpers': 7.2.0
2226 | '@types/geojson': 7946.0.16
2227 | tslib: 2.8.1
2228 |
2229 | '@turf/transform-rotate@7.2.0':
2230 | dependencies:
2231 | '@turf/centroid': 7.2.0
2232 | '@turf/clone': 7.2.0
2233 | '@turf/helpers': 7.2.0
2234 | '@turf/invariant': 7.2.0
2235 | '@turf/meta': 7.2.0
2236 | '@turf/rhumb-bearing': 7.2.0
2237 | '@turf/rhumb-destination': 7.2.0
2238 | '@turf/rhumb-distance': 7.2.0
2239 | '@types/geojson': 7946.0.16
2240 | tslib: 2.8.1
2241 |
2242 | '@turf/transform-scale@7.2.0':
2243 | dependencies:
2244 | '@turf/bbox': 7.2.0
2245 | '@turf/center': 7.2.0
2246 | '@turf/centroid': 7.2.0
2247 | '@turf/clone': 7.2.0
2248 | '@turf/helpers': 7.2.0
2249 | '@turf/invariant': 7.2.0
2250 | '@turf/meta': 7.2.0
2251 | '@turf/rhumb-bearing': 7.2.0
2252 | '@turf/rhumb-destination': 7.2.0
2253 | '@turf/rhumb-distance': 7.2.0
2254 | '@types/geojson': 7946.0.16
2255 | tslib: 2.8.1
2256 |
2257 | '@turf/transform-translate@7.2.0':
2258 | dependencies:
2259 | '@turf/clone': 7.2.0
2260 | '@turf/helpers': 7.2.0
2261 | '@turf/invariant': 7.2.0
2262 | '@turf/meta': 7.2.0
2263 | '@turf/rhumb-destination': 7.2.0
2264 | '@types/geojson': 7946.0.16
2265 | tslib: 2.8.1
2266 |
2267 | '@turf/triangle-grid@7.2.0':
2268 | dependencies:
2269 | '@turf/distance': 7.2.0
2270 | '@turf/helpers': 7.2.0
2271 | '@turf/intersect': 7.2.0
2272 | '@types/geojson': 7946.0.16
2273 | tslib: 2.8.1
2274 |
2275 | '@turf/truncate@7.2.0':
2276 | dependencies:
2277 | '@turf/helpers': 7.2.0
2278 | '@turf/meta': 7.2.0
2279 | '@types/geojson': 7946.0.16
2280 | tslib: 2.8.1
2281 |
2282 | '@turf/turf@7.2.0':
2283 | dependencies:
2284 | '@turf/along': 7.2.0
2285 | '@turf/angle': 7.2.0
2286 | '@turf/area': 7.2.0
2287 | '@turf/bbox': 7.2.0
2288 | '@turf/bbox-clip': 7.2.0
2289 | '@turf/bbox-polygon': 7.2.0
2290 | '@turf/bearing': 7.2.0
2291 | '@turf/bezier-spline': 7.2.0
2292 | '@turf/boolean-clockwise': 7.2.0
2293 | '@turf/boolean-concave': 7.2.0
2294 | '@turf/boolean-contains': 7.2.0
2295 | '@turf/boolean-crosses': 7.2.0
2296 | '@turf/boolean-disjoint': 7.2.0
2297 | '@turf/boolean-equal': 7.2.0
2298 | '@turf/boolean-intersects': 7.2.0
2299 | '@turf/boolean-overlap': 7.2.0
2300 | '@turf/boolean-parallel': 7.2.0
2301 | '@turf/boolean-point-in-polygon': 7.2.0
2302 | '@turf/boolean-point-on-line': 7.2.0
2303 | '@turf/boolean-touches': 7.2.0
2304 | '@turf/boolean-valid': 7.2.0
2305 | '@turf/boolean-within': 7.2.0
2306 | '@turf/buffer': 7.2.0
2307 | '@turf/center': 7.2.0
2308 | '@turf/center-mean': 7.2.0
2309 | '@turf/center-median': 7.2.0
2310 | '@turf/center-of-mass': 7.2.0
2311 | '@turf/centroid': 7.2.0
2312 | '@turf/circle': 7.2.0
2313 | '@turf/clean-coords': 7.2.0
2314 | '@turf/clone': 7.2.0
2315 | '@turf/clusters': 7.2.0
2316 | '@turf/clusters-dbscan': 7.2.0
2317 | '@turf/clusters-kmeans': 7.2.0
2318 | '@turf/collect': 7.2.0
2319 | '@turf/combine': 7.2.0
2320 | '@turf/concave': 7.2.0
2321 | '@turf/convex': 7.2.0
2322 | '@turf/destination': 7.2.0
2323 | '@turf/difference': 7.2.0
2324 | '@turf/dissolve': 7.2.0
2325 | '@turf/distance': 7.2.0
2326 | '@turf/distance-weight': 7.2.0
2327 | '@turf/ellipse': 7.2.0
2328 | '@turf/envelope': 7.2.0
2329 | '@turf/explode': 7.2.0
2330 | '@turf/flatten': 7.2.0
2331 | '@turf/flip': 7.2.0
2332 | '@turf/geojson-rbush': 7.2.0
2333 | '@turf/great-circle': 7.2.0
2334 | '@turf/helpers': 7.2.0
2335 | '@turf/hex-grid': 7.2.0
2336 | '@turf/interpolate': 7.2.0
2337 | '@turf/intersect': 7.2.0
2338 | '@turf/invariant': 7.2.0
2339 | '@turf/isobands': 7.2.0
2340 | '@turf/isolines': 7.2.0
2341 | '@turf/kinks': 7.2.0
2342 | '@turf/length': 7.2.0
2343 | '@turf/line-arc': 7.2.0
2344 | '@turf/line-chunk': 7.2.0
2345 | '@turf/line-intersect': 7.2.0
2346 | '@turf/line-offset': 7.2.0
2347 | '@turf/line-overlap': 7.2.0
2348 | '@turf/line-segment': 7.2.0
2349 | '@turf/line-slice': 7.2.0
2350 | '@turf/line-slice-along': 7.2.0
2351 | '@turf/line-split': 7.2.0
2352 | '@turf/line-to-polygon': 7.2.0
2353 | '@turf/mask': 7.2.0
2354 | '@turf/meta': 7.2.0
2355 | '@turf/midpoint': 7.2.0
2356 | '@turf/moran-index': 7.2.0
2357 | '@turf/nearest-neighbor-analysis': 7.2.0
2358 | '@turf/nearest-point': 7.2.0
2359 | '@turf/nearest-point-on-line': 7.2.0
2360 | '@turf/nearest-point-to-line': 7.2.0
2361 | '@turf/planepoint': 7.2.0
2362 | '@turf/point-grid': 7.2.0
2363 | '@turf/point-on-feature': 7.2.0
2364 | '@turf/point-to-line-distance': 7.2.0
2365 | '@turf/point-to-polygon-distance': 7.2.0
2366 | '@turf/points-within-polygon': 7.2.0
2367 | '@turf/polygon-smooth': 7.2.0
2368 | '@turf/polygon-tangents': 7.2.0
2369 | '@turf/polygon-to-line': 7.2.0
2370 | '@turf/polygonize': 7.2.0
2371 | '@turf/projection': 7.2.0
2372 | '@turf/quadrat-analysis': 7.2.0
2373 | '@turf/random': 7.2.0
2374 | '@turf/rectangle-grid': 7.2.0
2375 | '@turf/rewind': 7.2.0
2376 | '@turf/rhumb-bearing': 7.2.0
2377 | '@turf/rhumb-destination': 7.2.0
2378 | '@turf/rhumb-distance': 7.2.0
2379 | '@turf/sample': 7.2.0
2380 | '@turf/sector': 7.2.0
2381 | '@turf/shortest-path': 7.2.0
2382 | '@turf/simplify': 7.2.0
2383 | '@turf/square': 7.2.0
2384 | '@turf/square-grid': 7.2.0
2385 | '@turf/standard-deviational-ellipse': 7.2.0
2386 | '@turf/tag': 7.2.0
2387 | '@turf/tesselate': 7.2.0
2388 | '@turf/tin': 7.2.0
2389 | '@turf/transform-rotate': 7.2.0
2390 | '@turf/transform-scale': 7.2.0
2391 | '@turf/transform-translate': 7.2.0
2392 | '@turf/triangle-grid': 7.2.0
2393 | '@turf/truncate': 7.2.0
2394 | '@turf/union': 7.2.0
2395 | '@turf/unkink-polygon': 7.2.0
2396 | '@turf/voronoi': 7.2.0
2397 | '@types/geojson': 7946.0.16
2398 | tslib: 2.8.1
2399 |
2400 | '@turf/union@7.2.0':
2401 | dependencies:
2402 | '@turf/helpers': 7.2.0
2403 | '@turf/meta': 7.2.0
2404 | '@types/geojson': 7946.0.16
2405 | polyclip-ts: 0.16.8
2406 | tslib: 2.8.1
2407 |
2408 | '@turf/unkink-polygon@7.2.0':
2409 | dependencies:
2410 | '@turf/area': 7.2.0
2411 | '@turf/boolean-point-in-polygon': 7.2.0
2412 | '@turf/helpers': 7.2.0
2413 | '@turf/meta': 7.2.0
2414 | '@types/geojson': 7946.0.16
2415 | rbush: 3.0.1
2416 | tslib: 2.8.1
2417 |
2418 | '@turf/voronoi@7.2.0':
2419 | dependencies:
2420 | '@turf/clone': 7.2.0
2421 | '@turf/helpers': 7.2.0
2422 | '@turf/invariant': 7.2.0
2423 | '@types/d3-voronoi': 1.1.12
2424 | '@types/geojson': 7946.0.16
2425 | d3-voronoi: 1.1.2
2426 | tslib: 2.8.1
2427 |
2428 | '@tweenjs/tween.js@23.1.3': {}
2429 |
2430 | '@types/d3-voronoi@1.1.12': {}
2431 |
2432 | '@types/estree@1.0.6': {}
2433 |
2434 | '@types/geojson@7946.0.16': {}
2435 |
2436 | '@types/linkify-it@5.0.0': {}
2437 |
2438 | '@types/markdown-it@14.1.2':
2439 | dependencies:
2440 | '@types/linkify-it': 5.0.0
2441 | '@types/mdurl': 2.0.0
2442 |
2443 | '@types/mdurl@2.0.0': {}
2444 |
2445 | '@types/node@22.13.0':
2446 | dependencies:
2447 | undici-types: 6.20.0
2448 |
2449 | '@types/stats.js@0.17.3': {}
2450 |
2451 | '@types/three@0.173.0':
2452 | dependencies:
2453 | '@tweenjs/tween.js': 23.1.3
2454 | '@types/stats.js': 0.17.3
2455 | '@types/webxr': 0.5.21
2456 | '@webgpu/types': 0.1.54
2457 | fflate: 0.8.2
2458 | meshoptimizer: 0.18.1
2459 |
2460 | '@types/webxr@0.5.21': {}
2461 |
2462 | '@webgpu/types@0.1.54': {}
2463 |
2464 | JSONStream@1.3.5:
2465 | dependencies:
2466 | jsonparse: 1.3.1
2467 | through: 2.3.8
2468 |
2469 | acorn-jsx@5.3.2(acorn@8.14.0):
2470 | dependencies:
2471 | acorn: 8.14.0
2472 |
2473 | acorn@8.14.0: {}
2474 |
2475 | ansi-styles@4.3.0:
2476 | dependencies:
2477 | color-convert: 2.0.1
2478 |
2479 | argparse@2.0.1: {}
2480 |
2481 | balanced-match@1.0.2: {}
2482 |
2483 | bignumber.js@9.1.2: {}
2484 |
2485 | bluebird@3.7.2: {}
2486 |
2487 | brace-expansion@2.0.1:
2488 | dependencies:
2489 | balanced-match: 1.0.2
2490 |
2491 | catharsis@0.9.0:
2492 | dependencies:
2493 | lodash: 4.17.21
2494 |
2495 | chalk@4.1.2:
2496 | dependencies:
2497 | ansi-styles: 4.3.0
2498 | supports-color: 7.2.0
2499 |
2500 | color-convert@2.0.1:
2501 | dependencies:
2502 | color-name: 1.1.4
2503 |
2504 | color-name@1.1.4: {}
2505 |
2506 | commander@2.20.3: {}
2507 |
2508 | concaveman@1.2.1:
2509 | dependencies:
2510 | point-in-polygon: 1.1.0
2511 | rbush: 3.0.1
2512 | robust-predicates: 2.0.4
2513 | tinyqueue: 2.0.3
2514 |
2515 | d3-array@1.2.4: {}
2516 |
2517 | d3-geo@1.7.1:
2518 | dependencies:
2519 | d3-array: 1.2.4
2520 |
2521 | d3-voronoi@1.1.2: {}
2522 |
2523 | deep-is@0.1.4: {}
2524 |
2525 | earcut@2.2.4: {}
2526 |
2527 | entities@4.5.0: {}
2528 |
2529 | esbuild@0.24.2:
2530 | optionalDependencies:
2531 | '@esbuild/aix-ppc64': 0.24.2
2532 | '@esbuild/android-arm': 0.24.2
2533 | '@esbuild/android-arm64': 0.24.2
2534 | '@esbuild/android-x64': 0.24.2
2535 | '@esbuild/darwin-arm64': 0.24.2
2536 | '@esbuild/darwin-x64': 0.24.2
2537 | '@esbuild/freebsd-arm64': 0.24.2
2538 | '@esbuild/freebsd-x64': 0.24.2
2539 | '@esbuild/linux-arm': 0.24.2
2540 | '@esbuild/linux-arm64': 0.24.2
2541 | '@esbuild/linux-ia32': 0.24.2
2542 | '@esbuild/linux-loong64': 0.24.2
2543 | '@esbuild/linux-mips64el': 0.24.2
2544 | '@esbuild/linux-ppc64': 0.24.2
2545 | '@esbuild/linux-riscv64': 0.24.2
2546 | '@esbuild/linux-s390x': 0.24.2
2547 | '@esbuild/linux-x64': 0.24.2
2548 | '@esbuild/netbsd-arm64': 0.24.2
2549 | '@esbuild/netbsd-x64': 0.24.2
2550 | '@esbuild/openbsd-arm64': 0.24.2
2551 | '@esbuild/openbsd-x64': 0.24.2
2552 | '@esbuild/sunos-x64': 0.24.2
2553 | '@esbuild/win32-arm64': 0.24.2
2554 | '@esbuild/win32-ia32': 0.24.2
2555 | '@esbuild/win32-x64': 0.24.2
2556 |
2557 | escape-string-regexp@2.0.0: {}
2558 |
2559 | escodegen@1.14.3:
2560 | dependencies:
2561 | esprima: 4.0.1
2562 | estraverse: 4.3.0
2563 | esutils: 2.0.3
2564 | optionator: 0.8.3
2565 | optionalDependencies:
2566 | source-map: 0.6.1
2567 |
2568 | eslint-visitor-keys@3.4.3: {}
2569 |
2570 | espree@9.6.1:
2571 | dependencies:
2572 | acorn: 8.14.0
2573 | acorn-jsx: 5.3.2(acorn@8.14.0)
2574 | eslint-visitor-keys: 3.4.3
2575 |
2576 | esprima@4.0.1: {}
2577 |
2578 | estraverse@4.3.0: {}
2579 |
2580 | estraverse@5.3.0: {}
2581 |
2582 | esutils@2.0.3: {}
2583 |
2584 | fast-deep-equal@3.1.3: {}
2585 |
2586 | fast-levenshtein@2.0.6: {}
2587 |
2588 | fflate@0.8.2: {}
2589 |
2590 | fs.realpath@1.0.0: {}
2591 |
2592 | fsevents@2.3.3:
2593 | optional: true
2594 |
2595 | geojson-equality-ts@1.0.2:
2596 | dependencies:
2597 | '@types/geojson': 7946.0.16
2598 |
2599 | geojson-polygon-self-intersections@1.2.1:
2600 | dependencies:
2601 | rbush: 2.0.2
2602 |
2603 | geojson-stream@0.1.0:
2604 | dependencies:
2605 | JSONStream: 1.3.5
2606 | through: 2.3.8
2607 |
2608 | glob@8.1.0:
2609 | dependencies:
2610 | fs.realpath: 1.0.0
2611 | inflight: 1.0.6
2612 | inherits: 2.0.4
2613 | minimatch: 5.1.6
2614 | once: 1.4.0
2615 |
2616 | graceful-fs@4.2.11: {}
2617 |
2618 | has-flag@4.0.0: {}
2619 |
2620 | inflight@1.0.6:
2621 | dependencies:
2622 | once: 1.4.0
2623 | wrappy: 1.0.2
2624 |
2625 | inherits@2.0.4: {}
2626 |
2627 | js2xmlparser@4.0.2:
2628 | dependencies:
2629 | xmlcreate: 2.0.4
2630 |
2631 | jsdoc@4.0.4:
2632 | dependencies:
2633 | '@babel/parser': 7.26.7
2634 | '@jsdoc/salty': 0.2.9
2635 | '@types/markdown-it': 14.1.2
2636 | bluebird: 3.7.2
2637 | catharsis: 0.9.0
2638 | escape-string-regexp: 2.0.0
2639 | js2xmlparser: 4.0.2
2640 | klaw: 3.0.0
2641 | markdown-it: 14.1.0
2642 | markdown-it-anchor: 8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0)
2643 | marked: 4.3.0
2644 | mkdirp: 1.0.4
2645 | requizzle: 0.2.4
2646 | strip-json-comments: 3.1.1
2647 | underscore: 1.13.7
2648 |
2649 | jsonparse@1.3.1: {}
2650 |
2651 | jsts@2.7.1: {}
2652 |
2653 | klaw@3.0.0:
2654 | dependencies:
2655 | graceful-fs: 4.2.11
2656 |
2657 | levn@0.3.0:
2658 | dependencies:
2659 | prelude-ls: 1.1.2
2660 | type-check: 0.3.2
2661 |
2662 | linkify-it@5.0.0:
2663 | dependencies:
2664 | uc.micro: 2.1.0
2665 |
2666 | lodash@4.17.21: {}
2667 |
2668 | long@5.2.4: {}
2669 |
2670 | marchingsquares@1.3.3: {}
2671 |
2672 | markdown-it-anchor@8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0):
2673 | dependencies:
2674 | '@types/markdown-it': 14.1.2
2675 | markdown-it: 14.1.0
2676 |
2677 | markdown-it@14.1.0:
2678 | dependencies:
2679 | argparse: 2.0.1
2680 | entities: 4.5.0
2681 | linkify-it: 5.0.0
2682 | mdurl: 2.0.0
2683 | punycode.js: 2.3.1
2684 | uc.micro: 2.1.0
2685 |
2686 | marked@4.3.0: {}
2687 |
2688 | mdurl@2.0.0: {}
2689 |
2690 | meshoptimizer@0.18.1: {}
2691 |
2692 | minimatch@5.1.6:
2693 | dependencies:
2694 | brace-expansion: 2.0.1
2695 |
2696 | minimist@1.2.8: {}
2697 |
2698 | mkdirp@1.0.4: {}
2699 |
2700 | nanoid@3.3.8: {}
2701 |
2702 | once@1.4.0:
2703 | dependencies:
2704 | wrappy: 1.0.2
2705 |
2706 | optionator@0.8.3:
2707 | dependencies:
2708 | deep-is: 0.1.4
2709 | fast-levenshtein: 2.0.6
2710 | levn: 0.3.0
2711 | prelude-ls: 1.1.2
2712 | type-check: 0.3.2
2713 | word-wrap: 1.2.5
2714 |
2715 | picocolors@1.1.1: {}
2716 |
2717 | point-in-polygon-hao@1.2.4:
2718 | dependencies:
2719 | robust-predicates: 3.0.2
2720 |
2721 | point-in-polygon@1.1.0: {}
2722 |
2723 | polyclip-ts@0.16.8:
2724 | dependencies:
2725 | bignumber.js: 9.1.2
2726 | splaytree-ts: 1.0.2
2727 |
2728 | postcss@8.5.1:
2729 | dependencies:
2730 | nanoid: 3.3.8
2731 | picocolors: 1.1.1
2732 | source-map-js: 1.2.1
2733 |
2734 | prelude-ls@1.1.2: {}
2735 |
2736 | protobufjs-cli@1.1.3(protobufjs@7.4.0):
2737 | dependencies:
2738 | chalk: 4.1.2
2739 | escodegen: 1.14.3
2740 | espree: 9.6.1
2741 | estraverse: 5.3.0
2742 | glob: 8.1.0
2743 | jsdoc: 4.0.4
2744 | minimist: 1.2.8
2745 | protobufjs: 7.4.0
2746 | semver: 7.7.0
2747 | tmp: 0.2.3
2748 | uglify-js: 3.19.3
2749 |
2750 | protobufjs@7.4.0:
2751 | dependencies:
2752 | '@protobufjs/aspromise': 1.1.2
2753 | '@protobufjs/base64': 1.1.2
2754 | '@protobufjs/codegen': 2.0.4
2755 | '@protobufjs/eventemitter': 1.1.0
2756 | '@protobufjs/fetch': 1.1.0
2757 | '@protobufjs/float': 1.0.2
2758 | '@protobufjs/inquire': 1.1.0
2759 | '@protobufjs/path': 1.1.2
2760 | '@protobufjs/pool': 1.1.0
2761 | '@protobufjs/utf8': 1.1.0
2762 | '@types/node': 22.13.0
2763 | long: 5.2.4
2764 |
2765 | punycode.js@2.3.1: {}
2766 |
2767 | quickselect@1.1.1: {}
2768 |
2769 | quickselect@2.0.0: {}
2770 |
2771 | rbush@2.0.2:
2772 | dependencies:
2773 | quickselect: 1.1.1
2774 |
2775 | rbush@3.0.1:
2776 | dependencies:
2777 | quickselect: 2.0.0
2778 |
2779 | requizzle@0.2.4:
2780 | dependencies:
2781 | lodash: 4.17.21
2782 |
2783 | robust-predicates@2.0.4: {}
2784 |
2785 | robust-predicates@3.0.2: {}
2786 |
2787 | rollup@4.34.0:
2788 | dependencies:
2789 | '@types/estree': 1.0.6
2790 | optionalDependencies:
2791 | '@rollup/rollup-android-arm-eabi': 4.34.0
2792 | '@rollup/rollup-android-arm64': 4.34.0
2793 | '@rollup/rollup-darwin-arm64': 4.34.0
2794 | '@rollup/rollup-darwin-x64': 4.34.0
2795 | '@rollup/rollup-freebsd-arm64': 4.34.0
2796 | '@rollup/rollup-freebsd-x64': 4.34.0
2797 | '@rollup/rollup-linux-arm-gnueabihf': 4.34.0
2798 | '@rollup/rollup-linux-arm-musleabihf': 4.34.0
2799 | '@rollup/rollup-linux-arm64-gnu': 4.34.0
2800 | '@rollup/rollup-linux-arm64-musl': 4.34.0
2801 | '@rollup/rollup-linux-loongarch64-gnu': 4.34.0
2802 | '@rollup/rollup-linux-powerpc64le-gnu': 4.34.0
2803 | '@rollup/rollup-linux-riscv64-gnu': 4.34.0
2804 | '@rollup/rollup-linux-s390x-gnu': 4.34.0
2805 | '@rollup/rollup-linux-x64-gnu': 4.34.0
2806 | '@rollup/rollup-linux-x64-musl': 4.34.0
2807 | '@rollup/rollup-win32-arm64-msvc': 4.34.0
2808 | '@rollup/rollup-win32-ia32-msvc': 4.34.0
2809 | '@rollup/rollup-win32-x64-msvc': 4.34.0
2810 | fsevents: 2.3.3
2811 |
2812 | semver@7.7.0: {}
2813 |
2814 | skmeans@0.9.7: {}
2815 |
2816 | source-map-js@1.2.1: {}
2817 |
2818 | source-map@0.6.1:
2819 | optional: true
2820 |
2821 | splaytree-ts@1.0.2: {}
2822 |
2823 | strip-json-comments@3.1.1: {}
2824 |
2825 | supports-color@7.2.0:
2826 | dependencies:
2827 | has-flag: 4.0.0
2828 |
2829 | sweepline-intersections@1.5.0:
2830 | dependencies:
2831 | tinyqueue: 2.0.3
2832 |
2833 | three@0.173.0: {}
2834 |
2835 | through@2.3.8: {}
2836 |
2837 | tinyqueue@2.0.3: {}
2838 |
2839 | tmp@0.2.3: {}
2840 |
2841 | topojson-client@3.1.0:
2842 | dependencies:
2843 | commander: 2.20.3
2844 |
2845 | topojson-server@3.0.1:
2846 | dependencies:
2847 | commander: 2.20.3
2848 |
2849 | tslib@2.8.1: {}
2850 |
2851 | type-check@0.3.2:
2852 | dependencies:
2853 | prelude-ls: 1.1.2
2854 |
2855 | typescript@5.7.3: {}
2856 |
2857 | uc.micro@2.1.0: {}
2858 |
2859 | uglify-js@3.19.3: {}
2860 |
2861 | underscore@1.13.7: {}
2862 |
2863 | undici-types@6.20.0: {}
2864 |
2865 | vite@6.0.11(@types/node@22.13.0):
2866 | dependencies:
2867 | esbuild: 0.24.2
2868 | postcss: 8.5.1
2869 | rollup: 4.34.0
2870 | optionalDependencies:
2871 | '@types/node': 22.13.0
2872 | fsevents: 2.3.3
2873 |
2874 | word-wrap@1.2.5: {}
2875 |
2876 | wrappy@1.0.2: {}
2877 |
2878 | xmlcreate@2.0.4: {}
2879 |
--------------------------------------------------------------------------------
/src/core/Input.ts:
--------------------------------------------------------------------------------
1 | import {
2 | EventDispatcher,
3 | PerspectiveCamera,
4 | Vector2,
5 | Vector3,
6 | } from 'three';
7 |
8 | export class Input extends EventDispatcher<{ button: { button: number }; }> {
9 | private readonly desktop: {
10 | isLocked: boolean;
11 | isRunning: boolean;
12 | look: Vector2;
13 | movement: Vector3;
14 | };
15 | private readonly gamepad: {
16 | index: number;
17 | read: boolean[];
18 | state: boolean[];
19 | };
20 | private isLocked: boolean;
21 | private readonly target: HTMLElement;
22 | private speed: number;
23 |
24 | constructor(target: HTMLElement) {
25 | super();
26 | this.desktop = {
27 | isLocked: false,
28 | isRunning: false,
29 | look: new Vector2(),
30 | movement: new Vector3(),
31 | };
32 | this.gamepad = {
33 | index: -1,
34 | read: [],
35 | state: [],
36 | };
37 | this.isLocked = false;
38 | this.target = target;
39 | this.speed = 1000;
40 | window.addEventListener('gamepadconnected', this.gamepadconnected.bind(this));
41 | window.addEventListener('gamepaddisconnected', this.gamepaddisconnected.bind(this));
42 | target.addEventListener('pointerdown', this.pointerdown.bind(this));
43 | document.addEventListener('pointermove', this.pointermove.bind(this));
44 | document.addEventListener('keydown', this.keydown.bind(this));
45 | document.addEventListener('keyup', this.keyup.bind(this));
46 | document.addEventListener('pointerlockchange', this.pointerlock.bind(this));
47 | document.addEventListener('wheel', this.wheel.bind(this));
48 | }
49 |
50 | getLook(look: Vector2, delta: number) {
51 | const { desktop, gamepad } = this;
52 | look.set(0, 0);
53 | if (desktop.isLocked) {
54 | look.copy(desktop.look).multiplyScalar(0.003);
55 | desktop.look.set(0, 0);
56 | }
57 | if (gamepad.index !== -1) {
58 | const { axes } = navigator.getGamepads()[gamepad.index]!;
59 | if (Math.max(Math.abs(axes[2]), Math.abs(axes[3])) > 0.1) {
60 | look.set(-axes[2], axes[3]).multiplyScalar(delta * 1.5);
61 | this.setLock(true);
62 | }
63 | }
64 | }
65 |
66 | private static readonly _movement = new Vector3();
67 | private static readonly _forward = new Vector3();
68 | private static readonly _right = new Vector3();
69 | private static readonly _worldUp = new Vector3(0, 1, 0);
70 |
71 | getMovement(camera: PerspectiveCamera, movement: Vector3) {
72 | const { desktop, gamepad } = this;
73 | const { _movement, _forward, _right, _worldUp } = Input;
74 | _movement.set(0, 0, 0);
75 | if (desktop.isLocked) {
76 | _movement.copy(desktop.movement);
77 | }
78 | if (gamepad.index !== -1) {
79 | const { axes, buttons } = navigator.getGamepads()[gamepad.index]!;
80 | [0, 3, 4, 5, 6, 7, 10].forEach((button) => {
81 | const pressed = buttons[button]?.pressed;
82 | if (gamepad.read[button] !== pressed) {
83 | gamepad.read[button] = pressed;
84 | gamepad.state[button] = pressed;
85 | // @hack
86 | if (pressed && (button === 3 || button === 6 || button === 7)) {
87 | this.dispatchEvent({ type: 'button', button: { 7: 1, 6: 2, 3: 4 }[button] });
88 | }
89 | }
90 | });
91 | if (Math.max(Math.abs(axes[0]), Math.abs(axes[1])) > 0.1 || gamepad.state[0]) {
92 | _movement.set(
93 | axes[0],
94 | gamepad.state[0] ? 1 : 0,
95 | -axes[1]
96 | );
97 | this.setLock(true);
98 | }
99 | }
100 | camera.getWorldDirection(_forward);
101 | _forward.normalize();
102 | _right.crossVectors(_forward, _worldUp).normalize();
103 | movement
104 | .set(0, 0, 0)
105 | .addScaledVector(_right, _movement.x)
106 | .addScaledVector(_worldUp, _movement.y)
107 | .addScaledVector(_forward, _movement.z);
108 | const length = movement.length();
109 | if (length > 1) {
110 | movement.divideScalar(length);
111 | }
112 | }
113 |
114 | getRunning() {
115 | const { desktop, gamepad } = this;
116 | return desktop.isRunning || (gamepad.index !== -1 && gamepad.state[10]);
117 | }
118 |
119 | private static readonly minSpeed = Math.log(100);
120 | private static readonly maxSpeed = Math.log(5000);
121 | private static readonly speedRange = Input.maxSpeed - Input.minSpeed;
122 | getSpeed() {
123 | return this.speed;
124 | }
125 |
126 | private gamepadconnected({ gamepad: { index } }: GamepadEvent) {
127 | const { gamepad } = this;
128 | gamepad.index = index;
129 | }
130 |
131 | private gamepaddisconnected({ gamepad: { index } }: GamepadEvent) {
132 | const { gamepad } = this;
133 | if (gamepad.index === index) {
134 | gamepad.index = -1;
135 | gamepad.read.length = 0;
136 | gamepad.state.length = 0;
137 | this.setLock(false);
138 | }
139 | }
140 |
141 | private keydown({ code, repeat }: KeyboardEvent) {
142 | const { desktop } = this;
143 | if (!desktop.isLocked || repeat) {
144 | return;
145 | }
146 | switch (code) {
147 | case 'KeyW':
148 | desktop.movement.z = 1;
149 | break;
150 | case 'KeyS':
151 | desktop.movement.z = -1;
152 | break;
153 | case 'KeyA':
154 | desktop.movement.x = -1;
155 | break;
156 | case 'KeyD':
157 | desktop.movement.x = 1;
158 | break;
159 | case 'Space':
160 | desktop.movement.y = 1;
161 | break;
162 | case 'ShiftLeft':
163 | case 'ShiftRight':
164 | desktop.isRunning = true;
165 | break;
166 | default:
167 | break;
168 | }
169 | }
170 |
171 | private keyup({ code }: KeyboardEvent) {
172 | const { desktop } = this;
173 | if (!desktop.isLocked) {
174 | return;
175 | }
176 | switch (code) {
177 | case 'KeyW':
178 | if (desktop.movement.z > 0) desktop.movement.z = 0;
179 | break;
180 | case 'KeyS':
181 | if (desktop.movement.z < 0) desktop.movement.z = 0;
182 | break;
183 | case 'KeyA':
184 | if (desktop.movement.x < 0) desktop.movement.x = 0;
185 | break;
186 | case 'KeyD':
187 | if (desktop.movement.x > 0) desktop.movement.x = 0;
188 | break;
189 | case 'Space':
190 | desktop.movement.y = 0;
191 | break;
192 | case 'ShiftLeft':
193 | case 'ShiftRight':
194 | desktop.isRunning = false;
195 | break;
196 | default:
197 | break;
198 | }
199 | }
200 |
201 | private pointerlock() {
202 | const { desktop } = this;
203 | desktop.isLocked = !!document.pointerLockElement;
204 | desktop.isRunning = false;
205 | desktop.look.set(0, 0);
206 | desktop.movement.set(0, 0, 0);
207 | this.setLock(desktop.isLocked);
208 | }
209 |
210 | private pointerdown(e: PointerEvent) {
211 | const { desktop, target } = this;
212 | if (!desktop.isLocked) {
213 | target.requestPointerLock();
214 | return;
215 | }
216 | this.dispatchEvent({ type: 'button', button: e.buttons });
217 | }
218 |
219 | private pointermove(e: PointerEvent) {
220 | const { desktop } = this;
221 | if (!desktop.isLocked) {
222 | this.setLock(false);
223 | return;
224 | }
225 | desktop.look.x -= e.movementX;
226 | desktop.look.y -= e.movementY;
227 | }
228 |
229 | private wheel({ deltaY }: WheelEvent) {
230 | const { speed, isLocked } = this;
231 | if (!isLocked) {
232 | return;
233 | }
234 | const { minSpeed, speedRange } = Input;
235 | const logSpeed = Math.min(
236 | Math.max(
237 | ((Math.log(speed) - minSpeed) / speedRange) - (-deltaY * 0.0003),
238 | 0
239 | ),
240 | 1
241 | );
242 | this.speed = Math.exp(minSpeed + logSpeed * speedRange);
243 | }
244 |
245 | private setLock(locked: boolean) {
246 | if (this.isLocked === locked) {
247 | return;
248 | }
249 | this.isLocked = locked;
250 | document.body.classList[locked ? 'add' : 'remove']('inputlock');
251 | }
252 | }
253 |
--------------------------------------------------------------------------------
/src/core/Viewport.ts:
--------------------------------------------------------------------------------
1 | import {
2 | Clock,
3 | PerspectiveCamera,
4 | ShaderChunk,
5 | Scene,
6 | WebGLRenderer,
7 | } from 'three';
8 |
9 | ShaderChunk.fog_pars_vertex = /* glsl */`
10 | #ifdef USE_FOG
11 | varying vec3 vFogPosition;
12 | #endif
13 | `;
14 | ShaderChunk.fog_pars_fragment = /* glsl */`
15 | #ifdef USE_FOG
16 | uniform vec3 fogColor;
17 | varying vec3 vFogPosition;
18 | #ifdef FOG_EXP2
19 | uniform float fogDensity;
20 | #else
21 | uniform float fogNear;
22 | uniform float fogFar;
23 | #endif
24 | #endif
25 | `;
26 | ShaderChunk.fog_vertex = /* glsl */`
27 | #ifdef USE_FOG
28 | vFogPosition = mvPosition.xyz;
29 | #endif
30 | `;
31 | ShaderChunk.fog_fragment = /* glsl */`
32 | #ifdef USE_FOG
33 | float vFogDepth = length(vFogPosition);
34 | #ifdef FOG_EXP2
35 | float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );
36 | #else
37 | float fogFactor = smoothstep( fogNear, fogFar, vFogDepth );
38 | #endif
39 | gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );
40 | #endif
41 | `;
42 |
43 | export const camera = new PerspectiveCamera(75, 1, 1, 100000);
44 | camera.rotation.order = 'YXZ';
45 | export const clock = new Clock();
46 | export const renderer = new WebGLRenderer({ antialias: true });
47 | export const scene = new Scene();
48 |
49 | const resize = () => {
50 | const { innerWidth: width, innerHeight: height } = window;
51 | const aspect = width / height;
52 | camera.aspect = aspect;
53 | camera.updateProjectionMatrix();
54 | renderer.setSize(width, height);
55 | };
56 | resize();
57 | window.addEventListener('resize', resize);
58 | document.addEventListener('visibilitychange', () => (
59 | document.visibilityState === 'visible' && clock.start()
60 | ));
61 |
62 | export const dom = document.getElementById('viewport')!;
63 | dom.appendChild(renderer.domElement);
64 |
65 | const prevent = (e: Event) => e.preventDefault();
66 | window.addEventListener('contextmenu', prevent);
67 | window.addEventListener('keydown', (e) => (
68 | e.key === ' '
69 | && !['input', 'textarea', 'select'].includes((e.target as HTMLElement).tagName.toLowerCase())
70 | && prevent(e)
71 | ));
72 | window.addEventListener('touchstart', prevent, { passive: false });
73 | window.addEventListener('wheel', (e) => e.ctrlKey && prevent(e), { passive: false });
74 |
--------------------------------------------------------------------------------
/src/main.css:
--------------------------------------------------------------------------------
1 | :root {
2 | font-size: 16px;
3 | }
4 |
5 | body {
6 | margin: 0;
7 | background: #1a1a1a;
8 | color: #eee;
9 | cursor: default;
10 | font-family: monospace;
11 | font-size: 0.75rem;
12 | font-weight: 400;
13 | font-style: normal;
14 | line-height: 1.125rem;
15 | touch-action: none;
16 | overflow: hidden;
17 | overscroll-behavior: none;
18 | user-select: none;
19 | -webkit-tap-highlight-color: transparent;
20 | -webkit-text-size-adjust: none;
21 | -webkit-touch-callout: none;
22 | -webkit-user-select: none;
23 | -webkit-overflow-scrolling: auto;
24 | }
25 |
26 | :root, body, #viewport {
27 | width: 100%;
28 | height: 100%;
29 | }
30 |
31 | a {
32 | color: inherit;
33 | }
34 |
35 | #info {
36 | position: absolute;
37 | bottom: 1rem;
38 | right: 1rem;
39 | text-align: right;
40 | }
41 |
42 | #loading {
43 | position: absolute;
44 | bottom: 50%;
45 | left: 50%;
46 | transform: translate(-50%, -50%);
47 | text-align: center;
48 | }
49 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import './main.css';
2 | import {
3 | Color,
4 | FogExp2,
5 | Vector2,
6 | Vector3,
7 | } from 'three';
8 | import { Input } from 'core/Input';
9 | import { camera, clock, dom, renderer, scene } from 'core/Viewport';
10 | import BuildingsData from '../data/data.bin?no-inline';
11 | import { Buildings as BuildingsProtocol } from '../data/protocol.js';
12 | import { Buildings } from 'meshes/Buildings';
13 | import { Grid } from 'meshes/Grid';
14 | import { Starfield } from 'meshes/Starfield';
15 |
16 | camera.position.set(0, 1000, 0);
17 | camera.lookAt(0, 0, -5000);
18 |
19 | scene.background = new Color('#001133');
20 | scene.fog = new FogExp2(0x001133, 0.00005);
21 |
22 | const grid = new Grid();
23 | scene.add(grid);
24 | const starfield = new Starfield();
25 | scene.add(starfield);
26 |
27 | const input = new Input(dom);
28 | const look = new Vector2();
29 | const movement = new Vector3();
30 |
31 | renderer.setAnimationLoop(() => {
32 | const delta = Math.min(clock.getDelta(), 0.2);
33 | Buildings.setTime(clock.oldTime / 1000);
34 | input.getLook(look, delta);
35 | if (look.x !== 0 || look.y !== 0) {
36 | camera.rotation.y += look.x;
37 | camera.rotation.x += look.y;
38 | camera.rotation.x = Math.min(Math.max(camera.rotation.x, Math.PI * -0.5), Math.PI * 0.5);
39 | camera.updateMatrixWorld();
40 | }
41 | input.getMovement(camera, movement);
42 | const step = input.getSpeed() * (input.getRunning() ? 2 : 1) * delta;
43 | camera.position.addScaledVector(movement, step);
44 | camera.position.y = Math.max(camera.position.y, 1);
45 | grid.position.set(
46 | camera.position.x,
47 | 0,
48 | camera.position.z
49 | );
50 | starfield.position.copy(grid.position);
51 | renderer.render(scene, camera);
52 | });
53 |
54 | fetch(BuildingsData).then((res) => res.arrayBuffer()).then((buf) => {
55 | const data = BuildingsProtocol.decode(new Uint8Array(buf));
56 | scene.add(new Buildings(data.buildings));
57 | document.body.removeChild(document.getElementById('loading')!);
58 | });
59 |
--------------------------------------------------------------------------------
/src/meshes/Buildings.ts:
--------------------------------------------------------------------------------
1 | import {
2 | BufferGeometry,
3 | BufferAttribute,
4 | Color,
5 | DataTexture,
6 | FloatType,
7 | InstancedBufferAttribute,
8 | InstancedBufferGeometry,
9 | Mesh,
10 | MeshBasicMaterial,
11 | PlaneGeometry,
12 | RedFormat,
13 | RepeatWrapping,
14 | } from 'three';
15 | import { SimplexNoise } from 'three/examples/jsm/math/SimplexNoise.js';
16 | import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js';
17 | import { type IBuilding } from '../../data/protocol.js';
18 |
19 | export class Buildings extends Mesh {
20 | private static geometry?: BufferGeometry;
21 |
22 | private static getGeometry() {
23 | if (!Buildings.geometry) {
24 | const geometries: BufferGeometry[] = [];
25 | const plane = new PlaneGeometry(1, 1, 1, 1);
26 | plane.setAttribute('face', new BufferAttribute(new Int32Array(plane.getAttribute('position').count), 1));
27 | const addFace = (x: number, y: number, z: number, rotationY?: number, rotationX?: number, zeroUV?: boolean) => {
28 | const index = geometries.length;
29 | const geometry = plane.clone();
30 | const face = geometry.getAttribute('face');
31 | const uv = geometry.getAttribute('uv');
32 | for (let i = 0, l = geometry.getAttribute('position')!.count; i < l; i++) {
33 | face.setX(i, index);
34 | if (zeroUV) {
35 | uv.setXY(i, 0, 0);
36 | }
37 | }
38 | if (rotationY) {
39 | geometry.rotateY(rotationY);
40 | }
41 | if (rotationX) {
42 | geometry.rotateX(rotationX);
43 | }
44 | geometry.translate(x, y, z);
45 | geometries.push(geometry);
46 | };
47 | addFace(0.5, 0.5, 0, Math.PI * 0.5);
48 | addFace(-0.5, 0.5, 0, Math.PI * -0.5);
49 | addFace(0, 0.5, 0.5);
50 | addFace(0, 0.5, -0.5, Math.PI);
51 | addFace(0, 1.0, 0, 0, Math.PI * -0.5, true);
52 | Buildings.geometry = mergeGeometries(geometries);
53 | }
54 | return Buildings.geometry;
55 | }
56 |
57 | private static material?: MeshBasicMaterial;
58 |
59 | private static getMaterial() {
60 | if (!Buildings.material) {
61 | const material = new MeshBasicMaterial({ vertexColors: true });
62 | material.onBeforeCompile = (parameters) => {
63 | parameters.defines = {
64 | FLOOR_WIDTH: '5.0',
65 | FLOOR_HEIGHT: '10.0',
66 | };
67 | parameters.uniforms.noise = {
68 | value: (() => {
69 | const size = 256;
70 | const data = new Float32Array(size * size);
71 | for (let i = 0; i < size * size; i++) {
72 | data[i] = Math.random();
73 | }
74 | const texture = new DataTexture(data, size, size, RedFormat, FloatType);
75 | texture.needsUpdate = true;
76 | texture.wrapS = texture.wrapT = RepeatWrapping;
77 | return texture;
78 | })(),
79 | };
80 | parameters.uniforms.time = Buildings.time;
81 | parameters.vertexShader = parameters.vertexShader
82 | .replace('#include ',
83 | /* glsl */ `
84 | #include
85 | attribute int face;
86 | attribute vec2 offset;
87 | attribute vec3 scale;
88 | attribute float rotation;
89 | flat varying int vId;
90 | varying vec2 vUv;
91 | mat3 rotateY(float angle) {
92 | float s = sin(angle);
93 | float c = cos(angle);
94 | return mat3(
95 | c, 0.0, -s,
96 | 0.0, 1.0, 0.0,
97 | s, 0.0, c
98 | );
99 | }
100 | `
101 | )
102 | .replace('#include ',
103 | /* glsl */ `
104 | vec3 transformed = vec3(rotateY(rotation) * (position * scale) + vec3(offset.x, 0.0, offset.y));
105 | vId = gl_InstanceID;
106 | `
107 | )
108 | .replace('#include ',
109 | /* glsl */ `
110 | vec2 uvScale = vec2(face == 0 || face == 1 ? scale.z : scale.x, scale.y);
111 | vec2 floorSize = vec2(FLOOR_WIDTH + mod(float(gl_InstanceID), 5.0), FLOOR_HEIGHT);
112 | uvScale -= mod(uvScale, floorSize);
113 | uvScale = max(uvScale, floorSize * vec2(1.0, 3.0));
114 | vUv = uv * uvScale / floorSize;
115 | `
116 | );
117 | parameters.fragmentShader = parameters.fragmentShader
118 | .replace('#include ',
119 | /* glsl */ `
120 | #include
121 | flat varying int vId;
122 | varying vec2 vUv;
123 | uniform sampler2D noise;
124 | uniform float time;
125 | `
126 | )
127 | .replace('#include ',
128 | /* glsl */ `
129 | #include
130 | float light = 0.2;
131 | bool isFirstFloor = vUv.y < 1.0;
132 | if (isFirstFloor) {
133 | light = 0.1 * max(vUv.y, 0.2);
134 | } else {
135 | vec2 uv = vec2(mod(vUv.x, 1.0), mod(vUv.y, 1.0));
136 | bool isWindow = uv.x > 0.2 && uv.x < 0.8 && uv.y > 0.45 && uv.y < 0.55;
137 | bool isCornice = uv.y < 0.25 || uv.y > 0.75;
138 | if (isCornice) {
139 | light = 0.1;
140 | } else if (isWindow) {
141 | vec2 id = vec2(floor(vUv.x + float(vId)) + 0.5, floor(vUv.y) + 0.5);
142 | light = 0.5 + sin(time + texture(noise, id / vec2(256.0)).r * 10.0) * 0.4;
143 | }
144 | }
145 | diffuseColor *= light;
146 | `
147 | );
148 | };
149 | Buildings.material = material;
150 | }
151 | return Buildings.material;
152 | }
153 |
154 | private static readonly time = { value: 0 };
155 |
156 | static setTime(value: number) {
157 | Buildings.time.value = value;
158 | }
159 |
160 | constructor(data: IBuilding[]) {
161 | const building = Buildings.getGeometry();
162 | const geometry = new InstancedBufferGeometry();
163 | geometry.setAttribute('position', building.getAttribute('position'));
164 | geometry.setAttribute('normal', building.getAttribute('normal'));
165 | geometry.setAttribute('uv', building.getAttribute('uv'));
166 | geometry.setAttribute('face', building.getAttribute('face'));
167 | geometry.setIndex(building.getIndex());
168 | geometry.instanceCount = data.length;
169 | const color = new Color();
170 | const simplex = new SimplexNoise();
171 | const colors = new Float32Array(geometry.instanceCount * 3);
172 | const offsets = new Float32Array(geometry.instanceCount * 2);
173 | const scales = new Float32Array(geometry.instanceCount * 3);
174 | const rotations = new Float32Array(geometry.instanceCount);
175 | data.forEach(({ position, scale, rotation }, i) => {
176 | color.setHSL(
177 | 0.5 + (simplex.noise(position!.y!, position!.x!) / 3),
178 | 0.5 + (simplex.noise(position!.x!, position!.y!) / 3),
179 | 0.5 + (simplex.noise(-position!.y!, position!.x!) / 3),
180 | );
181 | colors[i * 3] = color.r;
182 | colors[i * 3 + 1] = color.g;
183 | colors[i * 3 + 2] = color.b;
184 | offsets[i * 2] = position!.x!;
185 | offsets[i * 2 + 1] = position!.y!;
186 | scales[i * 3] = scale!.x!;
187 | scales[i * 3 + 1] = scale!.y!;
188 | scales[i * 3 + 2] = scale!.z!;
189 | rotations[i] = rotation!;
190 | });
191 | geometry.setAttribute('color', new InstancedBufferAttribute(colors, 3));
192 | geometry.setAttribute('offset', new InstancedBufferAttribute(offsets, 2));
193 | geometry.setAttribute('scale', new InstancedBufferAttribute(scales, 3));
194 | geometry.setAttribute('rotation', new InstancedBufferAttribute(rotations, 1));
195 | super(geometry, Buildings.getMaterial());
196 | this.frustumCulled = false;
197 | this.matrixAutoUpdate = false;
198 | }
199 | }
200 |
--------------------------------------------------------------------------------
/src/meshes/Grid.ts:
--------------------------------------------------------------------------------
1 | import {
2 | BufferGeometry,
3 | Color,
4 | Mesh,
5 | MeshBasicMaterial,
6 | PlaneGeometry,
7 | } from 'three';
8 |
9 | export class Grid extends Mesh {
10 | private static geometry?: BufferGeometry;
11 |
12 | private static getGeometry() {
13 | if (!Grid.geometry) {
14 | const geometry = new PlaneGeometry(100000, 100000, 1, 1);
15 | geometry.rotateX(Math.PI * -0.5);
16 | geometry.computeBoundingSphere();
17 | Grid.geometry = geometry;
18 | }
19 | return Grid.geometry;
20 | }
21 |
22 | private static material?: MeshBasicMaterial;
23 |
24 | private static getMaterial() {
25 | if (!Grid.material) {
26 | const material = new MeshBasicMaterial({ transparent: true });
27 | material.customProgramCacheKey = () => 'grid';
28 | material.onBeforeCompile = (parameters) => {
29 | parameters.uniforms.color = { value: new Color('#351645') };
30 | parameters.vertexShader = parameters.vertexShader
31 | .replace(
32 | '#include ',
33 | /* glsl */`
34 | #include
35 | varying vec2 gridPos;
36 | `
37 | )
38 | .replace(
39 | '#include ',
40 | /* glsl */`
41 | vec4 worldPosition = vec4(transformed, 1.0);
42 | worldPosition = modelMatrix * worldPosition;
43 | gridPos = worldPosition.xz * 0.01;
44 | `
45 | );
46 | parameters.fragmentShader = parameters.fragmentShader
47 | .replace(
48 | '#include ',
49 | /* glsl */`
50 | #include
51 | varying vec2 gridPos;
52 | uniform vec3 color;
53 | float line(vec2 position) {
54 | vec2 coord = abs(fract(position - 0.5) - 0.5) / fwidth(position);
55 | return 1.0 - min(min(coord.x, coord.y), 1.0);
56 | }
57 | `
58 | )
59 | .replace(
60 | '#include ',
61 | /* glsl */`
62 | #include
63 | diffuseColor.rgb *= color * line(gridPos);
64 | `
65 | )
66 | .replace(
67 | '#include ',
68 | /* glsl */`
69 | float fDepth = length(vFogPosition);
70 | float fDensity = fogDensity * 2.0;
71 | float fFactor = 1.0 - exp( - fDensity * fDensity * fDepth * fDepth );
72 | gl_FragColor.rgb = mix( gl_FragColor.rgb, vec3(0.0), fFactor );
73 | #include
74 | `
75 | );
76 | };
77 | Grid.material = material;
78 | }
79 | return Grid.material;
80 | }
81 |
82 | constructor() {
83 | super(Grid.getGeometry(), Grid.getMaterial());
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/src/meshes/Starfield.ts:
--------------------------------------------------------------------------------
1 | import {
2 | BufferGeometry,
3 | Points,
4 | PointsMaterial,
5 | BufferAttribute,
6 | Vector3,
7 | } from 'three';
8 |
9 | export class Starfield extends Points {
10 | private static readonly count = 10000;
11 | private static readonly radius = 100000;
12 |
13 | private static geometry?: BufferGeometry;
14 |
15 | static getGeometry() {
16 | if (!Starfield.geometry) {
17 | const { count, radius } = Starfield;
18 | const position = new Float32Array(count * 3);
19 | const color = new Float32Array(count * 3);
20 | const aux = new Vector3();
21 | for (let i = 0; i < count; i += 1) {
22 | aux
23 | .set(
24 | Math.random() * 2 - 1,
25 | Math.random() * 1.25 - 0.625,
26 | Math.random() * 2 - 1,
27 | )
28 | .normalize()
29 | .multiplyScalar(radius * (0.75 + Math.random() * 0.25));
30 | position.set([
31 | aux.x,
32 | aux.y,
33 | aux.z,
34 | ], i * 3);
35 | color.set([
36 | 0.5 + Math.random() * 0.5,
37 | 0.5 + Math.random() * 0.5,
38 | 0.5 + Math.random() * 0.5
39 | ], i * 3);
40 | }
41 | const geometry = new BufferGeometry();
42 | geometry.setAttribute('position', new BufferAttribute(position, 3));
43 | geometry.setAttribute('color', new BufferAttribute(color, 3));
44 | Starfield.geometry = geometry;
45 | }
46 | return Starfield.geometry;
47 | }
48 |
49 | private static material?: PointsMaterial;
50 |
51 | static getMaterial() {
52 | if (!Starfield.material) {
53 | Starfield.material = new PointsMaterial({
54 | vertexColors: true,
55 | fog: false,
56 | });
57 | }
58 | return Starfield.material;
59 | }
60 |
61 | constructor() {
62 | super(Starfield.getGeometry(), Starfield.getMaterial());
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "baseUrl": "./src",
4 | "esModuleInterop": true,
5 | "module": "esnext",
6 | "moduleResolution": "bundler",
7 | "noFallthroughCasesInSwitch": true,
8 | "noImplicitReturns": true,
9 | "noImplicitOverride": true,
10 | "noUnusedLocals": true,
11 | "noUnusedParameters": true,
12 | "skipLibCheck": true,
13 | "sourceMap": true,
14 | "strict": true,
15 | "target": "esnext",
16 | "verbatimModuleSyntax": true
17 | },
18 | "exclude": ["dist", "node_modules"],
19 | "include": ["src"]
20 | }
21 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import fs from 'fs';
2 | import path from 'path';
3 | import { defineConfig } from 'vite';
4 |
5 | export default defineConfig(({ mode }) => ({
6 | assetsInclude: ['**/*.bin'],
7 | esbuild: mode === 'production' ? {
8 | drop: ['console', 'debugger'],
9 | legalComments: 'none',
10 | } : {},
11 | resolve: {
12 | alias: fs.readdirSync(path.join(__dirname, 'src'), { withFileTypes: true })
13 | .filter((f) => f.isDirectory())
14 | .map(({ name }) => (
15 | { find: name, replacement: path.join(__dirname, 'src', name) }
16 | )),
17 | },
18 | server: {
19 | port: 8080,
20 | },
21 | }));
22 |
--------------------------------------------------------------------------------