From 2abab2afca9e639023c04f9bcbf544fbe664529e Mon Sep 17 00:00:00 2001 From: Pedro Camargo Date: Mon, 5 Jan 2026 07:39:52 +1000 Subject: [PATCH] . --- package-lock.json | 1185 +++++++++++++++++----- src/dash-panels/_allPanels.ts | 1 + src/dash-panels/polaris.vue | 49 + src/plugins/pluginRegistry.ts | 5 + src/plugins/polaris/PolarisFileSystem.ts | 81 ++ src/plugins/polaris/PolarisReader.vue | 315 ++++++ src/plugins/polaris/db.ts | 255 +++++ src/plugins/polaris/i18n.ts | 20 + src/plugins/polaris/reader.scss | 89 ++ src/plugins/polaris/styling.ts | 386 +++++++ src/plugins/polaris/types.ts | 282 +++++ src/plugins/polaris/usePolaris.ts | 378 +++++++ 12 files changed, 2816 insertions(+), 230 deletions(-) create mode 100644 src/dash-panels/polaris.vue create mode 100644 src/plugins/polaris/PolarisFileSystem.ts create mode 100644 src/plugins/polaris/PolarisReader.vue create mode 100644 src/plugins/polaris/db.ts create mode 100644 src/plugins/polaris/i18n.ts create mode 100644 src/plugins/polaris/reader.scss create mode 100644 src/plugins/polaris/styling.ts create mode 100644 src/plugins/polaris/types.ts create mode 100644 src/plugins/polaris/usePolaris.ts diff --git a/package-lock.json b/package-lock.json index cea1fbefe..a117ef911 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "blob-util": "^2.0.2", "buefy": "^0.9.29", "bulma": "^1.0.0", + "cartocolor": "^5.0.2", "color-string": "^1.9.1", "colormap": "^2.3.1", "comlink": "^4.4.2", @@ -94,6 +95,10 @@ "sax-wasm": "^2.2.4", "shallow-equal": "^1.2.1", "shapefile": "^0.6.6", + "spatialite": "^0.1.0", + "spl.js": "^0.1.2", + "sql.js": "^1.13.0", + "sqlite3": "^5.1.7", "the-new-css-reset": "^1.7.3", "threads": "^1.7.0", "three": "^0.127.0", @@ -203,7 +208,6 @@ "resolved": "https://registry.npmjs.org/@arcgis/components-utils/-/components-utils-4.33.19.tgz", "integrity": "sha512-2sCqezifODgQoSZY2C67NJWLrgvAtb4fKX4hBmrmgRoJBsOSlpDApsr9ZfEgk8gubIBrUGY+LuZkgd2uTJXSiA==", "license": "SEE LICENSE IN LICENSE.md", - "peer": true, "dependencies": { "tslib": "^2.8.1" } @@ -228,7 +232,6 @@ "resolved": "https://registry.npmjs.org/@arcgis/lumina/-/lumina-4.33.19.tgz", "integrity": "sha512-voo6TH7WgO6djuJgfwoW5RWkClvw1JLs/TN+mjCDxdpKf+M8pbM88fqoPzFI41BBknSeYoeJGAi+r52fAiGHgw==", "license": "SEE LICENSE IN LICENSE.md", - "peer": true, "dependencies": { "@arcgis/components-utils": "4.33.19", "@lit-labs/ssr": "^3.2.2", @@ -578,7 +581,6 @@ "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" @@ -1846,6 +1848,7 @@ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" @@ -2093,6 +2096,7 @@ "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.1.14.tgz", "integrity": "sha512-EEciz1/SL1bdf/lm+DRy9Arno81vLWc9frcz2w/ZFdIKxVfcJmAFtyKeo2BJdjR9aspNxpOW+RJdl3/tK/ICYw==", "license": "MIT", + "peer": true, "dependencies": { "@luma.gl/constants": "~9.1.9", "@luma.gl/shadertools": "~9.1.9", @@ -2190,6 +2194,7 @@ "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.1.14.tgz", "integrity": "sha512-tXakSSvi5g+EvxSsnnjoRO8z3XxHxISTRzzIqcs3AZuWHnDptK28y9iD0Da21ILop1IYLaWE1QTUe6IAdp/Wag==", "license": "MIT", + "peer": true, "dependencies": { "@loaders.gl/core": "^4.2.0", "@loaders.gl/images": "^4.2.0", @@ -2215,6 +2220,7 @@ "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.1.14.tgz", "integrity": "sha512-uPm9Ye/XD8YAYNxT1G6HxyIOBxa2+MBdGLyqobQj3pCnkO/YtgY/fi/BjM+eVOBXX+keBrXEclEvB0Add5eS8Q==", "license": "MIT", + "peer": true, "dependencies": { "@luma.gl/constants": "~9.1.9", "@luma.gl/shadertools": "~9.1.9", @@ -2231,6 +2237,7 @@ "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.1.14.tgz", "integrity": "sha512-vk/vssJl9mxvPH04EyUFVa+gHedJYo55KrNjUiQWPBgtMyVefF/5M2X09UPXSnL44cMat7ZgX5wR9HMMxAwo+Q==", "license": "MIT", + "peer": true, "dependencies": { "@loaders.gl/3d-tiles": "^4.2.0", "@loaders.gl/gis": "^4.2.0", @@ -2292,6 +2299,7 @@ "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.1.14.tgz", "integrity": "sha512-cCClyZxznzXLPJnH2er7ZJAnXYuEHH/0hcDoc5Lp3SNByx3ASNrZcizIBOCxO7132LHFN4cSeyz0JVP8p56TDg==", "license": "MIT", + "peer": true, "dependencies": { "@loaders.gl/images": "^4.2.0", "@loaders.gl/schema": "^4.2.0", @@ -2337,6 +2345,7 @@ "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.1.14.tgz", "integrity": "sha512-NVUw0yG4stJfrklWCGP9j8bNlf9YQc4PccMeNNIHNrU/Je6/Va6dJZg0RGtVkeaTY1Lk3A7wRzq8/M5Urfvuiw==", "license": "MIT", + "peer": true, "dependencies": { "@loaders.gl/gltf": "^4.2.0", "@luma.gl/gltf": "~9.1.9", @@ -2365,6 +2374,7 @@ "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.1.14.tgz", "integrity": "sha512-hEyvvrqxEr7ujqTyTbdm5VTwY4oMYKNsLyXKjxWerHCIyfT971UYyV4cbILqvYf+L8spE146NFqwx0jj1bBqWw==", "license": "MIT", + "peer": true, "dependencies": { "preact": "^10.17.0" }, @@ -2874,7 +2884,6 @@ "resolved": "https://registry.npmjs.org/@esri/arcgis-html-sanitizer/-/arcgis-html-sanitizer-4.1.0.tgz", "integrity": "sha512-einEveDJ/k1180NOp78PB/4Hje9eBy3dyOGLLtLn6bSkizpUfCwuYBIXOA7Y3F/k/BsTQXgKqUVwQ0eiscWMdA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "xss": "1.0.13" }, @@ -2887,7 +2896,6 @@ "resolved": "https://registry.npmjs.org/@esri/calcite-components/-/calcite-components-3.2.1.tgz", "integrity": "sha512-NRBW/bhT4sQM5RAZF7W8/VymaOLgIzaR6yTZFI270Ig4NiQ4DRexjdeo/SwDMBlswFtBw5iya+/h+fAur2+Hlg==", "license": "SEE LICENSE.md", - "peer": true, "dependencies": { "@arcgis/components-utils": "^4.33.0-next.121", "@arcgis/lumina": "^4.33.0-next.121", @@ -2911,7 +2919,6 @@ "resolved": "https://registry.npmjs.org/@esri/calcite-ui-icons/-/calcite-ui-icons-4.2.0.tgz", "integrity": "sha512-GS41gUt1tgnqG+U1a6yDRiKOHmuLST2uyOI7+cJ83JtLJ7CGduH9K6RERabTE2vRYbudaebI8jZgKNSNOHdGzw==", "license": "SEE LICENSE.md", - "peer": true, "bin": { "spriter": "bin/spriter.js" } @@ -2967,7 +2974,8 @@ "version": "0.2.10", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@flowmap.gl/data": { "version": "8.0.2", @@ -3014,6 +3022,7 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", + "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "6.7.2" }, @@ -3067,6 +3076,13 @@ "vue": "~2" } }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "license": "MIT", + "optional": true + }, "node_modules/@h5web/app": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/@h5web/app/-/app-14.0.1.tgz", @@ -3145,6 +3161,7 @@ "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.17.12.tgz", "integrity": "sha512-rjV/ZtCr69y+aWEOsAhBQzsxYyvZHUanYfo9eMXNp/dxTj3ZrRvK44DkIdSLV1xcPidq8p2YeU2oWP2czY+ZVA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.17.8", "@types/debounce": "^1.2.1", @@ -3207,17 +3224,6 @@ } } }, - "node_modules/@h5web/app/node_modules/@types/react": { - "version": "19.1.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", - "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "csstype": "^3.0.2" - } - }, "node_modules/@h5web/app/node_modules/scheduler": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", @@ -3231,7 +3237,8 @@ "version": "0.172.0", "resolved": "https://registry.npmjs.org/three/-/three-0.172.0.tgz", "integrity": "sha512-6HMgMlzU97MsV7D/tY8Va38b83kz8YJX+BefKjspMNAv0Vx6dxMogHOrnRl/sbMIs3BPUKijPqDqJ/+UwJbIow==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@h5web/app/node_modules/zustand": { "version": "5.0.3", @@ -3321,8 +3328,7 @@ "version": "1.10.27", "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.27.tgz", "integrity": "sha512-BUdv0cvs4H5ODuwft2Xp4eL8Vmi3LcihK42z0Ft/FbVJZoRioBsxH+LlsBdK4tAie7PqlKGy+1oyOncu1nQ6eA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@jest/expect-utils": { "version": "29.7.0", @@ -3385,7 +3391,6 @@ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -3407,7 +3412,6 @@ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -3449,7 +3453,6 @@ "resolved": "https://registry.npmjs.org/@lit-labs/ssr/-/ssr-3.3.1.tgz", "integrity": "sha512-JlF1PempxvzrGEpRFrF+Ki0MHzR3HA51SK8Zv0cFpW9p0bPW4k0FeCwrElCu371UEpXF7RcaE2wgYaE1az0XKg==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@lit-labs/ssr-client": "^1.1.7", "@lit-labs/ssr-dom-shim": "^1.3.0", @@ -3472,7 +3475,6 @@ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-client/-/ssr-client-1.1.7.tgz", "integrity": "sha512-VvqhY/iif3FHrlhkzEPsuX/7h/NqnfxLwVf0p8ghNIlKegRyRqgeaJevZ57s/u/LiFyKgqksRP5n+LmNvpxN+A==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@lit/reactive-element": "^2.0.4", "lit": "^3.1.2", @@ -3483,22 +3485,19 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.4.0.tgz", "integrity": "sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@lit-labs/ssr/node_modules/@types/node": { "version": "16.18.126", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@lit/context": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@lit/context/-/context-1.1.6.tgz", "integrity": "sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@lit/reactive-element": "^1.6.2 || ^2.1.0" } @@ -3508,7 +3507,6 @@ "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.1.tgz", "integrity": "sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.4.0" } @@ -3579,6 +3577,7 @@ "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-4.3.4.tgz", "integrity": "sha512-cG0C5fMZ1jyW6WCsf4LoHGvaIAJCEVA/ioqKoYRwoSfXkOf+17KupK1OUQyUCw5XoRn+oWA1FulJQOYlXnb9Gw==", "license": "MIT", + "peer": true, "dependencies": { "@loaders.gl/loader-utils": "4.3.4", "@loaders.gl/schema": "4.3.4", @@ -3855,6 +3854,7 @@ "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.1.9.tgz", "integrity": "sha512-1i9N7+I/UbFjx3axSMlc3/NufA+C2iBv/7mw51gRE/ypQPgvFmY/QqXBVZRe+nthF+OhlUMhO19TBndzYFTWhA==", "license": "MIT", + "peer": true, "dependencies": { "@math.gl/types": "^4.1.0", "@probe.gl/env": "^4.0.8", @@ -3868,6 +3868,7 @@ "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.1.9.tgz", "integrity": "sha512-n1GLK1sUMFkWxdb+aZYn6ZBFltFEMi7X+6ZPxn2pBsNT6oeF4AyvH5AyqhOpvHvUnCLDt3Zsf1UIfx3MI//YSw==", "license": "MIT", + "peer": true, "dependencies": { "@math.gl/core": "^4.1.0", "@math.gl/types": "^4.1.0", @@ -3900,6 +3901,7 @@ "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.1.9.tgz", "integrity": "sha512-Uqp2xfgIEunRMLXTeCJ4uEMlWcUGcYMZGJ8GAOrAeDzn4bMKVRKmZDC71vkuTctnaodM3UdrI9W6s1sJlrXsxw==", "license": "MIT", + "peer": true, "dependencies": { "@math.gl/core": "^4.1.0", "@math.gl/types": "^4.1.0", @@ -3914,6 +3916,7 @@ "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.1.9.tgz", "integrity": "sha512-jecHjhNSWkXH0v62rM6G5fIIkOmsrND27099iKgdutFvHIvd4QS4UzGWEEa9AEPlP0rTLqXkA6y6YL7f42ZkVg==", "license": "MIT", + "peer": true, "dependencies": { "@luma.gl/constants": "9.1.9", "@math.gl/types": "^4.1.0", @@ -4424,6 +4427,45 @@ "node": ">= 8" } }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@octokit/auth-token": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", @@ -4438,6 +4480,7 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -4583,15 +4626,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz", "integrity": "sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@parse5/tools": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@parse5/tools/-/tools-0.3.0.tgz", "integrity": "sha512-zxRyTHkqb7WQMV8kTNBKWb1BeOFUKXBXTBWuxg9H9hfvQB3IwP6Iw2U75Ia5eyRxPNltmY7E8YAlz6zWwUnjKg==", "license": "MIT", - "peer": true, "dependencies": { "parse5": "^7.0.0" } @@ -4766,7 +4807,6 @@ "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.5.2.tgz", "integrity": "sha512-fWwImY/UH4bb2534DVSaX+Azs2yKg8slkMBHOyGeU2kKx7Xmxp6Lee0jP8p6B3d7c1gFUPB2Z976dTUtX81pQA==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@webcomponents/shadycss": "^1.9.1" } @@ -9747,7 +9787,6 @@ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -9759,7 +9798,6 @@ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -10042,6 +10080,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.66.tgz", "integrity": "sha512-KPilYP4+25N2ki7vrB4adSR2ucAj95xJcGfKC09bsxcHT+QtB//K7i1FenPnbkLA0Xt9pRi1/RXC1wxFvL9Wtw==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "^0.16", @@ -10091,8 +10130,7 @@ "version": "1.15.8", "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.8.tgz", "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/source-list-map": { "version": "0.1.6", @@ -10318,6 +10356,7 @@ "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "4.33.0", "@typescript-eslint/types": "4.33.0", @@ -10436,7 +10475,6 @@ "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.7.12.tgz", "integrity": "sha512-y/wWMADMmcXmY9sJ/TF+xh+HP+nE4Jc61SpW/D98c5zrLnf4cFlqTJEl8YwLDv80HtG78ieyzMHhvw9Wv96sdQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", @@ -10449,7 +10487,6 @@ "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.7.12.tgz", "integrity": "sha512-9zERd1yc2FUhP3/NLdSITVg1QiRE9hiLbyIBRBEmkkuiU/zTRAAlDndFLeZKGDkIEtbLoz2Dcg5DoNNFnLA6qg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", @@ -10467,7 +10504,6 @@ "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.7.12.tgz", "integrity": "sha512-GuHHRxaQKW7p5RIZxAqGEhYCSqF4CLpxXB/IPY4IW+4G/SzoIe8EqyneNnUSoKMoAFkBp0+A6tlJoWR9uvLTnQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", @@ -10481,7 +10517,6 @@ "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.7.12.tgz", "integrity": "sha512-DNnFkhlShRLsZ6LJZq9VhtG+pexObp9sNkk22Lx3g9PyrpuEllTJwGw/jEUE9jyI8dsgkCHRVZ+krxE026NFsg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", @@ -10495,7 +10530,6 @@ "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.7.12.tgz", "integrity": "sha512-ks1NfM6o4XJcECETaXBrNCGtCL6nWj1yfLOAHycQ6h+P8dd1UO63ZuLEVl+Ii+kymS2xHmUgJx9EoNrPIqxdlw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", @@ -10515,7 +10549,6 @@ "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.7.12.tgz", "integrity": "sha512-8oLr69l22cAw2K+FNd3sCdhw+yWhU5Z1tlp8ZGUTTgyClvpe9pDIdZfBX4pQXnSx6QPNc3CrOaVZkx7n5WQqJg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", @@ -10530,7 +10563,6 @@ "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.7.12.tgz", "integrity": "sha512-1oc21Owe9nI/t41TsdVan4b9pa8AjZZl/3t9o6X9XL/E4dHpFcj3lezlHEg92TBNzHm+6DcVPo/kZP29iahWEg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", "@vaadin/component-base": "~24.7.12", @@ -10545,7 +10577,6 @@ "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.7.12.tgz", "integrity": "sha512-AjPoLJBUuOJfmnpJpWYDoTDpH3+cXX+YJso7Acm0Ec1PeFAc9PvwGZBLlQK64juvTzejMLVFWYaU4bhn2rXVLA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "lit": "^3.0.0" } @@ -10555,7 +10586,6 @@ "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.7.12.tgz", "integrity": "sha512-Zymu/9pAg9+FtWLBVpI1Hiev3SCc2mVLCqq7x17pSVD1Kp3Pcd/HIU3v1MivihUx1z7t9Kt0cNk84T9NDADjDw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", @@ -10573,15 +10603,13 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.7.tgz", "integrity": "sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@vaadin/vaadin-lumo-styles": { "version": "24.7.12", "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.7.12.tgz", "integrity": "sha512-KMpOEb5uB/JVBGF94pQb5mIbtb6/6tZ2QzfZ1II4/JpKsp7pgpySy5tZFoZrb8M8miOj01sAkSaH99N0DST8dA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", "@vaadin/component-base": "~24.7.12", @@ -10594,7 +10622,6 @@ "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.7.12.tgz", "integrity": "sha512-WXXA2I+tOt1yxHYn57Boc2fdyLD7kIj5jX8GQMVkBW9nHN9oRfKO8beurmE2Am6Tz/HEMBtybx9ysY1k39TwBQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", "@vaadin/component-base": "~24.7.12", @@ -10606,7 +10633,6 @@ "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.7.12.tgz", "integrity": "sha512-BkpnhYj3olUzNlgIhu518//tHJsoCBWabUmfdQCN8MTdT2AjkHDZNjoRy+dL1sbJyhl9EFCACXP+f8q1Qxawsw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "lit": "^3.0.0" @@ -10618,7 +10644,6 @@ "integrity": "sha512-8r4TNknD7OJQADe3VygeofFR7UNAXZ2/jjBFP5dgI8+2uMfnuGYgbuHivasKr9WSQ64sPej6m8rDoM1uSllXjQ==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@vaadin/vaadin-development-mode-detector": "^2.0.0" }, @@ -10665,6 +10690,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -10938,6 +10964,7 @@ "integrity": "sha512-h5mU9DZ/6u3LCB9xomJtorNG6awBNnk9VuCioGsp6UtFiM8amvS5FcsaC3dabdL9zO0z+Gq9vIEMb/5u9K6jGQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@volar/language-core": "2.4.23", "vscode-languageserver-protocol": "^3.17.5", @@ -11023,7 +11050,6 @@ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -11034,24 +11060,21 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", @@ -11059,7 +11082,6 @@ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -11071,8 +11093,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", @@ -11080,7 +11101,6 @@ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -11094,7 +11114,6 @@ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -11105,7 +11124,6 @@ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -11115,8 +11133,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", @@ -11124,7 +11141,6 @@ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -11142,7 +11158,6 @@ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -11157,7 +11172,6 @@ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -11171,7 +11185,6 @@ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -11187,7 +11200,6 @@ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -11197,24 +11209,21 @@ "version": "1.11.2", "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.11.2.tgz", "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", @@ -11228,7 +11237,6 @@ "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.73.tgz", "integrity": "sha512-I2UP8/rdQE5hTtVVL08B7P8XuwXiKuuMUPjNuFOVL/9b+8IsExR9S5jz2H58u0rJjU4M1BikLgqEMG8gZJZVBw==", "license": "BSD-3-Clause", - "peer": true, "engines": { "bun": ">=0.7.0", "deno": ">=1.0.0", @@ -11243,6 +11251,13 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC", + "optional": true + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -11266,6 +11281,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -11315,7 +11331,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "debug": "4" @@ -11324,6 +11340,33 @@ "node": ">= 6.0.0" } }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "optional": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -11347,7 +11390,6 @@ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -11366,7 +11408,6 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -11383,8 +11424,7 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ansi-colors": { "version": "4.1.3", @@ -11463,6 +11503,43 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -11894,7 +11971,6 @@ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "license": "MIT", - "optional": true, "dependencies": { "file-uri-to-path": "1.0.0" } @@ -11931,7 +12007,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -11987,6 +12063,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001737", "electron-to-chromium": "^1.5.211", @@ -12067,6 +12144,66 @@ "integrity": "sha512-Ffb6YGXDiZYX3cqvSbHWqQ8+LkX6tVoTcZuVB3lm93sbAVXlO0D6QlOTMnV6g18gILpAXqkG2z9hf9z4hCjz2g==", "license": "MIT" }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "optional": true + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -12262,8 +12399,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC", - "optional": true + "license": "ISC" }, "node_modules/chrome-trace-event": { "version": "1.0.4", @@ -12271,7 +12407,6 @@ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.0" } @@ -12304,6 +12439,16 @@ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -12344,7 +12489,6 @@ "resolved": "https://registry.npmjs.org/color/-/color-5.0.0.tgz", "integrity": "sha512-16BlyiuyLq3MLxpRWyOTiWsO3ii/eLQLJUQXBSNcxMBBSnyt1ee9YUdaozQp03ifwm5woztEZGDbk9RGVuCsdw==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^3.0.1", "color-string": "^2.0.0" @@ -12463,12 +12607,21 @@ "simple-swizzle": "^0.2.2" } }, - "node_modules/color/node_modules/color-convert": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.0.tgz", - "integrity": "sha512-TVoqAq8ZDIpK5lsQY874DDnu65CSsc9vzq0wLpNQ6UMBq81GSZocVazPiBbYGzngzBOIRahpkTzCLVe2at4MfA==", + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.0.tgz", + "integrity": "sha512-TVoqAq8ZDIpK5lsQY874DDnu65CSsc9vzq0wLpNQ6UMBq81GSZocVazPiBbYGzngzBOIRahpkTzCLVe2at4MfA==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12481,7 +12634,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.0.tgz", "integrity": "sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -12491,7 +12643,6 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.0.tgz", "integrity": "sha512-gNVoDzpaSwvftp6Y8nqk97FtZoXP9Yj7KGYB8yIXuv0JcfqbYihTrd1OU5iZW9btfXde4YAOCRySBHT7O910MA==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12575,7 +12726,6 @@ "resolved": "https://registry.npmjs.org/composed-offset-position/-/composed-offset-position-0.0.6.tgz", "integrity": "sha512-Q7dLompI6lUwd7LWyIcP66r4WcS9u7AL2h8HaeipiRfCRPLMWqRx8fYsjb4OHi6UQFifO7XtNC2IlEJ1ozIFxw==", "license": "MIT", - "peer": true, "peerDependencies": { "@floating-ui/utils": "^0.2.5" } @@ -12584,7 +12734,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/concat-stream": { @@ -12632,6 +12782,13 @@ "node": ">=0.8" } }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC", + "optional": true + }, "node_modules/constantinople": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", @@ -13029,8 +13186,7 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/core-assert": { "version": "0.2.1", @@ -13167,8 +13323,7 @@ "version": "0.0.10", "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cssom": { "version": "0.5.0", @@ -13501,6 +13656,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -13587,7 +13743,6 @@ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 12" } @@ -13705,8 +13860,7 @@ "version": "1.11.18", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dbf": { "version": "0.1.4", @@ -13828,7 +13982,6 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "license": "MIT", - "optional": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -13864,7 +14017,6 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", - "optional": true, "engines": { "node": ">=4.0.0" } @@ -13959,6 +14111,13 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT", + "optional": true + }, "node_modules/density-clustering": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/density-clustering/-/density-clustering-1.3.0.tgz", @@ -13992,7 +14151,6 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "license": "Apache-2.0", - "optional": true, "engines": { "node": ">=8" } @@ -14274,6 +14432,29 @@ "node": ">= 4" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -14288,7 +14469,6 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "license": "MIT", - "peer": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -14320,6 +14500,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/epsg-index": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/epsg-index/-/epsg-index-1.3.0.tgz", @@ -14329,6 +14519,13 @@ "node": ">=8" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT", + "optional": true + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -14466,8 +14663,7 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -14677,6 +14873,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -14851,6 +15048,7 @@ "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "eslint-utils": "^2.1.0", "natural-compare": "^1.4.0", @@ -15195,7 +15393,6 @@ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "license": "(MIT OR WTFPL)", - "optional": true, "engines": { "node": ">=6" } @@ -15279,8 +15476,7 @@ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.3", @@ -15388,7 +15584,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -15472,8 +15667,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/filesize": { "version": "10.1.6", @@ -15559,7 +15753,6 @@ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz", "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==", "license": "MIT", - "peer": true, "dependencies": { "tabbable": "^6.2.0" } @@ -15648,7 +15841,6 @@ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "license": "MIT", - "peer": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -15689,8 +15881,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/fs-extra": { "version": "10.1.0", @@ -15707,11 +15898,23 @@ "node": ">=12" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/fsevents": { @@ -15774,13 +15977,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -16086,8 +16309,7 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/gl-mat4": { "version": "1.2.0", @@ -16146,7 +16368,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -16181,8 +16403,7 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/global-prefix": { "version": "4.0.0", @@ -16732,6 +16953,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC", + "optional": true + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -16790,6 +17018,13 @@ "node": ">=12" } }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause", + "optional": true + }, "node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -16809,7 +17044,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "agent-base": "6", @@ -16819,6 +17054,16 @@ "node": ">= 6" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -16916,7 +17161,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -16926,18 +17171,25 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "license": "ISC", + "optional": true + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "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.", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -16954,7 +17206,6 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "devOptional": true, "license": "ISC" }, "node_modules/inquirer": { @@ -16987,7 +17238,6 @@ "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.10.27.tgz", "integrity": "sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==", "license": "MIT", - "peer": true, "dependencies": { "@interactjs/types": "1.10.27" } @@ -17022,6 +17272,16 @@ "integrity": "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==", "license": "MIT" }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/is-arguments": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", @@ -17348,6 +17608,13 @@ "node": ">=0.10.0" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "license": "MIT", + "optional": true + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -17642,7 +17909,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/iterator.prototype": { @@ -17782,7 +18049,6 @@ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -17798,7 +18064,6 @@ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -18015,7 +18280,6 @@ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "json5": "lib/cli.js" }, @@ -18253,7 +18517,6 @@ "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.1.tgz", "integrity": "sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@lit/reactive-element": "^2.1.0", "lit-element": "^4.2.0", @@ -18265,7 +18528,6 @@ "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.1.tgz", "integrity": "sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.4.0", "@lit/reactive-element": "^2.1.0", @@ -18277,7 +18539,6 @@ "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.1.tgz", "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@types/trusted-types": "^2.0.2" } @@ -18324,7 +18585,6 @@ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.11.5" } @@ -18383,8 +18643,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -18462,7 +18721,6 @@ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" } @@ -18480,6 +18738,79 @@ "integrity": "sha512-VKlnoJRFrB8SdJhlVKvW5vI1gGwcZ+mvChEXcSX6r2xDNc/Q2FD9esfBmGCuPZdrJ1feO+YcVFd2PTk0c137Gw==", "license": "BSD-2-Clause" }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "license": "ISC", + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "optional": true + }, "node_modules/map-limit": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", @@ -18522,7 +18853,6 @@ "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.3.tgz", "integrity": "sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==", "license": "SEE LICENSE IN LICENSE.txt", - "peer": true, "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/geojson-types": "^1.0.2", @@ -18555,50 +18885,43 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==", - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/mapbox-gl/node_modules/@mapbox/unitbezier": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==", - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/mapbox-gl/node_modules/geojson-vt": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/mapbox-gl/node_modules/kdbush": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/mapbox-gl/node_modules/potpack": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/mapbox-gl/node_modules/quickselect": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/mapbox-gl/node_modules/supercluster": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", "license": "ISC", - "peer": true, "dependencies": { "kdbush": "^3.0.0" } @@ -18607,8 +18930,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/maplibre-gl": { "version": "5.7.1", @@ -18709,7 +19031,6 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "license": "MIT", - "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -19000,8 +19321,7 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", @@ -19068,7 +19388,6 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "license": "MIT", - "optional": true, "engines": { "node": ">=10" }, @@ -19090,7 +19409,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -19123,18 +19442,136 @@ "node": ">= 6" } }, - "node_modules/mjolnir.js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-3.0.0.tgz", - "integrity": "sha512-siX3YCG7N2HnmN1xMH3cK4JkUZJhbkhRFJL+G5N1vH0mh1t5088rJknIoqDFWDIU6NPGvRRgLnYW3ZHjSMEBLA==", - "license": "MIT" + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", "license": "MIT", - "optional": true + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/mjolnir.js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-3.0.0.tgz", + "integrity": "sha512-siX3YCG7N2HnmN1xMH3cK4JkUZJhbkhRFJL+G5N1vH0mh1t5088rJknIoqDFWDIU6NPGvRRgLnYW3ZHjSMEBLA==", + "license": "MIT" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" }, "node_modules/modify-values": { "version": "1.0.1", @@ -19247,8 +19684,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/native-promise-only": { "version": "0.8.1", @@ -19308,6 +19744,16 @@ "ms": "^2.1.1" } }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -19335,7 +19781,6 @@ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.77.0.tgz", "integrity": "sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==", "license": "MIT", - "optional": true, "dependencies": { "semver": "^7.3.5" }, @@ -19348,7 +19793,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", - "optional": true, "bin": { "semver": "bin/semver.js" }, @@ -19356,6 +19800,12 @@ "node": ">=10" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -19372,7 +19822,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=10.5.0" } @@ -19382,7 +19831,6 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", - "peer": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -19396,6 +19844,44 @@ "url": "https://opencollective.com/node-fetch" } }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "license": "MIT", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-releases": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.20.tgz", @@ -19403,6 +19889,22 @@ "dev": true, "license": "MIT" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -19448,6 +19950,23 @@ "integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==", "license": "MIT" }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", @@ -19736,6 +20255,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -19811,7 +20346,6 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", - "peer": true, "dependencies": { "entities": "^6.0.0" }, @@ -19824,7 +20358,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=0.12" }, @@ -19932,7 +20465,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -20445,7 +20978,6 @@ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", "license": "MIT", - "optional": true, "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -20483,6 +21015,7 @@ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "devOptional": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -20499,7 +21032,6 @@ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-diff": "^1.1.2" }, @@ -20594,6 +21126,27 @@ "asap": "~2.0.3" } }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "license": "ISC", + "optional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "license": "MIT", + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -20777,7 +21330,6 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "license": "MIT", - "optional": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -20895,7 +21447,6 @@ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -20920,7 +21471,6 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "optional": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -20936,7 +21486,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "license": "MIT", - "optional": true, "engines": { "node": ">=0.10.0" } @@ -20946,6 +21495,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -20958,6 +21508,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -20991,7 +21542,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/react-keyed-flatten-children": { "version": "5.0.0", @@ -21760,6 +22312,16 @@ "node": ">=8" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -21782,7 +22344,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -21806,6 +22368,7 @@ "integrity": "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -21989,6 +22552,7 @@ "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -22044,7 +22608,6 @@ "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -22083,7 +22646,6 @@ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -22096,8 +22658,7 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/section-matter": { "version": "1.0.0", @@ -22135,11 +22696,17 @@ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "randombytes": "^2.1.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC", + "optional": true + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -22359,8 +22926,7 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/simple-get": { "version": "4.0.1", @@ -22381,7 +22947,6 @@ } ], "license": "MIT", - "optional": true, "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -22443,18 +23008,58 @@ "integrity": "sha512-YiuPbxpCj4hD9Qs06hGAz/OZhQ0eDuALN0lRWJez0eD/RevzKqGdUx1IOMUnXgpr+sXZLq3g8ERwbAH0bCb8vg==", "license": "BSD-3-Clause" }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/snappyjs": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz", "integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==", "license": "MIT" }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "optional": true, + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/sortablejs": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/source-map": { "version": "0.6.1", @@ -22480,12 +23085,22 @@ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, + "node_modules/spatialite": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/spatialite/-/spatialite-0.1.0.tgz", + "integrity": "sha512-msiD3jS4q2Hdal3LygSAHnPWeudZVkd/0aQY0Psj26D3dKsUp9/ArduS4JbXBj5Qo7LtlJrZfvFQKHhIhxZ65w==", + "dependencies": { + "sqlite3": "*" + }, + "engines": { + "node": ">= 0.6.13" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -22522,6 +23137,15 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/spl.js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/spl.js/-/spl.js-0.1.2.tgz", + "integrity": "sha512-/QDSARmyfEAJSkCH89e3J3xlUoW97r5O/eL4n6GD+lbrOY/qoB6keF/UeZ3Y2Ck0aPmwhp8u7apczlUVi1yOig==", + "license": "GPLv3", + "dependencies": { + "pako": "^2.1.0" + } + }, "node_modules/splaytree": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-3.1.2.tgz", @@ -22577,6 +23201,49 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, + "node_modules/sql.js": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.13.0.tgz", + "integrity": "sha512-RJbVP1HRDlUUXahJ7VMTcu9Rm1Nzw+EBpoPr94vnbD4LwR715F3CcxE2G2k45PewcaZ57pjetYa+LoSJLAASgA==", + "license": "MIT" + }, + "node_modules/sqlite3": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/stack-trace": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", @@ -23181,7 +23848,6 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -23190,12 +23856,28 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tar-fs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "license": "MIT", - "optional": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -23208,7 +23890,6 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "license": "MIT", - "optional": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -23225,7 +23906,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", - "optional": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -23251,7 +23931,6 @@ } ], "license": "MIT", - "optional": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -23262,7 +23941,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -23272,13 +23950,36 @@ "node": ">= 6" } }, + "node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/terser": { "version": "5.44.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -23298,7 +23999,6 @@ "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -23334,7 +24034,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -23347,8 +24046,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/text-encoding": { "version": "0.6.4", @@ -23473,7 +24171,6 @@ "resolved": "https://registry.npmjs.org/timezone-groups/-/timezone-groups-0.10.4.tgz", "integrity": "sha512-AnkJYrbb7uPkDCEqGeVJiawZNiwVlSkkeX4jZg1gTEguClhyX+/Ezn07KB6DT29tG3UN418ldmS/W6KqGOTDjg==", "license": "MIT", - "peer": true, "engines": { "node": ">=18.12.0" } @@ -23541,6 +24238,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -23748,7 +24446,6 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "license": "Apache-2.0", - "optional": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -23786,7 +24483,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=16" }, @@ -23902,6 +24598,7 @@ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -24005,6 +24702,26 @@ "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", "license": "MIT" }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "license": "ISC", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, "node_modules/universal-user-agent": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", @@ -24224,6 +24941,7 @@ "resolved": "https://registry.npmjs.org/vega/-/vega-5.33.0.tgz", "integrity": "sha512-jNAGa7TxLojOpMMMrKMXXBos4K6AaLJbCgGDOw1YEkLRjUkh12pcf65J2lMSdEHjcEK47XXjKiOUVZ8L+MniBA==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "vega-crossfilter": "~4.1.3", "vega-dataflow": "~5.7.7", @@ -24486,6 +25204,7 @@ "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-5.23.0.tgz", "integrity": "sha512-l4J6+AWE3DIjvovEoHl2LdtCUkfm4zs8Xxx7INwZEAv+XVb6kR6vIN1gt3t2gN2gs/y4DYTs/RPoTeYAuEg6mA==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "json-stringify-pretty-compact": "~4.0.0", "tslib": "~2.8.1", @@ -24949,6 +25668,7 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -25042,6 +25762,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -25167,6 +25888,7 @@ "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-sfc": "2.7.16", "csstype": "^3.1.0" @@ -25334,7 +26056,6 @@ "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -25354,7 +26075,6 @@ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 8" } @@ -25384,7 +26104,6 @@ "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -25434,7 +26153,6 @@ "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.13.0" } @@ -25466,7 +26184,6 @@ "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.13.0" }, @@ -25540,7 +26257,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -25641,6 +26358,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/with": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", @@ -25778,7 +26505,6 @@ "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.13.tgz", "integrity": "sha512-clu7dxTm1e8Mo5fz3n/oW3UCXBfV89xZ72jM8yzo1vR/pIS0w3sgB3XV2H8Vm6zfGnHL0FzvLJPJEBhd86/z4Q==", "license": "MIT", - "peer": true, "dependencies": { "commander": "^2.20.3", "cssfilter": "0.0.10" @@ -25794,8 +26520,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/xtend": { "version": "4.0.2", diff --git a/src/dash-panels/_allPanels.ts b/src/dash-panels/_allPanels.ts index 74391de72..1e1eb3a0c 100644 --- a/src/dash-panels/_allPanels.ts +++ b/src/dash-panels/_allPanels.ts @@ -29,6 +29,7 @@ export const panelLookup: { [key: string]: AsyncComponent } = { // full-screen map visualizations: aequilibrae: defineAsyncComponent(() => import('./aequilibrae.vue')), + polaris: defineAsyncComponent(() => import('./polaris.vue')), carriers: defineAsyncComponent(() => import('./carriers.vue')), flowmap: defineAsyncComponent(() => import('./flowmap.vue')), links: defineAsyncComponent(() => import('./links.vue')), diff --git a/src/dash-panels/polaris.vue b/src/dash-panels/polaris.vue new file mode 100644 index 000000000..d5fe1a9ee --- /dev/null +++ b/src/dash-panels/polaris.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/plugins/pluginRegistry.ts b/src/plugins/pluginRegistry.ts index 2279eb6f9..9c94eeae0 100644 --- a/src/plugins/pluginRegistry.ts +++ b/src/plugins/pluginRegistry.ts @@ -147,6 +147,11 @@ const plugins = [ kebabName: "aeq-reader", filePatterns: ['**/aeqviz-*.y?(a)ml'], component: defineAsyncComponent(() => import('./aequilibrae/AequilibraEReader.vue')), + }, + { + kebabName: "polaris-reader", + filePatterns: ['**/polaris.y?(a)ml'], + component: defineAsyncComponent(() => import('./polaris/PolarisReader.vue')), } ] diff --git a/src/plugins/polaris/PolarisFileSystem.ts b/src/plugins/polaris/PolarisFileSystem.ts new file mode 100644 index 000000000..b5c890c73 --- /dev/null +++ b/src/plugins/polaris/PolarisFileSystem.ts @@ -0,0 +1,81 @@ +/** + * POLARIS File System Handler + * + * Extends HTTPFileSystem to handle POLARIS project structures + * and SQLite database files. Provides methods to detect + * POLARIS projects and locate database files. + */ + +import HTTPFileSystem from '../../js/HTTPFileSystem' +import { FileSystemConfig, DirectoryEntry } from '@/Globals' + +/** + * Interface representing the structure of a POLARIS project + * with its typical database components + */ +export interface PolarisProject { + /** Supply database buffer */ + supplyDb?: ArrayBuffer + /** Demand database buffer */ + demandDb?: ArrayBuffer + /** Result database buffer */ + resultDb?: ArrayBuffer +} + +/** + * File system handler specifically designed for POLARIS projects + * Provides detection and database listing capabilities + */ +export default class PolarisFileSystem extends HTTPFileSystem { + constructor(project: FileSystemConfig, store?: any) { + super(project, store) + } + + /** + * Detects if a folder contains a POLARIS project + * by looking for polaris.yaml configuration file + * + * @param subfolder - The subfolder path to check + * @returns Promise - True if POLARIS project is detected + */ + public async isPolarisProject(subfolder: string): Promise { + try { + const { files } = await this.getDirectory(subfolder) + + // Look for polaris.yaml configuration file + const hasPolarisConfig = files.some( + f => f.toLowerCase() === 'polaris.yaml' || f.toLowerCase() === 'polaris.yml' + ) + + return hasPolarisConfig + } catch (error) { + return false + } + } + + /** + * Lists all SQLite database files in a POLARIS project folder + * + * @param subfolder - The subfolder path to search + * @returns Promise - Array of SQLite database filenames + */ + public async listPolarisDatabases(subfolder: string): Promise { + const { files } = await this.getDirectory(subfolder) + return files.filter(f => f.endsWith('.sqlite') || f.endsWith('.db')) + } + + /** + * Loads a POLARIS database file as an ArrayBuffer + * + * @param filepath - Path to the database file + * @returns Promise - Database as ArrayBuffer, or null if failed + */ + public async loadPolarisDatabase(filepath: string): Promise { + try { + const blob = await this.getFileBlob(filepath) + return blob ? await blob.arrayBuffer() : null + } catch (error) { + return null + } + } +} diff --git a/src/plugins/polaris/PolarisReader.vue b/src/plugins/polaris/PolarisReader.vue new file mode 100644 index 000000000..cd2a8dfd3 --- /dev/null +++ b/src/plugins/polaris/PolarisReader.vue @@ -0,0 +1,315 @@ + + + + + diff --git a/src/plugins/polaris/db.ts b/src/plugins/polaris/db.ts new file mode 100644 index 000000000..5e96c383a --- /dev/null +++ b/src/plugins/polaris/db.ts @@ -0,0 +1,255 @@ +/** + * Database utilities for POLARIS plugin + * + * This module provides helper functions for interacting with SQLite databases + * containing spatial data. It uses ATTACH to enable cross-database queries + * between supply, demand, and result databases. + * + * @fileoverview Database Utility Functions for POLARIS + * @author SimWrapper Development Team + */ + +import type { LayerConfig } from './types' + +/** + * Retrieves all table names from a SQLite database + * + * @param db - SQLite database connection object + * @returns Promise Array of table names + */ +export async function getTableNames(db: any): Promise { + const result = await db.exec("SELECT name FROM sqlite_master WHERE type='table';").get.objs + return result.map((row: any) => row.name) +} + +/** + * Gets the schema (column information) for a specific table + * + * @param db - SQLite database connection object + * @param tableName - Name of the table to inspect + * @returns Promise with array of column metadata (name, type, nullable) + */ +export async function getTableSchema( + db: any, + tableName: string +): Promise<{ name: string; type: string; nullable: boolean }[]> { + const result = await db.exec(`PRAGMA table_info("${tableName}");`).get.objs + return result.map((row: any) => ({ + name: row.name, + type: row.type, + nullable: row.notnull === 0, + })) +} + +/** + * Counts the number of rows in a table + * + * @param db - SQLite database connection object + * @param tableName - Name of the table to count + * @returns Promise Number of rows in the table + */ +export async function getRowCount(db: any, tableName: string): Promise { + const result = await db.exec(`SELECT COUNT(*) as count FROM "${tableName}";`).get.objs + return result.length > 0 ? result[0].count : 0 +} + +/** + * Query a table and return all rows as objects + * + * @param db - SQLite database connection object + * @param tableName - Name of the table to query + * @param columns - Optional array of column names to select (default: all columns) + * @param whereClause - Optional WHERE clause to filter results (without the WHERE keyword) + * @returns Promise[]> Array of row objects + */ +export async function queryTable( + db: any, + tableName: string, + columns?: string[], + whereClause?: string +): Promise[]> { + const columnList = columns ? columns.map(c => `"${c}"`).join(', ') : '*' + const whereCondition = whereClause ? ` WHERE ${whereClause}` : '' + const query = `SELECT ${columnList} FROM "${tableName}"${whereCondition};` + const result = await db.exec(query).get.objs + return result +} + +/** + * Simplify coordinates by reducing precision (removes ~30-50% memory for coordinates) + * Uses iterative approach to avoid stack overflow with large/nested geometries + * @param coords - Coordinate array to simplify + * @param precision - Number of decimal places to keep (default 6 = ~0.1m precision) + */ +function simplifyCoordinates(coords: any, precision: number = 6): any { + if (!coords || !Array.isArray(coords)) return coords + + const factor = Math.pow(10, precision) + + const simplifyValue = (val: any): any => { + if (typeof val === 'number') { + return Math.round(val * factor) / factor + } + if (!Array.isArray(val)) { + return val + } + // Check if this is a coordinate (array of numbers) + if (val.length > 0 && typeof val[0] === 'number') { + return val.map((n: number) => Math.round(n * factor) / factor) + } + // Otherwise it's a nested array - process each element + return val.map((item: any) => simplifyValue(item)) + } + + return simplifyValue(coords) +} + +/** + * Identify columns that are actually used for styling in the layer config + */ +function getUsedColumns(layerConfig: any): Set { + const used = new Set() + if (!layerConfig?.style) return used + + const style = layerConfig.style + const styleProps = ['fillColor', 'lineColor', 'lineWidth', 'pointRadius', 'fillHeight', 'filter'] + for (const prop of styleProps) { + const cfg = style[prop] + if (cfg && typeof cfg === 'object' && 'column' in cfg) { + used.add(cfg.column) + } + } + return used +} + +/** + * Fetch GeoJSON features from a table + * Memory-optimized: only stores essential properties and simplifies coordinates + * @param db - The database connection + * @param table - Table metadata with name and columns + * @param layerName - Name of the layer for feature properties + * @param layerConfig - Layer configuration + * @param options - Optional settings for memory optimization + */ +export async function fetchGeoJSONFeatures( + db: any, + table: { name: string; columns: any[] }, + layerName: string, + layerConfig: any, + options?: { + limit?: number + coordinatePrecision?: number + minimalProperties?: boolean + } +) { + const limit = options?.limit ?? 100000 + const coordPrecision = options?.coordinatePrecision ?? 5 + const minimalProps = options?.minimalProperties ?? true + + const usedColumns = getUsedColumns(layerConfig) + + // Build column list - either all columns or just the ones we need + let columnNames: string + if (minimalProps && usedColumns.size > 0) { + const essentialCols = new Set(['id', 'name', 'link', 'node', 'zone', 'type']) + const colsToSelect = table.columns + .filter((c: any) => { + const name = c.name.toLowerCase() + return name !== 'geometry' && + (usedColumns.has(c.name) || essentialCols.has(name)) + }) + .map((c: any) => `"${c.name}"`) + + columnNames = colsToSelect.length > 0 + ? colsToSelect.join(', ') + : table.columns + .filter((c: any) => c.name.toLowerCase() !== 'geometry') + .map((c: any) => `"${c.name}"`) + .join(', ') + } else { + columnNames = table.columns + .filter((c: any) => c.name.toLowerCase() !== 'geometry') + .map((c: any) => `"${c.name}"`) + .join(', ') + } + + let filterClause = 'geometry IS NOT NULL' + if ( + layerConfig && + typeof layerConfig.sqlFilter === 'string' && + layerConfig.sqlFilter.trim().length > 0 + ) { + filterClause += ` AND (${layerConfig.sqlFilter})` + } + + const query = ` + SELECT ${columnNames}, + AsGeoJSON(geometry) as geojson_geom, + GeometryType(geometry) as geom_type + FROM "${table.name}" + WHERE ${filterClause} + LIMIT ${limit}; + ` + + const queryResult = await db.exec(query) + let rows = await queryResult.get.objs + + const features: any[] = [] + + const selectedColumns = minimalProps && usedColumns.size > 0 + ? table.columns.filter((c: any) => { + const name = c.name.toLowerCase() + const essentialCols = new Set(['id', 'name', 'link', 'node', 'zone', 'type']) + return name !== 'geometry' && + (usedColumns.has(c.name) || essentialCols.has(name)) + }) + : table.columns.filter((c: any) => c.name.toLowerCase() !== 'geometry') + + const BATCH_SIZE = 5000 + + for (let batchStart = 0; batchStart < rows.length; batchStart += BATCH_SIZE) { + const batchEnd = Math.min(batchStart + BATCH_SIZE, rows.length) + + for (let r = batchStart; r < batchEnd; r++) { + const row = rows[r] + if (!row.geojson_geom) { + rows[r] = null + continue + } + + const properties: any = { _layer: layerName } + for (const col of selectedColumns) { + const key = col.name + if (key !== 'geojson_geom' && key !== 'geom_type' && row[key] !== null && row[key] !== undefined) { + properties[key] = row[key] + } + } + + let geometry: any + try { + geometry = typeof row.geojson_geom === 'string' + ? JSON.parse(row.geojson_geom) + : row.geojson_geom + + if (geometry.coordinates && coordPrecision < 15) { + geometry.coordinates = simplifyCoordinates(geometry.coordinates, coordPrecision) + } + } catch (e) { + rows[r] = null + continue + } + + features.push({ type: 'Feature', geometry, properties }) + rows[r] = null + } + + if (batchEnd < rows.length) { + await new Promise(resolve => setTimeout(resolve, 0)) + } + } + + rows.length = 0 + rows = null as any + + return features +} diff --git a/src/plugins/polaris/i18n.ts b/src/plugins/polaris/i18n.ts new file mode 100644 index 000000000..422f9dea3 --- /dev/null +++ b/src/plugins/polaris/i18n.ts @@ -0,0 +1,20 @@ +/** + * Internationalization configuration for POLARIS plugin + * Currently using default SimWrapper i18n system + */ +export const i18n = { + messages: { + en: { + loading: 'Loading POLARIS data...', + error: 'Error loading data', + noGeometry: 'No spatial data found', + waitingInQueue: 'Waiting for other maps to load...' + }, + de: { + loading: 'POLARIS-Daten werden geladen...', + error: 'Fehler beim Laden der Daten', + noGeometry: 'Keine rΓ€umlichen Daten gefunden', + waitingInQueue: 'Warten auf das Laden anderer Karten...' + }, + }, +} diff --git a/src/plugins/polaris/reader.scss b/src/plugins/polaris/reader.scss new file mode 100644 index 000000000..e14bbceda --- /dev/null +++ b/src/plugins/polaris/reader.scss @@ -0,0 +1,89 @@ +/** + * Styles for the POLARIS data viewer component + * Provides consistent theming and responsive layout + */ + +/* Main container styles */ +.c-polaris-viewer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: var(--bgCardFrame); + display: flex; + flex-direction: column; +} + +/* Map container */ +.map-viewer { + position: relative; + flex: 1; + width: 100%; + height: 100%; +} + +/* Loading state indicator */ +.loading { + padding: 2rem; + text-align: center; + font-size: 1.2rem; + color: var(--textFancy); + + /* Add subtle animation for loading state */ + &::after { + content: '...'; + display: inline-block; + animation: loading-dots 1.5s steps(4, end) infinite; + } +} + +@keyframes loading-dots { + 0%, 20% { content: ''; } + 40% { content: '.'; } + 60% { content: '..'; } + 80%, 100% { content: '...'; } +} + +/* Database content display styles */ +.database-content { + padding: 0.5rem 0; + + h3 { + margin-bottom: 1rem; + color: var(--textFancy); + font-size: 1.25rem; + font-weight: 600; + } + + h4 { + margin-top: 1.5rem; + margin-bottom: 0.5rem; + color: var(--link); + font-weight: bold; + font-size: 1.1rem; + } + + p { + margin: 0.25rem 0; + color: var(--text); + line-height: 1.4; + } + + .columns { + margin-left: 1rem; + font-size: 0.9rem; + color: var(--textFancy); + + div { + margin: 0.1rem 0; + padding: 0.1rem 0; + + &:hover { + background-color: var(--bgHover); + padding-left: 0.25rem; + border-left: 2px solid var(--link); + } + } + } +} diff --git a/src/plugins/polaris/styling.ts b/src/plugins/polaris/styling.ts new file mode 100644 index 000000000..6931b8b2c --- /dev/null +++ b/src/plugins/polaris/styling.ts @@ -0,0 +1,386 @@ +/** + * Styling utilities for AequilibraE plugin + * + * This module provides functions for building visual styles from data. + * It handles color encoding, size mapping, filtering, and the creation + * of typed arrays optimized for WebGL rendering. + * + * @fileoverview Data-Driven Styling System for AequilibraE + * @author SimWrapper Development Team + */ + +import * as cartoColors from 'cartocolor' +import { RGBA, RGB, ColorStyle, NumericStyle, LayerStyle, BuildArgs, BuildResult } from './types' + +/** + * Converts a hex color string to RGB array + * + * @param hex - Hex color string (with or without #) + * @returns RGB array [R, G, B] with values 0-255 + */ +const hexToRgb = (hex: string): RGB => { + const match = hex.replace('#', '').match(/.{1,2}/g) || ['80', '80', '80'] + return [parseInt(match[0], 16), parseInt(match[1], 16), parseInt(match[2], 16)] +} + +/** + * Converts a hex color string to RGBA array + * + * @param hex - Hex color string (with or without #) + * @param alpha - Alpha value (0-1), default 1 (opaque) + * @returns RGBA array [R, G, B, A] with values 0-255 + */ +const hexToRgba = (hex: string, alpha: number = 1): RGBA => { + const match = hex.replace('#', '').match(/.{1,2}/g) || ['80', '80', '80'] + return [ + parseInt(match[0], 16), + parseInt(match[1], 16), + parseInt(match[2], 16), + Math.round(alpha * 255), + ] +} + +/** + * Gets color palette from CartoColor library + * + * @param name - Name of the color palette (e.g., 'YlGn', 'Viridis') + * @param numColors - Number of colors needed + * @returns Array of hex color strings + */ +const getPaletteColors = (name: string, numColors: number): string[] => { + const palette = (cartoColors as any)[name || 'YlGn'] + if (!palette) return Array(numColors).fill('#808080') + const sizes = Object.keys(palette) + .map(Number) + .filter(n => n > 0) + .sort((a, b) => a - b) + const size = sizes.find(s => s >= numColors) || sizes[sizes.length - 1] + return palette[size] || Array(numColors).fill('#808080') +} + +/** + * Safely converts a value to number, returning null for invalid values + * + * @param value - Value to convert to number + * @returns Number or null if conversion fails + */ +const toNumber = (value: any): number | null => { + const num = Number(value) + return isNaN(num) ? null : num +} + +/** + * Safe minimum function that avoids stack overflow on large arrays + * + * @param arr - Array of numbers + * @returns Minimum value, or 0 if array is empty + */ +const safeMin = (arr: number[]): number => { + if (arr.length === 0) return 0 + let min = arr[0] + for (let i = 1; i < arr.length; i++) { + if (arr[i] < min) min = arr[i] + } + return min +} + +/** + * Safe maximum function that avoids stack overflow on large arrays + * + * @param arr - Array of numbers + * @returns Maximum value, or 1 if array is empty + */ +const safeMax = (arr: number[]): number => { + if (arr.length === 0) return 1 + let max = arr[0] + for (let i = 1; i < arr.length; i++) { + if (arr[i] > max) max = arr[i] + } + return max +} + +const buildColorEncoder = ( + values: any[], + style: ColorStyle, + dataRange: [number, number] | null = null +) => { + if (dataRange) { + // clamp the values to within the data range + values = values.map(v => { + const num = toNumber(v) + if (num === null) return null + return Math.max(dataRange[0], Math.min(dataRange[1], num)) + }) + } + + const nums = values.map(toNumber).filter((v): v is number => v !== null) + const [min, max] = + 'range' in style && style.range + ? style.range + : [safeMin(nums), safeMax(nums)] + + const paletteName = 'palette' in style ? style.palette : 'YlGn' + const numColors = 'numColors' in style ? style.numColors : 7 + const colors = getPaletteColors(paletteName, numColors).map(h => hexToRgba(h, 1)) + + const scale = max === min ? 0 : (numColors - 1) / (max - min) + + return (value: any) => { + const num = toNumber(value) ?? min + const idx = Math.round((num - min) * scale) + return colors[Math.max(0, Math.min(numColors - 1, idx))] + } +} + +const buildCategoryEncoder = (colors: Record, defaultColor: string = '#808080') => { + const colorMap = new Map() + for (const [key, hex] of Object.entries(colors)) { + colorMap.set(String(key), hexToRgb(hex)) + } + const defaultRgba = hexToRgb(defaultColor) + + return (value: any) => { + return colorMap.get(String(value)) || defaultRgba + } +} + +const applyQuantitativeMapping = ( + values: (number | null)[], + dataRange: [number, number], + outputRange: [number, number], + target: Float32Array, + stride: number, + offset: number +) => { + const nums = values.filter((v): v is number => v !== null) + const [dataMin, dataMax] = dataRange + const [outMin, outMax] = outputRange + const scale = dataMax === dataMin ? 0 : 1 / (dataMax - dataMin) + + for (let i = 0; i < values.length; i++) { + const num = values[i] + const normalized = num === null ? 0 : (num - dataMin) * scale + target[i * stride + offset] = Math.max( + outMin, + Math.min(outMax, normalized * (outMax - outMin) + outMin) + ) + } +} + +/** + * Builds typed arrays for efficient WebGL rendering from feature data and styling rules + * + * This is the main function that converts GeoJSON features and layer styling + * configurations into the typed arrays needed for high-performance map rendering. + * It handles color encoding, size mapping, filtering, and optimization for GPU rendering. + * + * @param args - Build arguments containing features, layer configs, and defaults + * @returns BuildResult with typed arrays ready for WebGL rendering + */ +export function buildStyleArrays(args: BuildArgs): BuildResult { + const { features, layers, defaults = {} } = args + + const N = features.length + const fillColors = new Uint8ClampedArray(N * 4) + const lineColors = new Uint8ClampedArray(N * 3) // RGB only + const lineWidths = new Float32Array(N) + const pointRadii = new Float32Array(N) + const fillHeights = new Float32Array(N) + const featureFilter = new Float32Array(N) + + // Pre-index features by layer name in properties._layer to allow per-layer style + // Fallback to globalstyle if properties._layer isn’t present. + type LayerBucket = { idxs: number[]; props: any[]; style?: LayerStyle } + const buckets = new Map() + for (let i = 0; i < N; i++) { + const props = features[i]?.properties || {} + const layerName = props._layer || 'GLOBAL' + const bucket = buckets.get(layerName) || { + idxs: [], + props: [], + style: layers[layerName]?.style, + } + bucket.idxs.push(i) + bucket.props.push(props) + bucket.style = layers[layerName]?.style || bucket.style + buckets.set(layerName, bucket) + } + + // Global defaults used if no layer style present + const defaultFill = hexToRgba(defaults.fillColor || '#59a14f', 1) + const defaultLine = hexToRgb(defaults.lineColor || '#4e79a7') + const defaultWidth = defaults.lineWidth ?? 2 + const defaultRadius = defaults.pointRadius ?? 4 + const defaultHeight = defaults.fillHeight ?? 0 + + // Initialize everything to defaults first + for (let i = 0; i < N; i++) { + fillColors.set(defaultFill, i * 4) + lineColors.set(defaultLine, i * 3) // RGB offset + lineWidths[i] = defaultWidth + pointRadii[i] = defaultRadius + fillHeights[i] = defaultHeight + featureFilter[i] = 1 // visible by default + } + + // Apply per-layer styles + for (const [layerName, bucket] of buckets.entries()) { + const style = bucket.style + const idxs = bucket.idxs + const propsArr = bucket.props + + if (!style) continue + + // filter + if (style.filter && 'column' in style.filter) { + const col = (style.filter as any).column + const include: any[] | undefined = (style.filter as any).include + const exclude: any[] | undefined = (style.filter as any).exclude + for (let j = 0; j < idxs.length; j++) { + const i = idxs[j] + const v = propsArr[j]?.[col] + let visible = true + if (include && include.length) visible = include.includes(v) + if (exclude && exclude.length) visible = visible && !exclude.includes(v) + featureFilter[i] = visible ? 1 : 0 + } + } + + if (style.fillColor) { + if (typeof style.fillColor === 'string') { + // Static hex color + const color = hexToRgba(style.fillColor, 1) + for (let j = 0; j < idxs.length; j++) { + fillColors.set(color, idxs[j] * 4) + } + } else if ('colors' in style.fillColor) { + const encoder = buildCategoryEncoder(style.fillColor.colors, '#808080') + for (let j = 0; j < idxs.length; j++) { + fillColors.set(encoder(propsArr[j]?.[style.fillColor.column]), idxs[j] * 4) + } + } else if ('column' in style.fillColor) { + // Column-based encoding + const encoder = buildColorEncoder( + propsArr.map(p => p?.[style.fillColor!.column]), + style.fillColor, + style.fillColor.dataRange + ) + for (let j = 0; j < idxs.length; j++) { + fillColors.set(encoder(propsArr[j]?.[style.fillColor.column]), idxs[j] * 4) + } + } + } + + if (style.lineColor) { + if (typeof style.lineColor === 'string') { + // Static hex color + const rgb = hexToRgb(style.lineColor) + for (let j = 0; j < idxs.length; j++) { + lineColors[idxs[j] * 3] = rgb[0] + lineColors[idxs[j] * 3 + 1] = rgb[1] + lineColors[idxs[j] * 3 + 2] = rgb[2] + } + } else if ('colors' in style.lineColor) { + const encoder = buildCategoryEncoder(style.lineColor.colors, '#808080') + for (let j = 0; j < idxs.length; j++) { + lineColors.set(encoder(propsArr[j]?.[style.lineColor.column]), idxs[j] * 3) + } + } else if ('column' in style.lineColor) { + // Column-based encoding + const encoder = buildColorEncoder( + propsArr.map(p => p?.[style.lineColor!.column]), + style.lineColor, + style.lineColor.dataRange + ) + for (let j = 0; j < idxs.length; j++) { + const [r, g, b] = encoder(propsArr[j]?.[style.lineColor.column]) + lineColors[idxs[j] * 3] = r + lineColors[idxs[j] * 3 + 1] = g + lineColors[idxs[j] * 3 + 2] = b + } + } + } + + // lineWidth - handle static, array, category, and column-based + if (style.lineWidth) { + if (Array.isArray(style.lineWidth)) { + // Assign each width in the array to the corresponding feature + for (let j = 0; j < idxs.length; j++) { + lineWidths[idxs[j]] = style.lineWidth[j] ?? defaultWidth + } + } else if (typeof style.lineWidth === 'number') { + for (let j = 0; j < idxs.length; j++) { + lineWidths[idxs[j]] = style.lineWidth + } + } else if ( + typeof style.lineWidth === 'object' && + 'widths' in style.lineWidth && + 'column' in style.lineWidth + ) { + // Category-based mapping: { column, widths } + const widthMap = style.lineWidth.widths || {} + for (let j = 0; j < idxs.length; j++) { + const v = propsArr[j]?.[style.lineWidth.column] + lineWidths[idxs[j]] = widthMap[v] ?? defaultWidth + } + } else if ('column' in style.lineWidth) { + const values = propsArr.map(p => toNumber(p?.[style.lineWidth!.column])) + applyQuantitativeMapping( + values, + style.lineWidth.dataRange ?? [1, 6], + style.lineWidth.widthRange ?? [1, 6], + lineWidths, + 1, + 0 + ) + } + } + + // pointRadius - handle both static and column-based + if (style.pointRadius) { + if (typeof style.pointRadius === 'number') { + for (let j = 0; j < idxs.length; j++) { + pointRadii[idxs[j]] = style.pointRadius + } + } else if ('column' in style.pointRadius) { + const values = propsArr.map(p => toNumber(p?.[style.pointRadius!.column])) + applyQuantitativeMapping( + values, + style.pointRadius.dataRange ?? [2, 12], + style.pointRadius.widthRange ?? [2, 12], + pointRadii, + 1, + 0 + ) + } + } + + // fillHeight - handle both static and column-based + if (style.fillHeight) { + if (typeof style.fillHeight === 'number') { + for (let j = 0; j < idxs.length; j++) { + fillHeights[idxs[j]] = style.fillHeight + } + } else if ('column' in style.fillHeight) { + const values = propsArr.map(p => toNumber(p?.[style.fillHeight!.column])) + applyQuantitativeMapping( + values, + style.fillHeight.dataRange ?? [0, 100], + style.fillHeight.widthRange ?? [0, 100], + fillHeights, + 1, + 0 + ) + } + } + } + + return { + fillColors, + lineColors, + lineWidths, + pointRadii, + fillHeights, + featureFilter, + } +} diff --git a/src/plugins/polaris/types.ts b/src/plugins/polaris/types.ts new file mode 100644 index 000000000..0b9bd6d2f --- /dev/null +++ b/src/plugins/polaris/types.ts @@ -0,0 +1,282 @@ +/** + * Type definitions for the POLARIS plugin + * + * This file contains all TypeScript interfaces and types used throughout + * the POLARIS visualization plugin. It defines data structures for: + * - Spatial data configuration from polaris.yaml simwrapper section + * - Styling and rendering options + * - Database operations using ATTACH for multiple databases + * + * @fileoverview POLARIS Plugin Type Definitions + * @author SimWrapper Development Team + */ + +/** Supported geometry types for spatial data visualization */ +export type GeometryType = 'polygon' | 'line' | 'point' + +/** + * Configuration for a spatial data layer, defining how it should be + * rendered and what data it should display + */ +export interface LayerConfig { + /** Database table name containing the spatial data */ + table: string + /** Type of geometry (affects rendering style) */ + type: GeometryType + /** SQL filter clause (without WHERE keyword) */ + sqlFilter?: string + /** Fill color for polygons (hex string) */ + fillColor?: string + /** Stroke/outline color (hex string) */ + strokeColor?: string + /** Line/stroke width in pixels */ + strokeWidth?: number + /** Point radius in pixels */ + radius?: number + /** Layer opacity (0-1) */ + opacity?: number + /** Z-index for layer stacking */ + zIndex?: number + /** Layer styling configuration */ + style?: LayerStyle +} + +/** + * SimWrapper section within polaris.yaml + * Defines visualization settings for POLARIS model output + * + * @example + * ```yaml + * simwrapper: + * center: [-87.63, 41.88] + * zoom: 10 + * layers: + * supply: + * Link: + * style: + * lineColor: { column: type, type: categorical } + * Zone: + * style: + * lineColor: { column: zone, type: integer } + * ``` + */ +export interface PolarisSimwrapperConfig { + /** Map center coordinates [lon, lat] */ + center?: [number, number] + /** Initial map zoom level (default: 10) */ + zoom?: number + /** Map bearing/rotation in degrees */ + bearing?: number + /** Map pitch/tilt in degrees */ + pitch?: number + /** Layer group configurations keyed by database type (e.g., 'supply', 'demand', 'result') */ + layers?: { + [groupName: string]: { + [tableName: string]: LayerConfig + } + } + /** Default styling values applied to all layers */ + defaults?: { + fillColor?: string + lineColor?: string + lineWidth?: number + pointRadius?: number + fillHeight?: number + } + /** Manual legend configuration */ + legend?: Array<{ + label?: string + color?: string + size?: number + shape?: string + subtitle?: string + }> + /** Memory optimization: Max features per layer (default: 100000) */ + geometryLimit?: number + /** Memory optimization: Coordinate decimal precision (default: 5 = ~1m) */ + coordinatePrecision?: number + /** Memory optimization: Only store properties used for styling (default: true) */ + minimalProperties?: boolean +} + +/** + * POLARIS scenario configuration from scenario_abm.json + */ +export interface PolarisScenarioConfig { + /** Scenario description */ + description?: string + /** Supply database filename */ + supply_database?: string + /** Demand database filename */ + demand_database?: string + /** Result database filename */ + result_database?: string + /** Analysis iteration to use (default: last) */ + analysis_iteration?: number +} + +/** + * Complete visualization configuration for a POLARIS dataset. + * This interface defines all settings needed to render spatial data + * with proper styling, legends, and performance optimizations. + */ +export interface VizDetails { + /** Display title for the visualization */ + title: string + /** Descriptive text about the dataset */ + description: string + /** Path to the supply database file */ + supplyDatabase?: string + /** Path to the demand database file */ + demandDatabase?: string + /** Path to the result database file */ + resultDatabase?: string + /** Layer configurations keyed by layer name */ + layers: { [key: string]: LayerConfig } + /** Map center coordinates [lon, lat] or comma-separated string */ + center?: [number, number] | string + /** Initial map zoom level */ + zoom?: number + /** Map bearing/rotation in degrees */ + bearing?: number + /** Map pitch/tilt in degrees */ + pitch?: number + /** Memory optimization: Max features per layer (default: 100000) */ + geometryLimit?: number + /** Memory optimization: Coordinate decimal precision (default: 5 = ~1m) */ + coordinatePrecision?: number + /** Memory optimization: Only store properties used for styling (default: true) */ + minimalProperties?: boolean + /** Default styling values applied to all layers */ + defaults?: { + fillColor?: string + lineColor?: string + lineWidth?: number + pointRadius?: number + fillHeight?: number + } + /** Manual legend configuration */ + legend?: Array<{ + label?: string + color?: string + size?: number + shape?: string + subtitle?: string + }> + /** Analysis iteration to use */ + analysisIteration?: number +} + +// ============================================================================= +// Color and Styling Type Definitions +// ============================================================================= + +/** RGBA color representation with alpha channel [R, G, B, A] where each value is 0-255 */ +export type RGBA = [number, number, number, number] + +/** RGB color representation [R, G, B] where each value is 0-255 */ +export type RGB = [number, number, number] + +/** + * Configuration for data-driven color styling + * Supports both quantitative (continuous) and categorical (discrete) color mappings + */ +export type ColorStyle = { + /** Column name in the data to use for color encoding */ + column: string + /** Type of color mapping to apply */ + type: 'quantitative' | 'categorical' + /** Color scheme name (e.g., 'Viridis', 'Blues') */ + colorScheme?: string + /** Custom color range [startColor, endColor] for quantitative mapping */ + colorRange?: [string, string] + /** Minimum value for color scale (auto-detected if not specified) */ + min?: number + /** Maximum value for color scale (auto-detected if not specified) */ + max?: number +} + +/** + * Configuration for data-driven numeric styling (widths, radii, heights) + */ +export type NumericStyle = { + /** Column name in the data to use for numeric encoding */ + column: string + /** Data value range [min, max] (auto-detected if not specified) */ + dataRange?: [number, number] + /** Output range for visual property [min, max] */ + widthRange?: [number, number] +} + +/** + * Complete styling configuration for a layer + * Defines how features should be visually rendered based on their data + */ +export type LayerStyle = { + /** Fill color configuration for polygons */ + fillColor?: ColorStyle + /** Line color configuration for lines and polygon outlines */ + lineColor?: ColorStyle + /** Line width configuration */ + lineWidth?: NumericStyle + /** Point radius configuration */ + pointRadius?: NumericStyle + /** Fill height configuration for 3D visualization */ + fillHeight?: NumericStyle + /** Feature filtering configuration */ + filter?: { + column: string + include?: any[] + exclude?: any[] + } +} + +/** + * Lightweight layer configuration for styling operations + * Used internally by the styling system + */ +export type LayerConfigLite = { + /** Optional table name */ + table?: string + /** Optional geometry column name */ + geometry?: string + /** Layer styling configuration */ + style?: LayerStyle +} + +/** + * Arguments passed to the style building function + */ +export type BuildArgs = { + /** GeoJSON features to be styled */ + features: Array<{ properties: any; geometry: any }> + /** Layer configurations keyed by layer name */ + layers: Record + /** Default styling values */ + defaults?: { + fillColor?: string + lineColor?: string + lineWidth?: number + pointRadius?: number + fillHeight?: number + } +} + +/** + * Result from the style building function + * Contains typed arrays ready for GPU rendering + */ +export type BuildResult = { + /** RGBA fill colors for each feature */ + fillColors: Uint8ClampedArray + /** RGB line colors for each feature */ + lineColors: Uint8ClampedArray + /** Line widths for each feature */ + lineWidths: Float32Array + /** Point radii for each feature */ + pointRadii: Float32Array + /** Fill heights for 3D rendering */ + fillHeights: Float32Array + /** Visibility filter (1=visible, 0=hidden) */ + featureFilter: Float32Array +} diff --git a/src/plugins/polaris/usePolaris.ts b/src/plugins/polaris/usePolaris.ts new file mode 100644 index 000000000..773398721 --- /dev/null +++ b/src/plugins/polaris/usePolaris.ts @@ -0,0 +1,378 @@ +/** + * Core utilities and hooks for POLARIS plugin + * + * This module provides the main data loading and processing functions + * for POLARIS visualizations. It includes memory management, + * database caching, loading queue management, and GeoJSON feature building. + * + * Key features: + * - Shared SPL engine to reduce memory usage + * - Database caching across multiple maps + * - Loading queue to prevent memory exhaustion + * - Support for ATTACH to query across supply/demand/result databases + * + * @fileoverview Core POLARIS Data Processing Functions + * @author SimWrapper Development Team + */ + +import SPL from 'spl.js' +import YAML from 'yaml' +import type { VizDetails, LayerConfig, PolarisSimwrapperConfig, PolarisScenarioConfig } from './types' +import { getTableNames, getTableSchema, getRowCount, fetchGeoJSONFeatures } from './db' + +// ============================================================================ +// GLOBAL LOADING QUEUE - Ensures only one map loads at a time +// ============================================================================ +let loadingQueue: Promise = Promise.resolve() +let queueLength = 0 +let totalMapsLoading = 0 + +/** + * Acquire a slot in the loading queue. Only one map can load at a time. + */ +export function acquireLoadingSlot(): Promise<() => void> { + queueLength++ + totalMapsLoading++ + console.log(`πŸ”’ Queued for loading (position: ${queueLength}, total: ${totalMapsLoading})`) + + let releaseSlot: () => void + + const myTurn = loadingQueue.then(() => { + console.log(`πŸ”“ Acquired loading slot`) + }) + + loadingQueue = new Promise(resolve => { + releaseSlot = () => { + queueLength-- + console.log(`βœ… Released loading slot (remaining in queue: ${queueLength})`) + resolve() + } + }) + + return myTurn.then(() => releaseSlot!) +} + +/** + * Call when a map has fully finished loading + */ +export function mapLoadingComplete(): void { + totalMapsLoading = Math.max(0, totalMapsLoading - 1) +} + +/** + * Get the current total number of maps being loaded. + */ +export function getTotalMapsLoading(): number { + return totalMapsLoading +} + +// ============================================================================ +// SHARED SPL ENGINE - Critical for memory when loading multiple maps +// ============================================================================ +let sharedSpl: any = null +let splInitPromise: Promise | null = null +let splRefCount = 0 + +/** + * Get or create the shared SPL engine. + */ +export async function initSql(): Promise { + splRefCount++ + + if (sharedSpl) { + return sharedSpl + } + + if (splInitPromise) { + return splInitPromise + } + + splInitPromise = SPL().then((spl: any) => { + sharedSpl = spl + splInitPromise = null + console.log('βœ… Shared SPL engine initialized') + return spl + }) + + return splInitPromise +} + +/** + * Release a reference to the shared SPL engine. + */ +export function releaseSql(): void { + splRefCount = Math.max(0, splRefCount - 1) +} + +// ============================================================================ +// DATABASE CACHE - Share database instances across maps using the same file +// ============================================================================ +interface CachedDb { + db: any + refCount: number + path: string +} + +const dbCache = new Map() +const dbLoadPromises = new Map>() + +/** + * Open a database, using cache if available. + */ +export async function openDb(spl: any, arrayBuffer: ArrayBuffer, path?: string): Promise { + if (!path) { + return spl.db(arrayBuffer) + } + + const cached = dbCache.get(path) + if (cached) { + cached.refCount++ + console.log(`πŸ“¦ Reusing cached database: ${path} (refs: ${cached.refCount})`) + return cached.db + } + + const loadingPromise = dbLoadPromises.get(path) + if (loadingPromise) { + const db = await loadingPromise + const nowCached = dbCache.get(path) + if (nowCached) { + nowCached.refCount++ + console.log(`πŸ“¦ Joined loading database: ${path} (refs: ${nowCached.refCount})`) + } + return db + } + + const loadPromise = (async () => { + const db = await spl.db(arrayBuffer) + dbCache.set(path, { db, refCount: 1, path }) + dbLoadPromises.delete(path) + console.log(`πŸ“‚ Loaded and cached database: ${path}`) + return db + })() + + dbLoadPromises.set(path, loadPromise) + return loadPromise +} + +/** + * Release a reference to a cached database. + */ +export function releaseDb(path: string): void { + const cached = dbCache.get(path) + if (!cached) return + + cached.refCount-- + console.log(`πŸ“‰ Database refCount decreased: ${path} (refs: ${cached.refCount})`) + if (cached.refCount <= 0) { + try { + if (typeof cached.db.close === 'function') { + cached.db.close() + } + } catch (e) { + console.warn(`Failed to close database ${path}:`, e) + } + dbCache.delete(path) + console.log(`πŸ—‘οΈ Released cached database: ${path}`) + } +} + +/** + * Attach a secondary database to the main database connection. + * This allows cross-database queries using the schema name. + * + * @param db - Main database connection + * @param spl - SPL engine + * @param arrayBuffer - Secondary database as ArrayBuffer + * @param schemaName - Name to use for the attached database (e.g., 'demand', 'result') + */ +export async function attachDatabase( + db: any, + spl: any, + arrayBuffer: ArrayBuffer, + schemaName: string +): Promise { + // Create a temporary database file in memory for the attached DB + const tempDb = await spl.db(arrayBuffer) + + // SPL.js doesn't support ATTACH directly, so we need to work around this + // by loading each database separately and querying them independently + console.log(`πŸ“Ž Prepared database for attachment as '${schemaName}'`) +} + +/** + * Parse polaris.yaml configuration file + */ +export async function parsePolarisYaml( + yamlText: string, + subfolder: string | null +): Promise<{ simwrapper: PolarisSimwrapperConfig; scenario?: PolarisScenarioConfig }> { + const config = YAML.parse(yamlText) + + return { + simwrapper: config.simwrapper || {}, + scenario: config.scenario || config + } +} + +/** + * Parse scenario_abm.json configuration file to get database paths + */ +export function parseScenarioConfig(jsonText: string): PolarisScenarioConfig { + const config = JSON.parse(jsonText) + return { + description: config.description, + supply_database: config.supply_database, + demand_database: config.demand_database, + result_database: config.result_database, + analysis_iteration: config.analysis_iteration + } +} + +/** + * Build VizDetails from POLARIS configuration + */ +export function buildVizDetails( + simwrapperConfig: PolarisSimwrapperConfig, + scenarioConfig: PolarisScenarioConfig | undefined, + subfolder: string | null, + databases: { supply?: string; demand?: string; result?: string } +): VizDetails { + // Flatten layer configurations from grouped format to flat format + const flatLayers: { [key: string]: LayerConfig } = {} + + if (simwrapperConfig.layers) { + for (const [groupName, groupLayers] of Object.entries(simwrapperConfig.layers)) { + for (const [tableName, layerConfig] of Object.entries(groupLayers)) { + const layerName = `${groupName}_${tableName}` + flatLayers[layerName] = { + ...layerConfig, + table: layerConfig.table || tableName + } + } + } + } + + // Default center: Chicago area (POLARIS is often used for Chicago models) + const defaultCenter: [number, number] = [-87.63, 41.88] + const defaultZoom = 10 + + return { + title: scenarioConfig?.description || 'POLARIS Model', + description: '', + supplyDatabase: databases.supply, + demandDatabase: databases.demand, + resultDatabase: databases.result, + layers: flatLayers, + center: simwrapperConfig.center || defaultCenter, + zoom: simwrapperConfig.zoom ?? defaultZoom, + bearing: simwrapperConfig.bearing, + pitch: simwrapperConfig.pitch, + geometryLimit: simwrapperConfig.geometryLimit, + coordinatePrecision: simwrapperConfig.coordinatePrecision, + minimalProperties: simwrapperConfig.minimalProperties, + defaults: simwrapperConfig.defaults, + legend: simwrapperConfig.legend, + analysisIteration: scenarioConfig?.analysis_iteration + } +} + +export async function buildTables( + db: any, + layerConfigs: { [k: string]: LayerConfig }, + allNames?: string[] +) { + const names = allNames ?? (await getTableNames(db)) + const select = Object.keys(layerConfigs).length + ? [...new Set(Object.values(layerConfigs).map(c => c.table))] + : ['Link', 'Node', 'Zone'] // Default POLARIS tables + + const tables: Array<{ name: string; type: string; rowCount: number; columns: any[] }> = [] + let hasGeometry = false + + for (const name of names) { + if (!select.includes(name)) continue + const schema = await getTableSchema(db, name) + const rowCount = await getRowCount(db, name) + const hasGeomCol = schema.some((c: any) => c.name.toLowerCase() === 'geometry') + if (hasGeomCol) hasGeometry = true + tables.push({ name, type: 'table', rowCount, columns: schema }) + } + return { tables, hasGeometry } +} + +/** + * Options for memory optimization when building geo features + */ +export interface GeoFeatureOptions { + /** Maximum number of features per layer (default: 100000) */ + limit?: number + /** Decimal precision for coordinates (default: 5) */ + coordinatePrecision?: number + /** Only store properties used for styling (default: true) */ + minimalProperties?: boolean +} + +/** + * Build GeoJSON features from database tables. + */ +export async function buildGeoFeatures( + db: any, + tables: any[], + layerConfigs: { [k: string]: LayerConfig }, + options?: GeoFeatureOptions +) { + const plain = JSON.parse(JSON.stringify(layerConfigs)) + const layersToProcess = Object.keys(plain).length + ? Object.entries(plain) + : tables + .filter(t => t.columns.some((c: any) => c.name.toLowerCase() === 'geometry')) + .map(t => [t.name, { table: t.name, type: 'line' as const }]) + + const features: any[] = [] + + for (const [layerName, cfg] of layersToProcess as any) { + const layerConfig = cfg as LayerConfig + const tableName = layerConfig.table || layerName + const table = tables.find(t => t.name === tableName) + if (!table) continue + if (!table.columns.some((c: any) => c.name.toLowerCase() === 'geometry')) continue + + const layerFeatures = await fetchGeoJSONFeatures( + db, + table, + layerName, + cfg, + options + ) + + for (let i = 0; i < layerFeatures.length; i++) { + features.push(layerFeatures[i]) + } + + await new Promise(resolve => setTimeout(resolve, 50)) + } + + return features +} + +/** + * Auto-detect POLARIS database files in a folder + */ +export async function autoDetectDatabases( + files: string[] +): Promise<{ supply?: string; demand?: string; result?: string }> { + const result: { supply?: string; demand?: string; result?: string } = {} + + for (const file of files) { + const lower = file.toLowerCase() + if (lower.includes('supply') && (lower.endsWith('.sqlite') || lower.endsWith('.db'))) { + result.supply = file + } else if (lower.includes('demand') && (lower.endsWith('.sqlite') || lower.endsWith('.db'))) { + result.demand = file + } else if (lower.includes('result') && (lower.endsWith('.sqlite') || lower.endsWith('.db'))) { + result.result = file + } + } + + return result +}