diff --git a/app.old/.eslintrc.json b/app.old/.eslintrc.json deleted file mode 100644 index 0ad09f5..0000000 --- a/app.old/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["next/babel","next/core-web-vitals"] -} diff --git a/app.old/.gitignore b/app.old/.gitignore deleted file mode 100644 index fd3dbb5..0000000 --- a/app.old/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/app.old/.npmrc b/app.old/.npmrc deleted file mode 100644 index b6f27f1..0000000 --- a/app.old/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict=true diff --git a/app.old/Dockerfile b/app.old/Dockerfile deleted file mode 100644 index 8a34308..0000000 --- a/app.old/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -FROM ubuntu:22.04 -# see https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ - -ARG warp_env -ENV WARP_ENV=$warp_env - -# use the latest stable nginx -# https://nginx.org/en/CHANGES -RUN apt-get update && apt-get install -y \ - curl \ - gnupg2 \ - ca-certificates \ - lsb-release \ - ubuntu-keyring - -RUN curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ - | tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null - -RUN echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \ -http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \ - | tee /etc/apt/sources.list.d/nginx.list - -RUN apt-get update && apt-get install -y \ - nginx \ - openssl - -# RUN rm -rf /var/lib/apt/sources.list.d/* - -# print the nginx version -RUN nginx -V - -ADD nginx/build/ /etc/nginx/ -ADD build /www/app - -COPY build/${WARP_ENV}/status.json /srv/warp/status/status.json - -EXPOSE 80 - -# see https://ubuntu.com/blog/avoiding-dropped-connections-in-nginx-containers-with-stopsignal-sigquit -STOPSIGNAL SIGQUIT -CMD ["nginx", "-g", "daemon off;"] diff --git a/app.old/Makefile b/app.old/Makefile deleted file mode 100644 index e30d365..0000000 --- a/app.old/Makefile +++ /dev/null @@ -1,29 +0,0 @@ - -NODE_VERSION := v20.10.0 - -all: clean build - -clean: - rm -rf build - -webpack: - # Outputs build artifacts to ./build - . ${NVM_DIR}/nvm.sh && \ - nvm exec ${NODE_VERSION} npm ci && \ - nvm exec ${NODE_VERSION} npm run build - # FIXME - # nvm exec ${NODE_VERSION} npm audit && \ - -warp_build: - $(MAKE) webpack - python ../webgen/webgen.py clean nginx/gen.py - python ../webgen/webgen.py build nginx/gen.py - mkdir -p build/${WARP_ENV} - echo "{\"version\":\"${WARP_VERSION}\",\"status\":\"ok\"}" > build/${WARP_ENV}/status.json - docker buildx build --progress plain \ - --build-arg warp_env=${WARP_ENV} \ - --platform linux/arm64/v8,linux/amd64 \ - -t ${WARP_DOCKER_NAMESPACE}/${WARP_DOCKER_IMAGE}:${WARP_DOCKER_VERSION} \ - --no-cache \ - --push \ - . diff --git a/app.old/README.md b/app.old/README.md deleted file mode 100644 index 7a61fcd..0000000 --- a/app.old/README.md +++ /dev/null @@ -1,55 +0,0 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). - -## Getting Started - -To start the development server, use: - -```bash -npm run dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -## API server - -On production, the API server is https://api.bringyour.com. However, if you try to communicate with this API when running locally, you will run into a CORS error. - -To solve this problem, the development build is configured to communicate with http://test.bringyour.com, which proxies through to https://api.bringyour.com. To make this setup work, you will need to the following: - -1. To `/etc/hosts` add: -``` -127.0.0.1 test.bringyour.com -``` - -1. Run an nginx server locally with the following config: -``` -http { - server { - listen 80; - listen 443; - server_name test.bringyour.com; - - location / { - proxy_set_header Referer https://bringyour.com; - proxy_set_header Origin https://bringyour.com; - proxy_pass https://api.bringyour.com; - proxy_hide_header 'access-control-allow-origin'; - add_header Access-Control-Allow-Origin http://localhost:3000; - } - } -} -``` - -## Building for production - -To create a production build use: - -```bash -make build -``` -or -``` -npm run build -``` - -The build artifacts will be saved in the `web/app/build/` directory. \ No newline at end of file diff --git a/app.old/index.html b/app.old/index.html deleted file mode 100644 index f9c2d62..0000000 --- a/app.old/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - BringYour - - - Manage Your Network - - \ No newline at end of file diff --git a/app.old/next.config.js b/app.old/next.config.js deleted file mode 100644 index 612ff2e..0000000 --- a/app.old/next.config.js +++ /dev/null @@ -1,7 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - distDir: 'build', - output: 'export', -} - -module.exports = nextConfig diff --git a/app.old/nginx/nginx.conf.j2 b/app.old/nginx/nginx.conf.j2 deleted file mode 100644 index 4612f62..0000000 --- a/app.old/nginx/nginx.conf.j2 +++ /dev/null @@ -1,74 +0,0 @@ - -user www-data; -pid /run/nginx.pid; -include /etc/nginx/modules-enabled/*.conf; - - -# target concurrent users (from sites.yml): 589824 -# https://www.nginx.com/blog/tuning-nginx/ -worker_processes auto; -events { - worker_connections 8192; - multi_accept on; -} - - -http { - ## - # Basic Settings - ## - - sendfile on; - # minimize latency - tcp_nodelay on; - tcp_nopush off; - types_hash_max_size 2048; - server_tokens off; - - include /etc/nginx/mime.types; - default_type application/octet-stream; - - ## - # Logging Settings - ## - - access_log /dev/stdout; - error_log stderr; - - ## - # Gzip Settings - ## - - gzip on; - - - server { - listen 80 default_server; - - absolute_redirect off; - - location =/status { - alias /srv/warp/status/status.json; - add_header 'Content-Type' 'application/json'; - } - location / { - try_files $uri $uri.html $uri/ =404; - alias /www/app/; - - add_header 'Cache-Control' 'no-cache'; - add_header 'Last-Modified' '{{ http_last_modified }}'; - add_header 'ETag' '"{{ http_etag }}"'; - } - # app resources are content addressed, meaning the name changes when the content changes - # use a separate location block per rec in "if is evil" - # https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ - location ~ \.(js|css)$ { - try_files $uri =404; - alias /www/app/; - - add_header 'Cache-Control' 'max-age=86400'; - add_header 'Last-Modified' '{{ http_last_modified }}'; - add_header 'ETag' '"{{ http_etag }}"'; - } - } -} diff --git a/app.old/package-lock.json b/app.old/package-lock.json deleted file mode 100644 index f1ef366..0000000 --- a/app.old/package-lock.json +++ /dev/null @@ -1,4683 +0,0 @@ -{ - "name": "bringyour-app", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "bringyour-app", - "version": "0.1.0", - "dependencies": { - "@headlessui/react": "^1.7.17", - "@headlessui/tailwindcss": "^0.2.0", - "@heroicons/react": "^2.1.1", - "@tanstack/react-query": "^5.14.2", - "heroicons": "^2.1.1", - "moment": "^2.30.1", - "next": "14.0.4", - "react": "^18", - "react-dom": "^18", - "recharts": "^2.10.3" - }, - "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "eslint": "^8", - "eslint-config-next": "14.0.4", - "postcss": "^8", - "tailwindcss": "^3.3.0", - "typescript": "^5" - }, - "engines": { - "node": ">= 20.10.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@headlessui/react": { - "version": "1.7.17", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.17.tgz", - "integrity": "sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==", - "dependencies": { - "client-only": "^0.0.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" - } - }, - "node_modules/@headlessui/tailwindcss": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@headlessui/tailwindcss/-/tailwindcss-0.2.0.tgz", - "integrity": "sha512-fpL830Fln1SykOCboExsWr3JIVeQKieLJ3XytLe/tt1A0XzqUthOftDmjcCYLW62w7mQI7wXcoPXr3tZ9QfGxw==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "tailwindcss": "^3.0" - } - }, - "node_modules/@heroicons/react": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.1.tgz", - "integrity": "sha512-JyyN9Lo66kirbCMuMMRPtJxtKJoIsXKS569ebHGGRKbl8s4CtUfLnyKJxteA+vIKySocO4s1SkTkGS4xtG/yEA==", - "peerDependencies": { - "react": ">= 16" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@next/env": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.4.tgz", - "integrity": "sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.4.tgz", - "integrity": "sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==", - "dev": true, - "dependencies": { - "glob": "7.1.7" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz", - "integrity": "sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz", - "integrity": "sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz", - "integrity": "sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz", - "integrity": "sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz", - "integrity": "sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz", - "integrity": "sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz", - "integrity": "sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz", - "integrity": "sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz", - "integrity": "sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.1.tgz", - "integrity": "sha512-UY+FGM/2jjMkzQLn8pxcHGMaVLh9aEitG3zY2CiY7XHdLiz3bZOwa6oDxNqEMv7zZkV+cj5DOdz0cQ1BP5Hjgw==", - "dev": true - }, - "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.14.2.tgz", - "integrity": "sha512-QmoJvC72sSWs3hgGis8JdmlDvqLfYGWUK4UG6OR9Q6t28JMN9m2FDwKPqoSJ9YVocELCSjMt/FGjEiLfk8000Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.14.2.tgz", - "integrity": "sha512-SbOzV7UBW8ED3tOnyn6kqNGscnOAfoxShYlbvaQo/5528mDZKpvrwoL/1du1/ukSC6RMAiKmx95SrYqlwPzWDw==", - "dependencies": { - "@tanstack/query-core": "5.14.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz", - "integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", - "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", - "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz", - "integrity": "sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.15.0", - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/typescript-estree": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz", - "integrity": "sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.15.0.tgz", - "integrity": "sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz", - "integrity": "sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz", - "integrity": "sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.15.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001570", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", - "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "dependencies": { - "@babel/runtime": "^7.1.2" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.614", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", - "integrity": "sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.0.4.tgz", - "integrity": "sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "14.0.4", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-equals": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", - "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "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==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/heroicons": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/heroicons/-/heroicons-2.1.1.tgz", - "integrity": "sha512-54kHbrxsTyAJJU7z07XN1OrVBX8ogN/tbclP8Doxk0X4IQmR6LEhLzJBkFK9Yc814NoXG6ZJBh9Bi/qvauzjfA==" - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "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==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "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==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/next": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/next/-/next-14.0.4.tgz", - "integrity": "sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==", - "dependencies": { - "@next/env": "14.0.4", - "@swc/helpers": "0.5.2", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.0.4", - "@next/swc-darwin-x64": "14.0.4", - "@next/swc-linux-arm64-gnu": "14.0.4", - "@next/swc-linux-arm64-musl": "14.0.4", - "@next/swc-linux-x64-gnu": "14.0.4", - "@next/swc-linux-x64-musl": "14.0.4", - "@next/swc-win32-arm64-msvc": "14.0.4", - "@next/swc-win32-ia32-msvc": "14.0.4", - "@next/swc-win32-x64-msvc": "14.0.4" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "engines": { - "node": ">=14" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-smooth": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.5.tgz", - "integrity": "sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==", - "dependencies": { - "fast-equals": "^5.0.0", - "react-transition-group": "2.9.0" - }, - "peerDependencies": { - "prop-types": "^15.6.0", - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "dependencies": { - "dom-helpers": "^3.4.0", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0", - "react-dom": ">=15.0.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recharts": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.3.tgz", - "integrity": "sha512-G4J96fKTZdfFQd6aQnZjo2nVNdXhp+uuLb00+cBTGLo85pChvm1+E67K3wBOHDE/77spcYb2Cy9gYWVqiZvQCg==", - "dependencies": { - "clsx": "^2.0.0", - "eventemitter3": "^4.0.1", - "lodash": "^4.17.19", - "react-is": "^16.10.2", - "react-smooth": "^2.0.5", - "recharts-scale": "^0.4.4", - "tiny-invariant": "^1.3.1", - "victory-vendor": "^36.6.8" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "prop-types": "^15.6.0", - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/recharts-scale": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", - "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", - "dependencies": { - "decimal.js-light": "^2.4.1" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz", - "integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/victory-vendor": { - "version": "36.7.0", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.7.0.tgz", - "integrity": "sha512-nqYuTkLSdTTeACyXcCLbL7rl0y6jpzLPtTNGOtSnajdR+xxMxBdjMxDjfNJNlhR+ZU8vbXz+QejntcbY7h9/ZA==", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/app.old/package.json b/app.old/package.json deleted file mode 100644 index 96aeead..0000000 --- a/app.old/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "bringyour-app", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "NEXT_PUBLIC_API_URL=http://test.bringyour.com/ next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "engines": { - "node": ">= 20.10.0" - }, - "engineStrict": true, - "dependencies": { - "@headlessui/react": "^1.7.17", - "@headlessui/tailwindcss": "^0.2.0", - "@heroicons/react": "^2.1.1", - "@tanstack/react-query": "^5.14.2", - "heroicons": "^2.1.1", - "moment": "^2.30.1", - "next": "14.0.4", - "react": "^18", - "react-dom": "^18", - "recharts": "^2.10.3" - }, - "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "eslint": "^8", - "eslint-config-next": "14.0.4", - "postcss": "^8", - "tailwindcss": "^3.3.0", - "typescript": "^5" - } -} diff --git a/app.old/postcss.config.js b/app.old/postcss.config.js deleted file mode 100644 index 33ad091..0000000 --- a/app.old/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/app.old/public/account_icon.svg b/app.old/public/account_icon.svg deleted file mode 100644 index 492f4d9..0000000 --- a/app.old/public/account_icon.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - Container - - - - - - - - - - \ No newline at end of file diff --git a/app.old/public/bringyour-logo.webp b/app.old/public/bringyour-logo.webp deleted file mode 100644 index 243109f..0000000 Binary files a/app.old/public/bringyour-logo.webp and /dev/null differ diff --git a/app.old/public/bringyour_logo_full.png b/app.old/public/bringyour_logo_full.png deleted file mode 100644 index 1cc67e4..0000000 Binary files a/app.old/public/bringyour_logo_full.png and /dev/null differ diff --git a/app.old/public/devices_icon.svg b/app.old/public/devices_icon.svg deleted file mode 100644 index 918d8fd..0000000 --- a/app.old/public/devices_icon.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - Container - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app.old/public/provide_icon.svg b/app.old/public/provide_icon.svg deleted file mode 100644 index 52fff4f..0000000 --- a/app.old/public/provide_icon.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - Container - - - - - - - - \ No newline at end of file diff --git a/app.old/src/app/(pages)/account/add-balance/page.tsx b/app.old/src/app/(pages)/account/add-balance/page.tsx deleted file mode 100644 index c366d18..0000000 --- a/app.old/src/app/(pages)/account/add-balance/page.tsx +++ /dev/null @@ -1,171 +0,0 @@ -"use client"; - -import { - postSubscriptionCheckBalanceCode, - postSubscriptionRedeemBalanceCode, -} from "@/app/_lib/api"; -import { Breadcrumbs } from "@/app/_lib/components/Breadcrumbs"; -import Button from "@/app/_lib/components/Button"; -import { prettyPrintByteCount } from "@/app/_lib/utils"; -import { - CheckBadgeIcon, - CheckCircleIcon, - ExclamationCircleIcon, -} from "@heroicons/react/24/solid"; -import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { useSearchParams } from "next/navigation"; -import { useState } from "react"; - -export default function Page() { - const queryClient = useQueryClient(); - const queryParams = useSearchParams(); - const paramCode = queryParams.get("redeem-balance-code") || ""; - - const [code, setCode] = useState(paramCode); - const [isCodeTouched, setIsCodeTouched] = useState( - Boolean(paramCode) - ); - const [isCodeValid, setIsCodeValid] = useState(Boolean(paramCode)); - const [codeErrorMessage, setCodeErrorMessage] = useState(); - - const validateCodeAsync = async (code: string) => { - try { - const result = await postSubscriptionCheckBalanceCode({ - secret: code, - }); - - if (result.balance) { - setIsCodeValid(true); - setCodeErrorMessage(undefined); - } else { - setIsCodeValid(false); - setCodeErrorMessage( - result.error?.message || "This code is not valid, or has expired" - ); - } - return result; - } catch (error) { - setIsCodeValid(false); - setCodeErrorMessage("Sorry, we're unable to check if the code is valid"); - } - return null; - }; - - const handleOnChange = async (event: React.ChangeEvent) => { - const code = event.target.value; - setCode(code); - - if (!code || code == "" || code == undefined) { - setIsCodeValid(false); - setCodeErrorMessage("Please enter a code"); - } else { - setIsCodeValid(true); - setCodeErrorMessage(undefined); - } - }; - - const shouldShowError = codeErrorMessage && isCodeTouched; - - const { data: redeemBalanceResult, mutateAsync: mutateRedeemBalanceAsync } = - useMutation({ - mutationKey: ["subscription", "redeem", "code", code], - mutationFn: (code: string) => - postSubscriptionRedeemBalanceCode({ secret: code }), - onSuccess: () => { - queryClient.invalidateQueries({ - queryKey: ["subscription", "balance"], - }); - }, - }); - - const handleSubmitCode = async ( - event: React.MouseEvent - ) => { - event.preventDefault(); - if (!code) { - return; - } - const result = await validateCodeAsync(code); - - if (!result || result.error || !result.balance) { - return; - } - await mutateRedeemBalanceAsync(code); - }; - - return ( -
- -

Add balance

- - {true && ( -
{}}> -
-
- -
- setIsCodeTouched(true)} - placeholder="e.g. 249384883cf27ff2d844f379610da79e" - className={`w-full block rounded-md bg-transparent py-2 px-2 pr-12 text-gray-900 placeholder:text-gray-400 ring-1 ring-gray-400 sm:text-sm sm:leading-6 ${ - shouldShowError ? "ring-red-500" : "" - }`} - /> -
- {shouldShowError && ( -
-
- {shouldShowError && ( -
-

{codeErrorMessage}

-
- )} -
- -
- {redeemBalanceResult && redeemBalanceResult.transfer_balance && ( -
-

Success!

- -

- {prettyPrintByteCount( - redeemBalanceResult.transfer_balance?.balance_byte_count! - )}{" "} - was added to your balance -

-
- )} -
- )} -
- ); -} diff --git a/app.old/src/app/(pages)/account/loading.tsx b/app.old/src/app/(pages)/account/loading.tsx deleted file mode 100644 index cd0008b..0000000 --- a/app.old/src/app/(pages)/account/loading.tsx +++ /dev/null @@ -1,10 +0,0 @@ -export default function Loading() { - return ( - <> -
-
-
-
- - ); -} diff --git a/app.old/src/app/(pages)/account/page.tsx b/app.old/src/app/(pages)/account/page.tsx deleted file mode 100644 index 74f2552..0000000 --- a/app.old/src/app/(pages)/account/page.tsx +++ /dev/null @@ -1,62 +0,0 @@ -"use client"; - -import { getSubscriptionBalance } from "@/app/_lib/api"; -import { useQuery } from "@tanstack/react-query"; -import Loading from "./loading"; -import Link from "next/link"; -import { prettyPrintByteCount } from "@/app/_lib/utils"; - -export default function Page() { - const { isPending, data: result } = useQuery({ - queryKey: ["subscription", "balance"], - queryFn: async () => await getSubscriptionBalance(), - }); - - const currentSubscription = result?.current_subscription; - const wallet = result?.wallet_info; - - return ( - <> -
-
-

Account

-
- - {isPending && } - - {!isPending && ( -
-
-
-

Subscriptions

-
- - - -
-

- Transfer balance:{" "} - {prettyPrintByteCount(result?.balance_byte_count!)} -

- {!currentSubscription &&

No current subscriptions found

} - {currentSubscription &&

{currentSubscription.plan}

} -
- -
-

Wallet

- {!wallet &&

No wallet found

} - {wallet && ( - <> -

- Balance:{" "} - {wallet.balance_usdc_nano_cents / 1_000_000_000} USDC -

- - )} -
-
- )} -
- - ); -} diff --git a/app.old/src/app/(pages)/components/Sidebar.tsx b/app.old/src/app/(pages)/components/Sidebar.tsx deleted file mode 100644 index 9146aa1..0000000 --- a/app.old/src/app/(pages)/components/Sidebar.tsx +++ /dev/null @@ -1,284 +0,0 @@ -"use client"; - -import Link from "next/link"; -import { Bars3Icon, XMarkIcon } from "@heroicons/react/24/outline"; -import { redirect, usePathname } from "next/navigation"; -import { Fragment, useEffect, useState } from "react"; -import { Dialog, Transition } from "@headlessui/react"; -import { useQuery } from "@tanstack/react-query"; -import { - getJwt, - getLoginUrl, - getSubscriptionBalance, - removeJwt, -} from "@/app/_lib/api"; -import { classNames, prettyPrintByteCount } from "@/app/_lib/utils"; - -const navigation = [ - { - name: "Devices", - href: "/devices", - icon: "/devices_icon.svg", - bg_color: "bg-[#2B3A82] hover:bg-[#2E3E9F]", - }, - { - name: "Provide", - href: "/provide", - icon: "/provide_icon.svg", - bg_color: "bg-[#1E644E] hover:bg-[#24775B]", - }, - { - name: "Account", - href: "/account", - icon: "/account_icon.svg", - bg_color: "bg-[#5A4E53] hover:bg-[#73636A]", - }, -]; - -// Copied from web/bringyour.com/client.js -// see https://stackoverflow.com/questions/38552003/how-to-decode-jwt-token-in-javascript-without-using-a-library -function parseJwt(jwt: string) { - var base64Url = jwt.split(".")[1]; - var base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/"); - var jsonPayload = decodeURIComponent( - window - .atob(base64) - .split("") - .map(function (c) { - return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2); - }) - .join("") - ); - - return JSON.parse(jsonPayload); -} - -function SidebarContent() { - const [networkName, setNetworkName] = useState(null); - - const { isPending, data: subscriptionBalanceResult } = useQuery({ - queryKey: ["subscription", "balance"], - queryFn: async () => await getSubscriptionBalance(), - }); - - const wallet = subscriptionBalanceResult?.wallet_info; - - useEffect(() => { - const jwt = getJwt(); - const networkAddon = jwt ? parseJwt(jwt)?.network_name : null; - setNetworkName(networkAddon ? `${networkAddon}.bringyour.network` : null); - }, []); - - const signOut = () => { - removeJwt(); - redirect(getLoginUrl()); - }; - - return ( -
-
- BringYour logo -
- -
- {networkName &&

{networkName}

} - { - !networkName && ( -
- ) /* Stops subsequent content from jumping up and down */ - } -
- -
- {isPending && ( -
- )} - - {!isPending && ( - <> -

- {prettyPrintByteCount( - subscriptionBalanceResult?.balance_byte_count! - )} -

- -

- add balance -

- - - )} -
- -
- {isPending && ( -
- )} - - {!isPending && ( - <> -

- {( - wallet && wallet.balance_usdc_nano_cents / 1_000_000_000 - )?.toPrecision(3) || "-"}{" "} - USDC -

- {!wallet && ( -

- No wallet found -

- )} - {wallet && ( -

- earn by providing -

- )} - - )} -
- -
-

- Manage your network -

- -
- -
- -
- signOut()}> - Sign out - -

- - Terms - -  |  - - Privacy - -  |  - - VDP - -

-

Copyright 2024 BringYour, Inc.

-
-
- ); -} - -export default function Sidebar() { - const pathname = usePathname().split("?")[0]; - const [sidebarOpen, setSidebarOpen] = useState(false); - - return ( - <> - {/* Modal popup menu for mobile */} -
- - - -
- - -
- - - -
- -
-
- -
-
-
-
-
-
- - {/* Desktop sidebar */} - - - {/* Collapsed mobile sidebar */} -
- - -
- BringYour -
-
- - ); -} diff --git a/app.old/src/app/(pages)/devices/add/components/Poll.tsx b/app.old/src/app/(pages)/devices/add/components/Poll.tsx deleted file mode 100644 index 2e42dba..0000000 --- a/app.old/src/app/(pages)/devices/add/components/Poll.tsx +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Function to poll an endpoint every 2 seconds - * - * Todo(Awais): This can probably be factored out into a separate, reusable polling - * component. - */ - -import { postDeviceAdoptStatus, postDeviceShareStatus } from "@/app/_lib/api"; -import PulseLoader from "@/app/_lib/components/LoadingSpinner"; -import { DeviceAddResult } from "@/app/_lib/types"; -import { CheckBadgeIcon } from "@heroicons/react/24/solid"; -import { useQuery } from "@tanstack/react-query"; -import { useState } from "react"; - -const POLLING_INTERVAL = 2000; // milliseconds - -type PollProps = { - result: DeviceAddResult; -}; - -export default function Poll({ result }: PollProps) { - const [isPolling, setIsPolling] = useState(true); - - const codeType = result.code_type; - const code = result.code; - - const pollingFunction = () => { - if (codeType == "share") return postDeviceShareStatus; - else if (codeType == "adopt") return postDeviceAdoptStatus; - else throw new Error(`Uknown code_type: ${codeType}`); - }; - - const { - isLoading, - data: deviceShareStatus, - isError, - } = useQuery({ - queryKey: ["device", codeType, "status", code], - queryFn: async () => pollingFunction()({ share_code: code }), - enabled: isPolling, - refetchInterval: (query) => { - if ((!query.state.data || query.state.data?.pending) && isPolling) { - return POLLING_INTERVAL; - } - - // Success! We're no longer pending - setIsPolling(false); - return false; - }, - }); - - const ErrorState = () => ( -
-

Sorry, something went wrong

-
- ); - - const PendingState = () => ( -
-

{`Waiting for ${codeType} confirmation`}

- -

- You may leave this page. The device will show as pending in your devices - list until it is confirmed. -

-
- ); - - const SuccessState = () => ( -
-

Success!

-

New device added

- -

- Your new device is viewable in the devices list -

-
- ); - - return ( - <> - {isError && } - {(isLoading || isPolling) && } - {deviceShareStatus && !deviceShareStatus.pending && } - - ); -} diff --git a/app.old/src/app/(pages)/devices/add/page.tsx b/app.old/src/app/(pages)/devices/add/page.tsx deleted file mode 100644 index 4e34ea3..0000000 --- a/app.old/src/app/(pages)/devices/add/page.tsx +++ /dev/null @@ -1,120 +0,0 @@ -"use client"; - -import { postDeviceAdd } from "@/app/_lib/api"; -import { Breadcrumbs } from "@/app/_lib/components/Breadcrumbs"; -import Button from "@/app/_lib/components/Button"; -import { useMutation } from "@tanstack/react-query"; -import { useSearchParams } from "next/navigation"; -import React, { useEffect, useState } from "react"; -import Poll from "./components/Poll"; - -export default function Page() { - // If there were moore fields, I would use a library like Formik for error handling - const queryParams = useSearchParams(); - const [code, setCode] = useState(queryParams.get("code") || ""); - const [isCodeTouched, setIsCodeTouched] = useState(false); - const [codeErrorMessage, setCodeErrorMessage] = useState(); - - const validateCode = (code: string | undefined) => { - if (!code || code == "" || code == undefined) { - setCodeErrorMessage("Please enter a code"); - } else { - setCodeErrorMessage(undefined); - } - }; - - const handleOnChange = (event: React.ChangeEvent) => { - setCode(event.target.value); - validateCode(event.target.value); - }; - - const { - data: deviceAddResult, - isError, - mutateAsync, - } = useMutation({ - mutationFn: async (code: string) => await postDeviceAdd({ code: code }), - }); - - const handleAddDevice = async ( - event: React.MouseEvent - ): Promise => { - event.preventDefault(); - const result = await mutateAsync(code); - if (result.error) { - setCodeErrorMessage(result.error.message); - } - }; - - const hasError = codeErrorMessage !== undefined; - const shouldShowCodeError = codeErrorMessage !== undefined && isCodeTouched; - - useEffect(() => { - validateCode(code); - }, []); - - return ( - <> -
- -

Add a new device

- - {isError && ( -
-

Sorry, something went wrong...

-
- )} - - {deviceAddResult && !deviceAddResult.error && ( - - )} - - {(!deviceAddResult || deviceAddResult.error) && ( -
{}}> -
-
- - setIsCodeTouched(true)} - placeholder="e.g. 249384883cf27ff2d844f379610da79e" - className={`w-full block rounded-md bg-transparent py-2 px-2 text-gray-900 placeholder:text-gray-400 ring-1 ring-gray-400 sm:text-sm sm:leading-6 ${ - shouldShowCodeError ? "ring-red-500" : "" - }`} - > - {shouldShowCodeError && ( -
-

{codeErrorMessage}

-
- )} -
- -
-
- )} -
- - ); -} diff --git a/app.old/src/app/(pages)/devices/components/DeviceDetail.tsx b/app.old/src/app/(pages)/devices/components/DeviceDetail.tsx deleted file mode 100644 index 5d290dd..0000000 --- a/app.old/src/app/(pages)/devices/components/DeviceDetail.tsx +++ /dev/null @@ -1,325 +0,0 @@ -"use client"; - -import { - getDeviceAssociations, - getNetworkClients, - postDeviceConfirmShare, - postDeviceCreateShareCode, - postDeviceRemoveAssociation, - postRemoveNetworkClient, -} from "@/app/_lib/api"; -import { Breadcrumbs } from "@/app/_lib/components/Breadcrumbs"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import Loading from "../loading"; -import Button from "@/app/_lib/components/Button"; -import { useState } from "react"; -import { ConfirmDeleteModal } from "@/app/_lib/components/ConfirmDeleteModal"; -import { redirect, useRouter } from "next/navigation"; -import ShareDeviceDialog from "./ShareDeviceDialog"; - -type DeviceDetailProps = { - clientId: string; -}; - -export default function DeviceDetail({ clientId }: DeviceDetailProps) { - const queryClient = useQueryClient(); - const router = useRouter(); - - const [networkToRemove, setNetworkToRemove] = useState<{ - code: string; - network_name?: string; - }>(); - const [showDeleteDeviceModal, setShowDeleteDeviceModal] = useState(false); - const [showShareDeviceModal, setShowShareDeviceModal] = useState(false); - - const { isPending: isClientsPending, data: clients } = useQuery({ - queryKey: ["network", "clients"], - queryFn: async () => (await getNetworkClients()).clients, - }); - - const { isPending: isAssociationsPending, data: associations } = useQuery({ - queryKey: ["device", "associations"], - queryFn: getDeviceAssociations, - }); - - const outgoingSharedDevices = associations?.outgoing_shared_devices; - const client = clients?.filter((client) => client.client_id == clientId)[0]; - - if (!isClientsPending && !client) { - return ( -
- - -
-

{clientId}

-

No device found.

-
-
- ); - } - - const getOutgoingNetworks = (clientId: string) => { - return outgoingSharedDevices?.filter( - (device) => device.client_id == clientId - ); - }; - - const { - data: shareCodeResult, - mutateAsync: mutateDeviceCreateShareCodeAsync, - } = useMutation({ - mutationKey: ["device", "create", "share", "code", clientId], - mutationFn: async () => { - return await postDeviceCreateShareCode({ - client_id: clientId, - device_name: clientId, // Todo(awais): There must be a better device name? - }); - }, - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const { mutateAsync: mutateConfirmShareAsync } = useMutation({ - mutationKey: ["device", "confirm", "share"], - mutationFn: async ({ - code, - associated_network_name, - }: { - code: string; - associated_network_name: string | null; - }) => - await postDeviceConfirmShare({ - share_code: code, - associated_network_name, - }), - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const { mutateAsync: mutateRemoveAssociationAsync } = useMutation({ - mutationKey: ["device", "remove", "association"], - mutationFn: async (code: string) => - await postDeviceRemoveAssociation({ code }), - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const { mutateAsync: mutateRemoveNetworkClientAsync } = useMutation({ - mutationKey: ["remove", "network", "client"], - mutationFn: async (clientId: string) => - await postRemoveNetworkClient({ client_id: clientId }), - onSettled: () => - queryClient.invalidateQueries({ queryKey: ["network", "clients"] }), - }); - - const handleConfirmShare = async ( - code: string, - associated_network_name: string - ) => { - await mutateConfirmShareAsync({ - code: code, - associated_network_name: associated_network_name, - }); - }; - - const handleShareDevice = async ( - event: React.MouseEvent - ) => { - await mutateDeviceCreateShareCodeAsync(); - setShowShareDeviceModal(true); - }; - - const handleConfirmCancel = async (code: string) => { - await mutateRemoveAssociationAsync(code); - }; - - const handleRemoveAssociation = async (code: string) => { - await mutateRemoveAssociationAsync(code); - }; - - const handleRemoveNetworkClient = async (clientId: string) => { - await mutateRemoveNetworkClientAsync(clientId); - }; - - return ( - <> - {networkToRemove && ( - { - if (!value) { - setNetworkToRemove(undefined); - } - }} - onConfirm={async () => - await handleRemoveAssociation(networkToRemove.code) - } - > -

- Are you sure you want to stop sharing with{" "} - {networkToRemove.network_name}? -

-

You won't be able to undo this action.

-
- )} - - {shareCodeResult && showShareDeviceModal && ( - - )} - - { - await handleRemoveNetworkClient(clientId); - router.push("/devices"); - }} - > -

- Are you sure you want to delete{" "} - {clientId}? -

-

You won't be able to undo this action.

-
- -
- - -
-

{clientId}

- {isClientsPending && ( -
- )} - {!isClientsPending && client && ( -

{client.description}

- )} -
-
-

Shared with

-
- -
- - {(isClientsPending || isAssociationsPending) && } - - {!isClientsPending && !isAssociationsPending && ( - <> - {(!getOutgoingNetworks(clientId) || - getOutgoingNetworks(clientId)?.length == 0) && ( -
-

Not shared with any networks

-
- )} - - {(getOutgoingNetworks(clientId)?.length || 0) > 0 && ( -
- {getOutgoingNetworks(clientId)?.map((network) => ( -
- {network.pending && !network.network_name && ( - <> -

- Code generated:{" "} - {network.code} -

-
-
- -
- - )} - - {network.pending && network.network_name && ( - <> -

- Shared with {network.network_name}{" "} - {network.pending && "(awaiting confirmation)"} -

-
- -
- - -
- - )} - {!network.pending && ( - <> -

- Shared with {network.network_name}{" "} - {network.pending && "(awaiting confirmation)"} -

-
- -
- -
- - )} -
- ))} -
- )} - -
- -
- - )} -
- - ); -} diff --git a/app.old/src/app/(pages)/devices/components/DeviceList.tsx b/app.old/src/app/(pages)/devices/components/DeviceList.tsx deleted file mode 100644 index ae902c8..0000000 --- a/app.old/src/app/(pages)/devices/components/DeviceList.tsx +++ /dev/null @@ -1,254 +0,0 @@ -"use client"; - -import { DevicePhoneMobileIcon } from "@heroicons/react/24/outline"; -import { PlusIcon } from "@heroicons/react/24/solid"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import Loading from "../loading"; -import { - getDeviceAssociations, - getNetworkClients, - postDeviceRemoveAssociation, -} from "@lib/api"; -import Link from "next/link"; -import { useState } from "react"; -import { ConfirmDeleteModal } from "@/app/_lib/components/ConfirmDeleteModal"; - -const PAGE_SIZE = 3; - -export default function DeviceList() { - const queryClient = useQueryClient(); - - const [deviceToRemove, setDeviceToRemove] = useState<{ - code: string; - client_id: string; - }>(); - const [numItemsToShow, setNumItemsToShow] = useState(PAGE_SIZE); - - const { isPending: isClientsPending, data: clients } = useQuery({ - queryKey: ["network", "clients"], - queryFn: async () => (await getNetworkClients()).clients, - }); - - const { isPending: isAssociationsPending, data: associations } = useQuery({ - queryKey: ["device", "associations"], - queryFn: getDeviceAssociations, - }); - - const pendingAdoptionDevices = associations?.pending_adoption_devices; - const incomingSharedDevices = associations?.incoming_shared_devices; - const outgoingSharedDevices = associations?.outgoing_shared_devices; - - const isPending = isClientsPending || isAssociationsPending; - - const numItems = () => { - return (clients?.length || 0) + (pendingAdoptionDevices?.length || 0); - }; - - /** - * The number of networks this device is shared with - */ - const getNumOutgoingNetworks = (clientId: string) => { - const networks = outgoingSharedDevices?.filter( - (device) => device.client_id == clientId && !!device.network_name - ); - const numNetworks = networks?.length || 0; - - if (numNetworks == 1) { - return "1 network"; - } - - return `${numNetworks} networks`; - }; - - const { - data: removeAssociationResult, - mutateAsync: mutateRemoveAssociationAsync, - } = useMutation({ - mutationKey: ["device", "remove", "association"], - mutationFn: async (code: string) => - await postDeviceRemoveAssociation({ code }), - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const handleRemoveAssociation = async (code: string) => { - await mutateRemoveAssociationAsync(code); - }; - - return ( - <> - {deviceToRemove && ( - { - if (!value) { - setDeviceToRemove(undefined); - } - }} - onConfirm={async () => - await handleRemoveAssociation(deviceToRemove.code) - } - > -

- Are you sure you want to remove device{" "} - {deviceToRemove.client_id}? -

-

You won't be able to undo this action.

-
- )} - -
-
-

Your Devices

- - - -
- - {isPending && } - - {!isPending && ( - <> -
- {clients?.length == 0 && ( -
No devices found
- )} - - {clients?.slice(0, numItemsToShow)?.map((client) => { - return ( - -
-
-
- -
- -
-

- {client.client_id} -

-

- {client.description} -

-
-
-
-
- - {/* Outoing shared devices */} -
-

- Shared with - {getNumOutgoingNetworks(client.client_id)} -

-
-
- - ); - })} - - {pendingAdoptionDevices - ?.slice(0, numItemsToShow - (clients?.length || 0)) - ?.map((device) => { - return ( -
-
-
- -
-
-

- {device.client_id} -

-
-
-
- -
-
-
-

Waiting for confirmation

-
-
- ); - })} - - {PAGE_SIZE < numItems() && numItemsToShow < numItems() && ( -
setNumItemsToShow(999)} - > -

Show more

-
- )} - - {PAGE_SIZE < numItems() && numItemsToShow > numItems() && ( -
setNumItemsToShow(PAGE_SIZE)} - > -

Show less

-
- )} -
- - )} - -

Devices shared with you

- {isAssociationsPending && } - {!isAssociationsPending && ( -
- {!incomingSharedDevices || - (incomingSharedDevices.length == 0 && ( -

No shared devices found

- ))} - {incomingSharedDevices?.map((device) => ( -
-
-
- -
-
-

- {device.client_id} -

-
-
-
- -
-
-
- {device.pending && ( -

Waiting for confirmation from {device.network_name}

- )} - {!device.pending &&

Shared by {device.network_name}

} -
-
- ))} -
- )} -
- - ); -} diff --git a/app.old/src/app/(pages)/devices/components/PollShare.tsx b/app.old/src/app/(pages)/devices/components/PollShare.tsx deleted file mode 100644 index b669ac0..0000000 --- a/app.old/src/app/(pages)/devices/components/PollShare.tsx +++ /dev/null @@ -1,158 +0,0 @@ -/** - * Function to poll an endpoint every 2 seconds - * - * Todo(Awais): This component can probably be merged with Poll.tsx. Not doing - * that now since it's only used in two places, but another polling use case - * would warrant factoring out the common code. - */ - -import { - postDeviceConfirmShare, - postDeviceRemoveAssociation, - postDeviceShareStatus, -} from "@/app/_lib/api"; -import Button from "@/app/_lib/components/Button"; -import PulseLoader from "@/app/_lib/components/LoadingSpinner"; -import { CheckBadgeIcon } from "@heroicons/react/24/solid"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { useState } from "react"; - -const POLLING_INTERVAL = 2000; // milliseconds - -type PollShareProps = { - code: string; - setIsModalOpen: (value: boolean) => void; -}; - -export default function PollShare({ code, setIsModalOpen }: PollShareProps) { - const queryClient = useQueryClient(); - const [isPolling, setIsPolling] = useState(true); - - const { - isLoading, - data: deviceShareStatus, - isError, - } = useQuery({ - queryKey: ["device", "share", "status", code], - queryFn: async () => postDeviceShareStatus({ share_code: code }), - enabled: isPolling, - refetchInterval: (query) => { - if ( - (!query.state.data || !query.state.data?.associated_network_name) && - isPolling - ) { - return POLLING_INTERVAL; - } - - // Success! We're no longer pending - setIsPolling(false); - return false; - }, - }); - - const { data: confirmShareResult, mutateAsync: mutateConfirmShareAsync } = - useMutation({ - mutationKey: ["device", "confirm", "share", code], - mutationFn: async ({ - code, - associated_network_name, - }: { - code: string; - associated_network_name: string | null; - }) => - await postDeviceConfirmShare({ - share_code: code, - associated_network_name, - }), - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const { mutateAsync: mutateRemoveAssociationAsync } = useMutation({ - mutationKey: ["device", "remove", "association"], - mutationFn: async (code: string) => - await postDeviceRemoveAssociation({ code }), - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const handleConfirmShare = async ( - event: React.MouseEvent - ) => { - if (!deviceShareStatus?.associated_network_name) { - alert("Sorry, something went wrong with the confirmation."); - return; - } - // Todo(Awais): This mutation seems to be triggering a re-render - // which is why the loading spinner on the button is not working. - await mutateConfirmShareAsync({ - code, - associated_network_name: deviceShareStatus?.associated_network_name, - }); - }; - - const handleCancelShare = async ( - event: React.MouseEvent - ) => { - await mutateRemoveAssociationAsync(code); - setIsModalOpen(false); - }; - - const ErrorState = () => ( -
-

Sorry, something went wrong

-
- ); - - const PendingState = () => ( -
-

- Waiting for code to be shared... -

- -
- ); - - const AwaitConfirmationState = () => ( -
- - -
- ); - - const ConfirmedState = () => { - return ( -
-

Success!

- -

- Your device is now shared with{" "} - {confirmShareResult?.associated_network_name} -

-
- ); - }; - - return ( - <> - {isError && } - {(isLoading || isPolling) && } - {deviceShareStatus && - deviceShareStatus.associated_network_name && - !confirmShareResult && } - {confirmShareResult && } - - ); -} diff --git a/app.old/src/app/(pages)/devices/components/ShareDeviceDialog.tsx b/app.old/src/app/(pages)/devices/components/ShareDeviceDialog.tsx deleted file mode 100644 index 14e2588..0000000 --- a/app.old/src/app/(pages)/devices/components/ShareDeviceDialog.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { - getDeviceShareCodeQR, - postDeviceCreateShareCode, -} from "@/app/_lib/api"; -import { Client, DeviceCreateShareCodeResult } from "@/app/_lib/types"; -import { Dialog } from "@headlessui/react"; -import { XMarkIcon } from "@heroicons/react/24/outline"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { useEffect } from "react"; -import PollShare from "./PollShare"; - -type ShareDeviceDialogProps = { - clientId: string; - shareCodeResult: DeviceCreateShareCodeResult; - isOpen: boolean; - setIsOpen: (value: boolean) => void; -}; - -export default function ShareDeviceDialog({ - clientId, - shareCodeResult, - isOpen, - setIsOpen, -}: ShareDeviceDialogProps) { - const { data: qrCodeURL, isPending: isQrImagePending } = useQuery({ - queryKey: ["share", "code", "qr", shareCodeResult?.share_code], - queryFn: async () => { - return await getDeviceShareCodeQR(shareCodeResult?.share_code || ""); - }, - }); - - return ( - setIsOpen(false)} - className="relative z-50" - > - {/* The backdrop, rendered as a fixed sibling to the panel container */} - - ); -} diff --git a/app.old/src/app/(pages)/devices/loading.tsx b/app.old/src/app/(pages)/devices/loading.tsx deleted file mode 100644 index cd0008b..0000000 --- a/app.old/src/app/(pages)/devices/loading.tsx +++ /dev/null @@ -1,10 +0,0 @@ -export default function Loading() { - return ( - <> -
-
-
-
- - ); -} diff --git a/app.old/src/app/(pages)/devices/page.tsx b/app.old/src/app/(pages)/devices/page.tsx deleted file mode 100644 index 3850b62..0000000 --- a/app.old/src/app/(pages)/devices/page.tsx +++ /dev/null @@ -1,19 +0,0 @@ -"use client"; - -import { useSearchParams } from "next/navigation"; -import DeviceDetail from "./components/DeviceDetail"; -import DeviceList from "./components/DeviceList"; - -export default function Page() { - // This is somewhat of a hack. NextJS static sites don't like dynamic URLS so instead of - // /devices/[client_id] we use the route /devices?client_id=[client_id] to show the client - // detail page - const queryParams = useSearchParams(); - const clientId = queryParams.get("client_id"); - - if (clientId) { - return ; - } - - return ; -} diff --git a/app.old/src/app/(pages)/ffdevices/loading.tsx b/app.old/src/app/(pages)/ffdevices/loading.tsx deleted file mode 100644 index cd0008b..0000000 --- a/app.old/src/app/(pages)/ffdevices/loading.tsx +++ /dev/null @@ -1,10 +0,0 @@ -export default function Loading() { - return ( - <> -
-
-
-
- - ); -} diff --git a/app.old/src/app/(pages)/ffdevices/page.tsx b/app.old/src/app/(pages)/ffdevices/page.tsx deleted file mode 100644 index cc55d8f..0000000 --- a/app.old/src/app/(pages)/ffdevices/page.tsx +++ /dev/null @@ -1,77 +0,0 @@ -"use client"; - -import { DevicePhoneMobileIcon } from "@heroicons/react/24/outline"; -import { useQuery } from "@tanstack/react-query"; -import Loading from "./loading"; -import { getNetworkClients } from "@lib/api"; - -export default function Page() { - const { isPending, data: clients } = useQuery({ - queryKey: ["network", "ffclients"], - queryFn: async () => { - const allClients = (await getNetworkClients()).clients; - return allClients.filter((client) => client.provide_mode == 2); - }, - }); - - return ( - <> -
-
-

Friends and Family Devices

-
- - {isPending && } - - {!isPending && ( - <> -
- {clients?.length == 0 && ( -
No devices found
- )} - - {clients?.map((client) => { - return ( -
-
- -
-
-

- {client.client_id} -

-

- {client.description} -

-
- -
-
- {client.connections && client.connections.length > 0 && ( - <> -
-
Connected
- - )} - {!client.connections && ( - <> -
-
- Disconnected -
- - )} -
-
- ); - })} -
- - )} -
- - ); -} diff --git a/app.old/src/app/(pages)/layout.tsx b/app.old/src/app/(pages)/layout.tsx deleted file mode 100644 index d983331..0000000 --- a/app.old/src/app/(pages)/layout.tsx +++ /dev/null @@ -1,16 +0,0 @@ -"use client"; - -import Sidebar from "./components/Sidebar"; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - <> - -
{children}
- - ); -} diff --git a/app.old/src/app/(pages)/provide/components/ActivityWidget.tsx b/app.old/src/app/(pages)/provide/components/ActivityWidget.tsx deleted file mode 100644 index 9bdd9bd..0000000 --- a/app.old/src/app/(pages)/provide/components/ActivityWidget.tsx +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Shows a github-like 'contributions' chart. - * - * A 1-d array of boxes where a more saturated colour indicates more activity - * on that day. - */ - -import { TimeseriesEntry } from "@/app/_lib/types"; -import moment from "moment"; -import { useState } from "react"; - -// How many days of data do we want to show in this widget? -export const NUM_DAYS = 7; - -type ActivityWidgetProps = { - data: TimeseriesEntry[]; - maxValue?: number; // Use this to set the 'max' value across multiple ActivityWidget instances -}; - -export default function ActivityWidget({ - data, - maxValue, -}: ActivityWidgetProps) { - const [tooltipEntry, setTooltipEntry] = useState(); - - if (!data || data.length == 0) { - return ( -
- {Array(NUM_DAYS) - .fill(0) - .map(() => ( -
- ))} -
- ); - } - - const max = maxValue || Math.max(...data.map((entry) => Number(entry.value))); - - const calculateColor = (value: number) => { - const normedValue = value / max; - const maxLightness = 0.4; // lightness for the largest value - const minLightness = 0.9; // lightness for the smallest value - const lightnessPercentage = - 100 * (normedValue * (maxLightness - minLightness) + minLightness); - - return `hsl(225, 70%, ${lightnessPercentage}%)`; - }; - - return ( -
- {data.map((entry) => ( -
setTooltipEntry(entry)} - onMouseLeave={() => setTooltipEntry(undefined)} - > - {tooltipEntry && tooltipEntry.date === entry.date && ( -
-
-

{moment(tooltipEntry.date).format("YYYY-MM-DD")}

-

- Data:{" "} - {typeof tooltipEntry.value == "number" - ? tooltipEntry.value.toPrecision(4) - : tooltipEntry.value}{" "} - GiB -

-
-
- )} -
- ))} -
- ); -} diff --git a/app.old/src/app/(pages)/provide/components/Chart.tsx b/app.old/src/app/(pages)/provide/components/Chart.tsx deleted file mode 100644 index dc94f46..0000000 --- a/app.old/src/app/(pages)/provide/components/Chart.tsx +++ /dev/null @@ -1,174 +0,0 @@ -import { - ResponsiveContainer, - XAxis, - BarChart as ReBarChart, - AreaChart, - Area, - Bar, - Tooltip, - TooltipProps, -} from "recharts"; -import { - ValueType, - NameType, -} from "recharts/types/component/DefaultTooltipContent"; -import moment from "moment"; -import { Dispatch, SetStateAction, useState } from "react"; -import { Timeseries } from "@/app/_lib/types"; -import { formatTimeseriesData } from "@/app/_lib/utils"; - -type BarChartProps = { - name: string; - pre_unit?: string; - unit?: string; - data: Timeseries; - syncId?: string; - tooltipStyle?: "normal" | "simple"; - showTooltip?: boolean; - setShowTooltip?: Dispatch>; -}; - -export function BarChart({ - name, - pre_unit, - unit, - data, - syncId, - tooltipStyle = "normal", - showTooltip, - setShowTooltip, -}: BarChartProps) { - const [tooltipPostion, setTooltipPosition] = useState({ x: 0, y: 0 }); - const [_isTooltipVisible, _setIsTooltipVisible] = useState(false); - const isTooltipVisible = showTooltip || _isTooltipVisible; - const setIsTooltipVisible = setShowTooltip || _setIsTooltipVisible; - - const formattedData = formatTimeseriesData(data); - - const formatDate = (date: string): string => { - return moment(date).format("MMM Do"); - }; - - const CustomTooltip = ({ - active, - payload, - label, - }: TooltipProps) => { - if (active && payload && payload.length) { - return ( -
-
-

{label}

-
-

- {name} -   - - {pre_unit} - {typeof payload[0].value == "number" - ? payload[0].value.toPrecision(4) - : payload[0].value} - {" "} - {unit} -

-
-
-
- ); - } - }; - - const SimpleTooltip = ({ - active, - payload, - label, - }: TooltipProps) => { - if (active && payload && payload.length) { - return ( -
-
-

{label}

-
-

- {name} -   - - {pre_unit} - {typeof payload[0].value == "number" - ? payload[0].value.toPrecision(4) - : payload[0].value} - {" "} - {unit} -

-
-
-
- ); - } - }; - - return ( - <> - - - : - } - isAnimationActive={false} - allowEscapeViewBox={{ x: true, y: true }} - /> - { - setIsTooltipVisible(true); - }} - onMouseLeave={() => setIsTooltipVisible(false)} - cursor="pointer" - /> - - - - - ); -} -type PlainAreaChartProps = { - data: Timeseries; - color?: string; -}; - -export function PlainAreaChart({ - data, - color = "#d1d5db", -}: PlainAreaChartProps) { - const formattedData = formatTimeseriesData(data); - - return ( - <> - - - - - - - ); -} diff --git a/app.old/src/app/(pages)/provide/components/DeviceDetailSidebar.tsx b/app.old/src/app/(pages)/provide/components/DeviceDetailSidebar.tsx deleted file mode 100644 index cff5005..0000000 --- a/app.old/src/app/(pages)/provide/components/DeviceDetailSidebar.tsx +++ /dev/null @@ -1,245 +0,0 @@ -import { postStatsProviderLast90 } from "@/app/_lib/api"; -import { ClientTransferData, Provider24h } from "@/app/_lib/types"; -import { Popover, Tab, Transition } from "@headlessui/react"; -import { DevicePhoneMobileIcon, XMarkIcon } from "@heroicons/react/24/outline"; -import { useQuery } from "@tanstack/react-query"; -import { BarChart } from "./Chart"; -import { ChartBarIcon } from "@heroicons/react/24/solid"; -import UptimeWidget from "./UptimeWidget"; -import ActivityWidget, { NUM_DAYS } from "./ActivityWidget"; -import { formatTimeseriesData } from "@/app/_lib/utils"; -import { useState } from "react"; - -type ChartItem = { - name: string; - key: string; - pre_unit?: string; - unit?: string; -}; - -const charts: Array = [ - { - name: "Data", - key: "transfer_data", - unit: "GiB", - }, - { - name: "Income", - key: "payout", - pre_unit: "$", - }, - { - name: "Uptime", - key: "uptime", - unit: "hours", - }, - { - name: "Searches", - key: "search_interest", - }, - { - name: "Devices", - key: "clients", - }, -]; - -type DeviceDetailSidebarProps = { - selectedProvider: Provider24h | undefined; - setSelectedProvider: CallableFunction; -}; - -export default function DeviceDetailSidebar({ - selectedProvider, - setSelectedProvider, -}: DeviceDetailSidebarProps) { - const [showTooltip, setShowTooltip] = useState(false); - - const { isPending, data: provider } = useQuery({ - queryKey: ["stats", "provider-last-90", selectedProvider?.client_id], - queryFn: async () => - await postStatsProviderLast90({ - client_id: selectedProvider?.client_id || "", - }), - enabled: !!selectedProvider, - }); - - const isOpen = selectedProvider != null; - - const getFormattedActivityData = (client: ClientTransferData) => { - return formatTimeseriesData(client.transfer_data).slice(-NUM_DAYS); - }; - - /** Find the max transfer data value across all connected devices */ - const getMaxTransferData = (clientDetails: ClientTransferData[]) => { - const aggregate = clientDetails.flatMap((clientDetail) => - formatTimeseriesData(clientDetail.transfer_data).slice(-NUM_DAYS) - ); - return Math.max(...aggregate.map((entry) => Number(entry.value))); - }; - - return ( - - - - -
-
- setSelectedProvider(null)} - /> -
- - {isPending && ( - <> -
- - )} - - {!isPending && provider && ( -
- {/* Title (device name) */} -
-

- {selectedProvider?.client_id} -

-

- Created on {provider?.created_time} -

-
- {/* Tab bar */} -
- - - -
- -

Charts

-
-
- -
- -

Connections

-
-
-
- - {/* Charts tab */} - -
- {/* Uptime graphic */} -
-

- Uptime (past 24 hours) -

-
- -
-
- {/* Charts */} -
-

- Past 90 days -

-
- {charts.map((chart) => ( -
- {/*
*/} - {/* - - */} -
- {chart.name} -
- -
- ))} -
-
-
- - - {/* Connections tab */} - - {/* Connections table */} -
-

- Connected devices -

- - - - {provider.client_details?.length == 0 && ( - - - - )} - {provider?.client_details.map((client) => ( - - - - - ))} - -
- No devices found -
- {client.client_id} - - -
-
-
- - -
- )} -
- - - - - ); -} diff --git a/app.old/src/app/(pages)/provide/components/DevicesTable.tsx b/app.old/src/app/(pages)/provide/components/DevicesTable.tsx deleted file mode 100644 index 65b2d43..0000000 --- a/app.old/src/app/(pages)/provide/components/DevicesTable.tsx +++ /dev/null @@ -1,232 +0,0 @@ -import { NetworkClientsResult, Provider24h } from "@/app/_lib/types"; -import { classNames } from "@/app/_lib/utils"; -import { Switch } from "@headlessui/react"; -import DeviceDetailSidebar from "./DeviceDetailSidebar"; -import { useState } from "react"; -import UptimeWidget from "./UptimeWidget"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { - getNetworkClients, - getStatsProviders, - postDeviceSetProvide, -} from "@/app/_lib/api"; - -const PROVIDE_MODE_FRIENDS_AND_FAMILY = 2; -const PROVIDE_MODE_PUBLIC = 3; - -type DevicesTableProps = {}; -type DeviceSetPayload = { - client_id: string; - provide_mode: number; -}; - -export default function DevicesTable({}: DevicesTableProps) { - const queryClient = useQueryClient(); - const [selectedProvider, setSelectedProvider] = useState< - Provider24h | undefined - >(); - - // Network requests - const { isPending: isDevicesPending, data: devices } = useQuery({ - queryKey: ["stats", "providers"], - queryFn: getStatsProviders, - }); - const providers = devices?.providers; - - const { isPending: isNetworkDevicesPending, data: clients } = useQuery({ - queryKey: ["network", "clients"], - queryFn: getNetworkClients, - }); - - const mutation = useMutation({ - mutationFn: ({ client_id, provide_mode }: DeviceSetPayload) => - postDeviceSetProvide({ - client_id: client_id, - provide_mode: provide_mode, - }), - onMutate: async ({ client_id, provide_mode }: DeviceSetPayload) => { - // Implement optimistic updates for 'provide' toggle - // https://tanstack.com/query/v4/docs/react/guides/optimistic-updates - await queryClient.cancelQueries({ queryKey: ["network", "clients"] }); - const previousNetworkClientsResult = queryClient.getQueryData([ - "network", - "clients", - ]); - queryClient.setQueryData( - ["network", "clients"], - (oldResult: NetworkClientsResult) => { - const clients = oldResult.clients; - const index = clients.findIndex( - (client) => client.client_id == client_id - ); - - if (~index) { - clients[index] = { - ...clients[index], - provide_mode: provide_mode, - }; - } - - return { clients: clients }; - } - ); - return { previousNetworkClientsResult }; - }, - onError: (err, newClient, context) => { - // Fallback to previous result on error - queryClient.setQueryData( - ["network", "clients"], - context?.previousNetworkClientsResult - ); - alert( - `Sorry, can't turn provide ${ - newClient.provide_mode == PROVIDE_MODE_PUBLIC ? "on" : "off" - } for device: ${newClient.client_id}` - ); - }, - onSettled: () => { - // Trigger a refetch of the network devices query - queryClient.invalidateQueries({ queryKey: ["network", "clients"] }); - }, - }); - - const handleProvideToggle = ( - provider: Provider24h, - setProvideOn: boolean - ) => { - const newProvideMode = setProvideOn - ? PROVIDE_MODE_PUBLIC - : PROVIDE_MODE_FRIENDS_AND_FAMILY; - mutation.mutate({ - client_id: provider.client_id, - provide_mode: newProvideMode, - }); - }; - - const getClient = (clientId: string) => { - const client = clients?.clients?.find( - (client) => clientId == client.client_id - ); - if (!client) { - return null; - } - return client; - }; - - const isProviding = (clientId: string) => { - const client = getClient(clientId); - return client?.provide_mode == PROVIDE_MODE_PUBLIC; - }; - - const getNumConnections = (clientId: string) => { - const client = getClient(clientId); - return client?.connections?.length || 0; - }; - - if (isDevicesPending) { - return
; - } - - return ( - <> - -
- - - - - - - - - - - {providers?.map((provider) => ( - { - setSelectedProvider(provider); - }} - > - - - - - - - - ))} - -
- - - Data transferred - - Income - - Uptime - - Search interest -
- {provider.client_id} - -
- {isNetworkDevicesPending && ( - <> -
- - )} - - {!isNetworkDevicesPending && ( - <> - event.stopPropagation()} - onChange={(newState) => - handleProvideToggle(provider, newState) - } - className={classNames( - isProviding(provider.client_id) - ? "bg-green-600" - : "bg-gray-200", - "relative inline-flex h-4 w-7 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none" - )} - > - Use setting - -

- {getNumConnections(provider.client_id)} -  connections -

- - )} -
-
- {provider.transfer_data_last_24h.toPrecision(4)}{" "} - GiB - - ${provider.payout_last_24h.toPrecision(4)} - -
- -
-
- {provider.search_interest_last_24h} -
-
- - ); -} diff --git a/app.old/src/app/(pages)/provide/components/UptimeWidget.tsx b/app.old/src/app/(pages)/provide/components/UptimeWidget.tsx deleted file mode 100644 index c316d3a..0000000 --- a/app.old/src/app/(pages)/provide/components/UptimeWidget.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import { zip } from "@/app/_lib/utils"; -import moment from "moment"; -import { useEffect, useRef, useState } from "react"; - -type UptimeWidgetProps = { - data: { - event_time: string; - connected: boolean; - }[]; -}; - -type UptimeSegment = { - start_string: string; - end_string: string; - start_date: number; - end_date: number; - connected: boolean; -}; - -export default function UptimeWidget({ data }: UptimeWidgetProps) { - // Scale factor to convert between dates, and pixel widths - const [scaleFactor, setScaleFactor] = useState(); - const [svgWidth, setSvgWidth] = useState(); - const [svgHeight, setSvgHeight] = useState(); - const [tooltipSegment, setTooltipSegment] = useState(); - const [showNullTooltip, setShowNullTooltip] = useState(false); - - const divRef = useRef(null); - const segments = zip( - data.slice(0, data.length - 1), - data.slice(1, data.length) - ).map(([start, end]) => { - return { - start_string: start.event_time, - end_string: end.event_time, - start_date: Date.parse(start.event_time), - end_date: Date.parse(end.event_time), - connected: start.connected, - }; - }); - - const firstEntry = segments[0]; - const lastEntry = segments.slice(-1)[0]; - - useEffect(() => { - const width = divRef.current?.clientWidth; - if (width) { - setSvgWidth(width); - setScaleFactor(width / (lastEntry.end_date - firstEntry.start_date)); - } - setSvgHeight(divRef.current?.clientHeight); - }, []); - - if (!data || data.length == 0) { - return ( -
setShowNullTooltip(true)} - onMouseLeave={() => setShowNullTooltip(false)} - > -
-
-

No uptime data found.

-
-
-
- ); - } - - const showTooltip = (segment: UptimeSegment) => { - setTooltipSegment(segment); - }; - const hideTooltip = () => { - setTooltipSegment(undefined); - }; - - return ( -
- {tooltipSegment && scaleFactor && ( -
- {tooltipSegment && ( -
-

- {moment(tooltipSegment.start_string).format("YYYY-MM-DD H:mm")} - {" - "} - {moment(tooltipSegment.end_string).format("H:mm")} -

- {tooltipSegment.connected && ( -

- Connected for{" "} - {moment(tooltipSegment.end_string).diff( - moment(tooltipSegment.start_string), - "minutes" - )}{" "} - minutes. -

- )} - {!tooltipSegment.connected && ( -

- Disconnected for{" "} - {moment(tooltipSegment.end_string).diff( - moment(tooltipSegment.start_string), - "minutes" - )}{" "} - minutes. -

- )} -
- )} -
- )} - - {scaleFactor && - segments.map((segment) => ( - showTooltip(segment)} - onMouseLeave={() => hideTooltip()} - /> - ))} - -
- ); -} diff --git a/app.old/src/app/(pages)/provide/loading.tsx b/app.old/src/app/(pages)/provide/loading.tsx deleted file mode 100644 index 6df12d1..0000000 --- a/app.old/src/app/(pages)/provide/loading.tsx +++ /dev/null @@ -1,21 +0,0 @@ -export default function Loading() { - return ( - <> -
-
-
- {Array(5) - .fill(0) - .map((item, index) => ( -
- ))} -
-
-
-
- - ); -} diff --git a/app.old/src/app/(pages)/provide/page.tsx b/app.old/src/app/(pages)/provide/page.tsx deleted file mode 100644 index 1df8a43..0000000 --- a/app.old/src/app/(pages)/provide/page.tsx +++ /dev/null @@ -1,191 +0,0 @@ -"use client"; - -import { useQuery } from "@tanstack/react-query"; -import Loading from "./loading"; -import { getStatsProviders, getStatsProvidersOverviewLast90 } from "@lib/api"; -import { useState } from "react"; -import { ChevronDownIcon } from "@heroicons/react/20/solid"; -import { Listbox } from "@headlessui/react"; -import { BarChart, PlainAreaChart } from "./components/Chart"; -import DevicesTable from "./components/DevicesTable"; -import { debug } from "console"; - -type HeaderItem = { - name: string; - key: string; - pre_unit?: string; - unit?: string; - helpText?: string; -}; - -const headerItems: Array = [ - { - name: "Data transferred", - key: "transfer_data", - unit: "GiB", - }, - { - name: "Income", - key: "payout", - pre_unit: "$", - }, - { - name: "Uptime", - key: "uptime", - unit: "hours", - }, - { - name: "Searches", - key: "search_interest", - }, - { - name: "Devices", - key: "clients", - }, -]; - -export default function Page() { - const [selectedStat, setSelectedStat] = useState(headerItems[0]); - - const { isPending: isOverviewPending, data: stats } = useQuery({ - queryKey: ["stats", "providers", "overviewLast90"], - queryFn: getStatsProvidersOverviewLast90, - }); - - const getStatToday = (key: string) => { - if (stats && stats[key]) { - const mostRecentDate = Object.keys(stats[key]).toReversed()[0]; - return stats[key][mostRecentDate]?.toPrecision(4); - } - return ""; - }; - - const getStatAllTime = (key: string) => { - if (stats && stats[key]) { - return stats[key]; - } - return []; - }; - - return ( - <> -
-
-

Provide

-
- - {isOverviewPending && } - - {!isOverviewPending && ( -
- {/* Header showing stats */} -
-

- Past 24 hours -

-
- {headerItems.map((item) => { - return ( -
{ - setSelectedStat(item); - }} - className={`w-1/5 flex flex-col gap-0 border rounded-md overflow-hidden cursor-pointer hover:border-indigo-600 shadow-md ${ - selectedStat.key == item.key - ? "border-indigo-600 border-2" - : "border-gray-300" - }`} - > -
-

- {item.name} -

-

- - {item.pre_unit} - {getStatToday(item.key)} - {" "} - - {item.unit} - -

-
-
- -
-
- ); - })} -
-
- - {/* 90 Day chart */} -
-

- Past 90 days -

-
- - {/* Dropdown in the top left of the chart */} - - -

{selectedStat.name}

- -
- - {headerItems.map((item) => ( - - {item.name} - - ))} - -
-
-
-
-

Devices

- -
-
- )} -
- - ); -} diff --git a/app.old/src/app/_lib/api.ts b/app.old/src/app/_lib/api.ts deleted file mode 100644 index 94c6356..0000000 --- a/app.old/src/app/_lib/api.ts +++ /dev/null @@ -1,241 +0,0 @@ -/** - * All code that makes calls to the BringYour API lives in this file. - */ - -import { redirect } from "next/navigation"; -import { - AuthCodeLoginResult, - DeviceAddResult, - DeviceAdoptStatusResult, - DeviceAssociationsResult, - DeviceConfirmShareResult, - DeviceCreateShareCodeResult, - DeviceRemoveAssociationResult, - DeviceSetProvideResult, - DeviceShareStatusResult, - NetworkClientsResult, - RemoveNetworkClientResult, - StatsProviderLast90, - StatsProviders, - StatsProvidersOverviewLast90Result, - SubscriptionBalanceResult, - SubscriptionCheckBalanceCodeResult, - SubscriptionRedeemBalanceCodeResult, -} from "./types"; - -const API_URL = process.env.NEXT_PUBLIC_API_URL || "https://api.bringyour.com/"; -export const LOGIN_URL = "https://bringyour.com?auth"; - -export function getLoginUrl() { - if (!window || !window.location) { - return LOGIN_URL; - } - - const encodedRedirectUri = encodeURI(window.location.href); - return `${LOGIN_URL}&redirect-uri-after-auth=${encodedRedirectUri}`; -} - -export function getJwt() { - if (typeof localStorage == "undefined") { - return null; - } - return localStorage.getItem("byJwt"); -} - -export function removeJwt() { - if (typeof localStorage == "undefined") { - return; - } - - localStorage.removeItem("byJwt"); -} - -/** - * A GET request with authentication and error handling - */ -async function makeGetRequest(endpoint: string) { - const byJwt = getJwt(); - const response = await fetch(`${API_URL}${endpoint}`, { - headers: { - Authorization: `Bearer ${byJwt}`, - }, - }); - - if (!response.ok) { - if ([401, 403].includes(response.status)) { - // Unauthorized. User needs to refresh JWT token - removeJwt(); - redirect(LOGIN_URL); - } - - // Todo(awais): Improve error handling on network requests - throw new Error("Failed to fetch"); - } - - const result = await response.json(); - - if (result.error && result.error.message) { - const errorMessage: any = result.error.message; - alert(`Sorry, there was a problem:\n${errorMessage}`); - } - - return Promise.resolve(result); -} - -/** - * A POST request with authentication and error handling - */ -async function makePostRequest(endpoint: string, body: object) { - const byJwt = getJwt(); - const response = await fetch(`${API_URL}${endpoint}`, { - method: "POST", - headers: { - Authorization: `Bearer ${byJwt}`, - }, - body: JSON.stringify(body), - }); - - if (!response.ok) { - throw new Error("Post request failed"); - } - - const result = await response.json(); - - if (result.error && result.error.message) { - const errorMessage: any = result.error.message; - alert(`Sorry, there was a problem:\n${errorMessage}`); - } - - return Promise.resolve(result); -} - -/** - * Similar to a GET request, however this returns a Blob() object instead - * of parsing the response as json. - */ -async function makeResourceRequest(endpoint: string) { - const byJwt = getJwt(); - const response = await fetch(`${API_URL}${endpoint}`, { - headers: { - Authorization: `Bearer ${byJwt}`, - }, - }); - - return response.blob(); -} - -/** - * Swap authorization code for an access token (JWT) - */ -export async function postAuthCodeLogin( - auth: string -): Promise { - const response = await fetch(`${API_URL}auth/code-login`, { - method: "POST", - body: JSON.stringify({ auth_code: auth }), - }); - - if (!response.ok) { - if (response.status >= 400 && response.status < 500) { - throw new Error("API rejected the access token"); - } - throw new Error("Failed to log in."); - } - return await response.json(); -} - -export async function getNetworkClients(): Promise { - return makeGetRequest("network/clients"); -} - -export async function getSubscriptionBalance(): Promise { - return makeGetRequest("subscription/balance"); -} - -export async function getStatsProvidersOverviewLast90(): Promise { - return makeGetRequest("stats/providers-overview-last-90"); -} - -export async function getStatsProviders(): Promise { - return makeGetRequest("stats/providers"); -} - -export async function postStatsProviderLast90(body: { - client_id: string; -}): Promise { - return makePostRequest("stats/provider-last-90", body); -} - -export async function postRemoveNetworkClient(body: { - client_id: string; -}): Promise { - return makePostRequest("network/remove-client", body); -} - -export async function postDeviceSetProvide(body: { - client_id: string; - provide_mode: number; -}): Promise { - return makePostRequest("device/set-provide", body); -} - -export async function postDeviceAdd(body: { - code: string; -}): Promise { - return makePostRequest("device/add", body); -} - -export async function postDeviceCreateShareCode(body: { - client_id: string; - device_name: string; -}): Promise { - return makePostRequest("device/create-share-code", body); -} - -export async function getDeviceShareCodeQR(share_code: string) { - const imgData = await makeResourceRequest( - `device/share-code/${share_code}/qr.png` - ); - return URL.createObjectURL(imgData); -} - -export async function postDeviceShareStatus(body: { - share_code: string; -}): Promise { - return makePostRequest("device/share-status", body); -} - -export async function postDeviceConfirmShare(body: { - share_code: string; - associated_network_name: string | null; -}): Promise { - return makePostRequest("device/confirm-share", body); -} - -export async function postDeviceAdoptStatus(body: { - share_code: string; -}): Promise { - return makePostRequest("device/adopt-status", body); -} - -export async function getDeviceAssociations(): Promise { - return makeGetRequest("device/associations"); -} - -export async function postDeviceRemoveAssociation(body: { - code: string; -}): Promise { - return makePostRequest("device/remove-association", body); -} - -export async function postSubscriptionCheckBalanceCode(body: { - secret: string; -}): Promise { - return makePostRequest("subscription/check-balance-code", body); -} - -export async function postSubscriptionRedeemBalanceCode(body: { - secret: string; -}): Promise { - return makePostRequest("subscription/redeem-balance-code", body); -} diff --git a/app.old/src/app/_lib/components/Breadcrumbs.tsx b/app.old/src/app/_lib/components/Breadcrumbs.tsx deleted file mode 100644 index 46e5631..0000000 --- a/app.old/src/app/_lib/components/Breadcrumbs.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { ChevronLeftIcon } from "@heroicons/react/24/outline"; -import React from "react"; - -export type BreadcrumbItem = { - title: string; - url: string; -}; - -export function Breadcrumbs({ items }: { items: BreadcrumbItem[] }) { - return ( -
- {items.map((item, index) => ( - - {index != 0 &&
/
} -
- {index == 0 && } - {item.title} -
-
- ))} -
- ); -} diff --git a/app.old/src/app/_lib/components/Button.tsx b/app.old/src/app/_lib/components/Button.tsx deleted file mode 100644 index 0d2eb61..0000000 --- a/app.old/src/app/_lib/components/Button.tsx +++ /dev/null @@ -1,62 +0,0 @@ -// Async button; shows a loading spinner while query is running - -import React, { useState } from "react"; - -function SmallSpinner() { - return ( -
- - Loading... -
- ); -} - -export type ButtonProps = { - onClick?: (event: React.MouseEvent) => Promise; - className?: string; - disabled?: boolean; - children: React.ReactNode; -}; - -export default function Button({ - onClick, - className = "", - disabled = false, - children, -}: ButtonProps) { - const [isLoading, setIsLoading] = useState(false); - - const handleClick = async (event: React.MouseEvent) => { - setIsLoading(true); - if (!!onClick) { - await onClick(event); - } - setIsLoading(false); - }; - - return ( - - ); -} diff --git a/app.old/src/app/_lib/components/ConfirmDeleteModal.tsx b/app.old/src/app/_lib/components/ConfirmDeleteModal.tsx deleted file mode 100644 index 07f5755..0000000 --- a/app.old/src/app/_lib/components/ConfirmDeleteModal.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { Dialog } from "@headlessui/react"; -import { ExclamationTriangleIcon, XMarkIcon } from "@heroicons/react/24/solid"; -import Button from "./Button"; - -type ConfirmDeleteModalProps = { - isOpen: boolean; - setIsOpen: (value: boolean) => void; - onConfirm: any; - children: React.ReactNode; -}; - -export function ConfirmDeleteModal({ - isOpen, - setIsOpen, - onConfirm, - children, -}: ConfirmDeleteModalProps) { - const handleCancelClicked = async ( - event: React.MouseEvent - ) => { - setIsOpen(false); - }; - - const handleConfirmClicked = async ( - event: React.MouseEvent - ) => { - await onConfirm(); - await new Promise((resolve) => - setTimeout(() => resolve(setIsOpen(false)), 500) - ); - }; - - return ( - setIsOpen(false)} - > - {/* The backdrop, rendered as a fixed sibling to the panel container */} - - ); -} diff --git a/app.old/src/app/_lib/components/LoadingSpinner.tsx b/app.old/src/app/_lib/components/LoadingSpinner.tsx deleted file mode 100644 index fa4e1e2..0000000 --- a/app.old/src/app/_lib/components/LoadingSpinner.tsx +++ /dev/null @@ -1,61 +0,0 @@ -// Code pulled from https://github.com/davidhu2000/react-spinners/blob/main/src/PulseLoader.tsx -// with some modifications to make it tailwind-appropriate. - -import * as React from "react"; - -const createAnimation = ( - loaderName: string, - frames: string, - suffix: string -): string => { - const animationName = `react-spinners-${loaderName}-${suffix}`; - - if (typeof window == "undefined" || !window.document) { - return animationName; - } - - const styleEl = document.createElement("style"); - document.head.appendChild(styleEl); - const styleSheet = styleEl.sheet; - - const keyFrames = ` - @keyframes ${animationName} { - ${frames} - } - `; - - if (styleSheet) { - styleSheet.insertRule(keyFrames, 0); - } - - return animationName; -}; - -const pulse = createAnimation( - "PulseLoader", - "0% {transform: scale(1); opacity: 1} 45% {transform: scale(0.1); opacity: 0.7} 80% {transform: scale(1); opacity: 1}", - "pulse" -); - -function PulseLoader({ className }: { className: string }): JSX.Element | null { - const style = (i: number): React.CSSProperties => { - return { - animation: `${pulse} ${1.5}s ${ - i * 0.2 - }s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08)`, - animationFillMode: "both", - }; - }; - - const dotClassName = "bg-[#2B3A82] w-4 h-4 mx-1 rounded-full inline-block"; - - return ( -
- - - -
- ); -} - -export default PulseLoader; diff --git a/app.old/src/app/_lib/types.ts b/app.old/src/app/_lib/types.ts deleted file mode 100644 index ae89097..0000000 --- a/app.old/src/app/_lib/types.ts +++ /dev/null @@ -1,209 +0,0 @@ -export type AuthCodeLoginResult = { - by_jwt: string; - error?: { - message: string; - }; -}; - -export type Client = { - client_id: string; - description: string; - device_spec: string; - network_id: string; - connections: object[]; - provide_mode: number; -}; - -export type NetworkClientsResult = { - clients: Array; -}; - -type WalletInfo = { - wallet_id: string; - token_id: string; - blockchain: string; - blockchain_symbol: string; - create_date: string; - balance_usdc_nano_cents: 0; - address: string; -}; - -type SubscriptionInfo = { - subscription_id: string; - store: string; - plan: string; -}; - -export type SubscriptionBalanceResult = { - balance_byte_count: number; - current_subscription: SubscriptionInfo; - active_transfer_balances: Array; - pending_payout_usd_nano_cents: number; - wallet_info: WalletInfo; - update_time: string; -}; - -// The key is technically a string representing a date, but can't type that. -export type Timeseries = { [key: string]: string | number }; - -export type TimeseriesEntry = { - date: string; - value: string | number; -}; - -export type Provider24h = { - client_id: string; - connected: boolean; - connected_events_last_24h: { - event_time: string; - connected: boolean; - }[]; - uptime_last_24h: number; - transfer_data_last_24h: number; - payout_last_24h: number; - search_interest_last_24h: number; - contracts_last_24h: number; - clients_last_24h: number; -}; - -export type StatsProviders = { - created_time: string; - providers: Provider24h[]; -}; - -export type StatsProvidersOverviewLast90Result = { - [index: string]: any; - lookback: number; - created_time: string; - uptime: Timeseries; - transfer_data: Timeseries; - payout: Timeseries; - search_interest: Timeseries; - contracts: Timeseries; - clients: Timeseries; -}; - -export type ClientTransferData = { - client_id: string; - transfer_data: Timeseries; -}; - -export type StatsProviderLast90 = { - [index: string]: any; - lookback: number; - created_time: string; - uptime: Timeseries; - transfer_data: Timeseries; - payout: Timeseries; - search_interest: Timeseries; - contracts: Timeseries; - clients: Timeseries; - client_details: ClientTransferData[]; -}; - -export type RemoveNetworkClientResult = { - error?: { - message: string; - }; -}; - -export type DeviceSetProvideResult = { - provide_mode: number; - error?: { - message: string; - }; -}; - -export type DeviceAddResult = { - code_type: string; // share | adopt - code: string; - network_name: string; - client_id: string; - error?: { - message: string; - }; -}; - -export type DeviceCreateShareCodeResult = { - share_code: string; - error?: { - message: string; - }; -}; - -export type DeviceShareStatusResult = { - pending: boolean; - associated_network_name: string; - error?: { - message: string; - }; -}; - -export type DeviceConfirmShareResult = { - complete: boolean; - associated_network_name: string; - error?: { - message: string; - }; -}; - -export type DeviceAdoptStatusResult = { - pending: boolean; - associated_network_name: string; - error?: { - message: string; - }; -}; - -export type DeviceAssociationsResult = { - pending_adoption_devices: { - code: string; - device_name: string; - client_id: string; - }[]; - incoming_shared_devices: { - pending: boolean; - code: string; - device_name: string; - client_id: string; - network_name: string; - }[]; - outgoing_shared_devices: { - pending: boolean; - code: string; - device_name: string; - client_id: string; - network_name?: string; - }[]; -}; - -export type DeviceRemoveAssociationResult = { - client_id: string; - network_name: string; - error?: { - message: string; - }; -}; - -export type SubscriptionCheckBalanceCodeResult = { - balance?: { - start_time: string; - end_time: string; - balance_byte_count: number; - }; - error?: { - message: string; - }; -}; - -export type SubscriptionRedeemBalanceCodeResult = { - transfer_balance?: { - transfer_balance_id: string; - start_time: string; - end_time: string; - balance_byte_count: number; - }; - error?: { - message: string; - }; -}; diff --git a/app.old/src/app/_lib/utils.ts b/app.old/src/app/_lib/utils.ts deleted file mode 100644 index 5e60457..0000000 --- a/app.old/src/app/_lib/utils.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Timeseries, TimeseriesEntry } from "./types"; - -export function classNames(...classes: string[]) { - return classes.filter(Boolean).join(" "); -} - -/** Combine two arrays of the same length together into an array of 2-tuples. - * - * E.g. zip([a, b, c], [1, 2, 3]) = [(a, 1), (b, 2), (c, 3)] - */ -export function zip(a: Array, b: Array) { - return a.map((k, i) => [k, b[i]]); -} - -/** - * Take timeseries data as it arrives from the API: - * { - * "yyyy-mm-dd1": 0, - * "yyyy-mm-dd2": 0, - * } - * - * and convert it into the format required by the charting library: - * [ - * { - * date: "yyyy-mm-dd", - * value: 0, - * }, - * ] - * - * This function also sorts the data chronologically by date. - */ -export function formatTimeseriesData(data: Timeseries): TimeseriesEntry[] { - return Object.entries(data) - .map(([key, value]) => ({ - date: key, - value: value, - })) - .toSorted((a, b) => { - const dateA = Date.parse(a.date); - const dateB = Date.parse(b.date); - - if (dateA == dateB) { - return 0; - } else if (dateA > dateB) { - return 1; - } else { - return -1; - } - }); -} - -/** - * This function is from: https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript - */ -export function prettyPrintByteCount(byteCount: number, decimals = 0) { - if (!+byteCount) return "0 Bytes"; - - const k = 1024; - const dm = decimals < 0 ? 0 : decimals; - const sizes = [ - "Bytes", - "KiB", - "MiB", - "GiB", - "TiB", - "PiB", - "EiB", - "ZiB", - "YiB", - ]; - - const i = Math.floor(Math.log(byteCount) / Math.log(k)); - - return `${parseFloat((byteCount / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`; -} diff --git a/app.old/src/app/apple-icon.png b/app.old/src/app/apple-icon.png deleted file mode 100644 index 408c8aa..0000000 Binary files a/app.old/src/app/apple-icon.png and /dev/null differ diff --git a/app.old/src/app/error.tsx b/app.old/src/app/error.tsx deleted file mode 100644 index ce0a63e..0000000 --- a/app.old/src/app/error.tsx +++ /dev/null @@ -1,32 +0,0 @@ -"use client"; - -import { useEffect } from "react"; - -// Todo: Make a real error page that actually looks like there was an error -export default function Error({ - error, - reset, -}: { - error: Error & { digest?: string }; - reset: () => void; -}) { - useEffect(() => { - // Log the error to an error reporting service - console.error(error); - }, [error]); - - return ( -
-

Sorry, something went wrong!

- -
- ); -} diff --git a/app.old/src/app/favicon.png b/app.old/src/app/favicon.png deleted file mode 100644 index 5141653..0000000 Binary files a/app.old/src/app/favicon.png and /dev/null differ diff --git a/app.old/src/app/favicon.svg b/app.old/src/app/favicon.svg deleted file mode 100644 index bca38c3..0000000 --- a/app.old/src/app/favicon.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - Favicon - - - - - - - - - - \ No newline at end of file diff --git a/app.old/src/app/global-error.tsx b/app.old/src/app/global-error.tsx deleted file mode 100644 index 01fe25b..0000000 --- a/app.old/src/app/global-error.tsx +++ /dev/null @@ -1,19 +0,0 @@ -"use client"; - -// Todo: Create a real global error page... -export default function GlobalError({ - error, - reset, -}: { - error: Error & { digest?: string }; - reset: () => void; -}) { - return ( - - -

Sorry, something went wrong!

- - - - ); -} diff --git a/app.old/src/app/globals.css b/app.old/src/app/globals.css deleted file mode 100644 index 8868b08..0000000 --- a/app.old/src/app/globals.css +++ /dev/null @@ -1,49 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -:root { - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - } -} - -body { - @apply text-gray-900; -} - -h1 { - @apply text-4xl font-semibold; -} - -h2 { - @apply text-xl font-semibold; -} - -a { - @apply hover:underline; -} - -th { - font-weight: inherit; -} - -.card { - @apply border border-gray-300 bg-gray-100 rounded-md p-4 cursor-pointer hover:border-primary transition-all duration-150 hover:scale-[1.02]; -} - -.button { - @apply cursor-pointer py-2 px-4 rounded-md active:translate-y-0.5; -} - -.btn-primary { - @apply bg-primary hover:bg-primary-semidark border border-primary-semidark text-white disabled:bg-gray-400 disabled:border-none; -} diff --git a/app.old/src/app/icon1.svg b/app.old/src/app/icon1.svg deleted file mode 100644 index bca38c3..0000000 --- a/app.old/src/app/icon1.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - Favicon - - - - - - - - - - \ No newline at end of file diff --git a/app.old/src/app/icon2.png b/app.old/src/app/icon2.png deleted file mode 100644 index 5141653..0000000 Binary files a/app.old/src/app/icon2.png and /dev/null differ diff --git a/app.old/src/app/icon3.png b/app.old/src/app/icon3.png deleted file mode 100644 index 3f23667..0000000 Binary files a/app.old/src/app/icon3.png and /dev/null differ diff --git a/app.old/src/app/icon4.png b/app.old/src/app/icon4.png deleted file mode 100644 index bb4d613..0000000 Binary files a/app.old/src/app/icon4.png and /dev/null differ diff --git a/app.old/src/app/icon5.png b/app.old/src/app/icon5.png deleted file mode 100644 index 5db7d9d..0000000 Binary files a/app.old/src/app/icon5.png and /dev/null differ diff --git a/app.old/src/app/layout.tsx b/app.old/src/app/layout.tsx deleted file mode 100644 index 5970418..0000000 --- a/app.old/src/app/layout.tsx +++ /dev/null @@ -1,71 +0,0 @@ -"use client"; - -import "./globals.css"; -import { redirect, usePathname, useSearchParams } from "next/navigation"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { getJwt, getLoginUrl, postAuthCodeLogin, removeJwt } from "@lib/api"; -import { useEffect } from "react"; -import { useRouter } from "next/navigation"; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - const pathname = usePathname().split("?")[0]; - const queryParams = useSearchParams(); - const authParam = queryParams.get("auth_code"); - const isLoggedIn = Boolean(getJwt()); - const router = useRouter(); - - // Remove "auth_code" query paramter if it exists - const queryParamsWithoutAuth = new URLSearchParams(queryParams); - queryParamsWithoutAuth.delete("auth_code"); - - useEffect(() => { - /** - * Route the user to the correct place, depending on whether they are logged in (i.e. have a - * JWT token in localstorage), or have provided an ?auth_code= URL parameter. - * - * If the user has a JWT token, and provides a new ?auth_code=, use the code to fetch a new JWT. - */ - if (!authParam && !isLoggedIn) { - // User needs to log in - redirect(getLoginUrl()); - } - - if (!authParam && isLoggedIn && pathname == "/") { - redirect("/devices"); - } - - if (!authParam) { - return; - } - - async function handleAuthParam(authParam: string) { - try { - const result = await postAuthCodeLogin(authParam); - localStorage.setItem("byJwt", result.by_jwt); - } catch (e: any) { - alert("Failed to log in. Please try again."); - removeJwt(); - router.push(getLoginUrl()); - } - } - handleAuthParam(authParam); - - router.push(`${pathname}?${queryParamsWithoutAuth}`); - }, [authParam]); - - // Set up Tanstack Query - const queryClient = new QueryClient(); - - return ( - - BringYour Manage Your Network - - {children} - - - ); -} diff --git a/app.old/src/app/page.tsx b/app.old/src/app/page.tsx deleted file mode 100644 index 77f0434..0000000 --- a/app.old/src/app/page.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function Page() { - return ( - <> -
- - ); -} diff --git a/app.old/tailwind.config.ts b/app.old/tailwind.config.ts deleted file mode 100644 index 0d05d9c..0000000 --- a/app.old/tailwind.config.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { Config } from "tailwindcss"; - -const config: Config = { - content: [ - "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", - "./src/components/**/*.{js,ts,jsx,tsx,mdx}", - "./src/app/**/*.{js,ts,jsx,tsx,mdx}", - ], - darkMode: "class", - theme: { - extend: { - colors: { - ok: "#15cd72", - danger: "#CD4439", - primary: { - DEFAULT: "#1D3150", - semidark: "#1a2c48", - dark: "#172740", - }, - secondary: { - DEFAULT: "#A5ACB9", - }, - devicesBlue: "#2B3A82", - provideGreen: "#1E644E", - accountBrown: "#5A4E53", - }, - spacing: { - "76": "19rem", - }, - width: { - "112": "28rem", - "128": "32rem", - }, - }, - }, - plugins: [require("@headlessui/tailwindcss")], -}; -export default config; diff --git a/app.old/tsconfig.json b/app.old/tsconfig.json deleted file mode 100644 index f7300b8..0000000 --- a/app.old/tsconfig.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": [ - "./src/*" - ], - "@lib/*": [ - "./src/app/_lib/*" - ] - } - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - "build/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/app/Dockerfile b/app/Dockerfile index f6b1f20..7422a67 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -1,6 +1,7 @@ FROM ubuntu:22.04 # see https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ +ARG TARGETPLATFORM ARG warp_env ENV WARP_ENV=$warp_env @@ -34,8 +35,8 @@ ADD dist /www/app COPY build/${WARP_ENV}/status.json /srv/warp/status/status.json -EXPOSE 80 +COPY build/$TARGETPLATFORM/app /usr/local/sbin/app # see https://ubuntu.com/blog/avoiding-dropped-connections-in-nginx-containers-with-stopsignal-sigquit STOPSIGNAL SIGQUIT -CMD ["nginx", "-g", "daemon off;"] +CMD ["/usr/local/sbin/app"] diff --git a/app/Makefile b/app/Makefile index d284df6..4048481 100644 --- a/app/Makefile +++ b/app/Makefile @@ -1,7 +1,12 @@ NODE_VERSION := v22.14.0 -all: clean build +all: init clean build + +init: + pip install -r ../requirements.txt + go clean -cache + go clean -modcache clean: rm -rf build @@ -18,6 +23,10 @@ build: $(MAKE) webpack python ../webgen/webgen.py clean nginx/gen.py python ../webgen/webgen.py build nginx/gen.py + env GOOS=linux GOARCH=arm64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/linux/arm64/ + env GOOS=linux GOARCH=amd64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/linux/amd64/ + env GOOS=darwin GOARCH=arm64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/darwin/arm64/ + env GOOS=darwin GOARCH=amd64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/darwin/amd64/ warp_build: $(MAKE) all diff --git a/app/go.mod b/app/go.mod new file mode 100644 index 0000000..6d4e12a --- /dev/null +++ b/app/go.mod @@ -0,0 +1,7 @@ +module github.com/urnetwork/web/app + +go 1.24.0 + +require github.com/urnetwork/warp v0.0.0 + +replace github.com/urnetwork/warp => ../../warp diff --git a/app/main.go b/app/main.go new file mode 100644 index 0000000..9e24bed --- /dev/null +++ b/app/main.go @@ -0,0 +1,22 @@ +package main + +import ( + "os" + + "github.com/urnetwork/warp" +) + +// this value is set via the linker, e.g. +// -ldflags "-X main.Version=$WARP_VERSION-$WARP_VERSION_CODE" +var Version string + +func main() { + configPath := "/etc/nginx/nginx.conf" + convertedConfigPath := "/etc/nginx/nginx_host.conf" + + err, exitCode := warp.Nginx(configPath, convertedConfigPath) + if err != nil { + panic(err) + } + os.Exit(exitCode) +} diff --git a/legal/Makefile b/legal/Makefile deleted file mode 100644 index 7d68076..0000000 --- a/legal/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# convert the master docx to a markdown that can be hand edited to clean up -# pandoc -f docx -t markdown BringYour\ Privacy\ Policy\ -\ v1.docx -o export2/privacyout.md - -# convert the markdown to a clean html -# pandoc -f markdown -t html terms.md -o build/terms.html - diff --git a/nginx/gen.py b/nginx/gen.py deleted file mode 100644 index 9409c46..0000000 --- a/nginx/gen.py +++ /dev/null @@ -1,9 +0,0 @@ -import uuid -import time -from datetime import datetime, timezone - -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified -http_last_modified = datetime.now(timezone.utc).strftime("%a, %d %b %Y %H:%M:%S %Z") - -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag -http_etag = uuid.uuid1().hex diff --git a/nginx/mime.types b/nginx/mime.types deleted file mode 100644 index c21a0d8..0000000 --- a/nginx/mime.types +++ /dev/null @@ -1,100 +0,0 @@ - -types { - text/html html htm shtml; - text/css css; - text/xml xml; - image/gif gif; - image/jpeg jpeg jpg; - application/javascript js; - application/atom+xml atom; - application/rss+xml rss; - - text/mathml mml; - text/plain txt; - text/vnd.sun.j2me.app-descriptor jad; - text/vnd.wap.wml wml; - text/x-component htc; - - image/avif avif; - image/png png; - image/svg+xml svg svgz; - image/tiff tif tiff; - image/vnd.wap.wbmp wbmp; - image/webp webp; - image/x-icon ico; - image/x-jng jng; - image/x-ms-bmp bmp; - - font/woff woff; - font/woff2 woff2; - font/ttf ttf; - - application/java-archive jar war ear; - application/json json; - application/mac-binhex40 hqx; - application/msword doc; - application/pdf pdf; - application/postscript ps eps ai; - application/rtf rtf; - application/vnd.apple.mpegurl m3u8; - application/vnd.google-earth.kml+xml kml; - application/vnd.google-earth.kmz kmz; - application/vnd.ms-excel xls; - application/vnd.ms-fontobject eot; - application/vnd.ms-powerpoint ppt; - application/vnd.oasis.opendocument.graphics odg; - application/vnd.oasis.opendocument.presentation odp; - application/vnd.oasis.opendocument.spreadsheet ods; - application/vnd.oasis.opendocument.text odt; - application/vnd.openxmlformats-officedocument.presentationml.presentation - pptx; - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - xlsx; - application/vnd.openxmlformats-officedocument.wordprocessingml.document - docx; - application/vnd.wap.wmlc wmlc; - application/wasm wasm; - application/x-7z-compressed 7z; - application/x-cocoa cco; - application/x-java-archive-diff jardiff; - application/x-java-jnlp-file jnlp; - application/x-makeself run; - application/x-perl pl pm; - application/x-pilot prc pdb; - application/x-rar-compressed rar; - application/x-redhat-package-manager rpm; - application/x-sea sea; - application/x-shockwave-flash swf; - application/x-stuffit sit; - application/x-tcl tcl tk; - application/x-x509-ca-cert der pem crt; - application/x-xpinstall xpi; - application/xhtml+xml xhtml; - application/xspf+xml xspf; - application/zip zip; - - application/octet-stream bin exe dll; - application/octet-stream deb; - application/octet-stream dmg; - application/octet-stream iso img; - application/octet-stream msi msp msm; - - audio/midi mid midi kar; - audio/mpeg mp3; - audio/ogg ogg; - audio/x-m4a m4a; - audio/x-realaudio ra; - - video/3gpp 3gpp 3gp; - video/mp2t ts; - video/mp4 mp4; - video/mpeg mpeg mpg; - video/quicktime mov; - video/webm webm; - video/x-flv flv; - video/x-m4v m4v; - video/x-mng mng; - video/x-ms-asf asx asf; - video/x-ms-wmv wmv; - video/x-msvideo avi; -} diff --git a/Dockerfile b/web/Dockerfile similarity index 89% rename from Dockerfile rename to web/Dockerfile index 52a31ef..42e1f55 100644 --- a/Dockerfile +++ b/web/Dockerfile @@ -1,6 +1,7 @@ FROM ubuntu:22.04 # see https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ +ARG TARGETPLATFORM ARG warp_env ENV WARP_ENV=$warp_env @@ -30,7 +31,7 @@ RUN apt-get update && apt-get install -y \ RUN nginx -V ADD nginx/build/ /etc/nginx/ -ADD bringyour.com/build /www/bringyour.com +ADD ../bringyour.com/build /www/bringyour.com # make sure all static files can be read RUN find /www/bringyour.com -type d -exec chmod ugo=rx {} + @@ -38,8 +39,8 @@ RUN find /www/bringyour.com -type f -exec chmod ugo=r {} + COPY build/${WARP_ENV}/status.json /srv/warp/status/status.json -EXPOSE 80 +COPY build/$TARGETPLATFORM/web /usr/local/sbin/web # see https://ubuntu.com/blog/avoiding-dropped-connections-in-nginx-containers-with-stopsignal-sigquit STOPSIGNAL SIGQUIT -CMD ["nginx", "-g", "daemon off;"] +CMD ["/usr/local/sbin/web"] diff --git a/Makefile b/web/Makefile similarity index 74% rename from Makefile rename to web/Makefile index 01e91be..eed5b6b 100644 --- a/Makefile +++ b/web/Makefile @@ -1,12 +1,11 @@ NODE_VERSION := v20.10.0 - all: init clean build gen_components # brew install pandoc init: - pip install -r requirements.txt + pip install -r ../requirements.txt (. ${NVM_DIR}/nvm.sh && \ nvm install ${NODE_VERSION} && \ nvm exec ${NODE_VERSION} npm install html-validate -g && \ @@ -14,13 +13,17 @@ init: nvm exec ${NODE_VERSION} npm install uglify-js -g && \ nvm exec ${NODE_VERSION} npm install clean-css-cli -g && \ nvm exec ${NODE_VERSION} npm install purgecss -g) + go clean -cache + go clean -modcache clean: - python webgen/webgen.py clean bringyour.com/gen.py + python ../webgen/webgen.py clean bringyour.com/gen.py rm -rf build build: - python webgen/webgen.py build bringyour.com/gen.py + (. ${NVM_DIR}/nvm.sh && \ + nvm use ${NODE_VERSION} && \ + python ../webgen/webgen.py build bringyour.com/gen.py) # generate the api docs into the latest build npx -y @redocly/cli build-docs ${BRINGYOUR_HOME}/connect/api/bringyour.yml -o bringyour.com/build/api.html # npx -y @redocly/cli build-docs ${BRINGYOUR_HOME}/connect/api/gpt.yml -o bringyour.com/build/gpt.html @@ -29,12 +32,16 @@ build: pandoc -f markdown -t plain ${BRINGYOUR_HOME}/docs/legal/terms.md -o bringyour.com/build/terms.txt pandoc -f markdown -t plain ${BRINGYOUR_HOME}/docs/legal/vdp.md -o bringyour.com/build/vdp.txt # include altstore - cp -r altstore bringyour.com/build/altstore + cp -r ../altstore bringyour.com/build/altstore + env GOOS=linux GOARCH=arm64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/linux/arm64/ + env GOOS=linux GOARCH=amd64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/linux/amd64/ + env GOOS=darwin GOARCH=arm64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/darwin/arm64/ + env GOOS=darwin GOARCH=amd64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/darwin/amd64/ warp_build: $(MAKE) all - python webgen/webgen.py clean nginx/gen.py - python webgen/webgen.py build nginx/gen.py + python ../webgen/webgen.py clean nginx/gen.py + python ../webgen/webgen.py build nginx/gen.py mkdir -p build/${WARP_ENV} echo "{\"version\":\"${WARP_VERSION}\",\"status\":\"ok\"}" > build/${WARP_ENV}/status.json @@ -80,8 +87,8 @@ local_routing_off: run_local: $(MAKE) build - python webgen/webgen.py clean nginx-local/gen.py - python webgen/webgen.py build nginx-local/gen.py + python ../webgen/webgen.py clean nginx-local/gen.py + python ../webgen/webgen.py build nginx-local/gen.py mkdir nginx-local/build/log $(MAKE) local_routing_on trap "$(MAKE) local_routing_off" EXIT && $(MAKE) run_local_nginx diff --git a/bringyour.com/.well-known/assetlinks.json b/web/bringyour.com/.well-known/assetlinks.json similarity index 100% rename from bringyour.com/.well-known/assetlinks.json rename to web/bringyour.com/.well-known/assetlinks.json diff --git a/bringyour.com/.well-known/pgp-key.txt b/web/bringyour.com/.well-known/pgp-key.txt similarity index 100% rename from bringyour.com/.well-known/pgp-key.txt rename to web/bringyour.com/.well-known/pgp-key.txt diff --git a/bringyour.com/.well-known/privacy.txt b/web/bringyour.com/.well-known/privacy.txt similarity index 100% rename from bringyour.com/.well-known/privacy.txt rename to web/bringyour.com/.well-known/privacy.txt diff --git a/bringyour.com/.well-known/security.txt b/web/bringyour.com/.well-known/security.txt similarity index 100% rename from bringyour.com/.well-known/security.txt rename to web/bringyour.com/.well-known/security.txt diff --git a/bringyour.com/apple-touch-icon.png b/web/bringyour.com/apple-touch-icon.png similarity index 100% rename from bringyour.com/apple-touch-icon.png rename to web/bringyour.com/apple-touch-icon.png diff --git a/bringyour.com/blog/index.html.j2 b/web/bringyour.com/blog/index.html.j2 similarity index 100% rename from bringyour.com/blog/index.html.j2 rename to web/bringyour.com/blog/index.html.j2 diff --git a/bringyour.com/blog/visual/index.html.j2 b/web/bringyour.com/blog/visual/index.html.j2 similarity index 100% rename from bringyour.com/blog/visual/index.html.j2 rename to web/bringyour.com/blog/visual/index.html.j2 diff --git a/bringyour.com/blog/visual/vis/client2vis/client2vis.js b/web/bringyour.com/blog/visual/vis/client2vis/client2vis.js similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/client2vis.js rename to web/bringyour.com/blog/visual/vis/client2vis/client2vis.js diff --git a/bringyour.com/blog/visual/vis/client2vis/export-high.json b/web/bringyour.com/blog/visual/vis/client2vis/export-high.json similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/export-high.json rename to web/bringyour.com/blog/visual/vis/client2vis/export-high.json diff --git a/bringyour.com/blog/visual/vis/client2vis/export-low.json b/web/bringyour.com/blog/visual/vis/client2vis/export-low.json similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/export-low.json rename to web/bringyour.com/blog/visual/vis/client2vis/export-low.json diff --git a/bringyour.com/blog/visual/vis/client2vis/export-med.json b/web/bringyour.com/blog/visual/vis/client2vis/export-med.json similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/export-med.json rename to web/bringyour.com/blog/visual/vis/client2vis/export-med.json diff --git a/bringyour.com/blog/visual/vis/client2vis/index-high.html b/web/bringyour.com/blog/visual/vis/client2vis/index-high.html similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/index-high.html rename to web/bringyour.com/blog/visual/vis/client2vis/index-high.html diff --git a/bringyour.com/blog/visual/vis/client2vis/index-low.html b/web/bringyour.com/blog/visual/vis/client2vis/index-low.html similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/index-low.html rename to web/bringyour.com/blog/visual/vis/client2vis/index-low.html diff --git a/bringyour.com/blog/visual/vis/client2vis/index-med.html b/web/bringyour.com/blog/visual/vis/client2vis/index-med.html similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/index-med.html rename to web/bringyour.com/blog/visual/vis/client2vis/index-med.html diff --git a/bringyour.com/blog/visual/vis/client2vis/index.html b/web/bringyour.com/blog/visual/vis/client2vis/index.html similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/index.html rename to web/bringyour.com/blog/visual/vis/client2vis/index.html diff --git a/bringyour.com/blog/visual/vis/client2vis/libraries/p5.min.js b/web/bringyour.com/blog/visual/vis/client2vis/libraries/p5.min.js similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/libraries/p5.min.js rename to web/bringyour.com/blog/visual/vis/client2vis/libraries/p5.min.js diff --git a/bringyour.com/blog/visual/vis/client2vis/sketch.properties b/web/bringyour.com/blog/visual/vis/client2vis/sketch.properties similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/sketch.properties rename to web/bringyour.com/blog/visual/vis/client2vis/sketch.properties diff --git a/bringyour.com/blog/visual/vis/latencymap/index.html b/web/bringyour.com/blog/visual/vis/latencymap/index.html similarity index 100% rename from bringyour.com/blog/visual/vis/latencymap/index.html rename to web/bringyour.com/blog/visual/vis/latencymap/index.html diff --git a/bringyour.com/blog/visual/vis/latencymap/latencymap.js b/web/bringyour.com/blog/visual/vis/latencymap/latencymap.js similarity index 100% rename from bringyour.com/blog/visual/vis/latencymap/latencymap.js rename to web/bringyour.com/blog/visual/vis/latencymap/latencymap.js diff --git a/bringyour.com/blog/visual/vis/latencymap/libraries/p5.min.js b/web/bringyour.com/blog/visual/vis/latencymap/libraries/p5.min.js similarity index 100% rename from bringyour.com/blog/visual/vis/latencymap/libraries/p5.min.js rename to web/bringyour.com/blog/visual/vis/latencymap/libraries/p5.min.js diff --git a/bringyour.com/blog/visual/vis/latencymap/sketch.properties b/web/bringyour.com/blog/visual/vis/latencymap/sketch.properties similarity index 100% rename from bringyour.com/blog/visual/vis/latencymap/sketch.properties rename to web/bringyour.com/blog/visual/vis/latencymap/sketch.properties diff --git a/bringyour.com/blog/visual/vis/linpath/index.html b/web/bringyour.com/blog/visual/vis/linpath/index.html similarity index 100% rename from bringyour.com/blog/visual/vis/linpath/index.html rename to web/bringyour.com/blog/visual/vis/linpath/index.html diff --git a/bringyour.com/blog/visual/vis/linpath/libraries/p5.min.js b/web/bringyour.com/blog/visual/vis/linpath/libraries/p5.min.js similarity index 100% rename from bringyour.com/blog/visual/vis/linpath/libraries/p5.min.js rename to web/bringyour.com/blog/visual/vis/linpath/libraries/p5.min.js diff --git a/bringyour.com/blog/visual/vis/linpath/linpath.js b/web/bringyour.com/blog/visual/vis/linpath/linpath.js similarity index 100% rename from bringyour.com/blog/visual/vis/linpath/linpath.js rename to web/bringyour.com/blog/visual/vis/linpath/linpath.js diff --git a/bringyour.com/blog/visual/vis/linpath/sketch.properties b/web/bringyour.com/blog/visual/vis/linpath/sketch.properties similarity index 100% rename from bringyour.com/blog/visual/vis/linpath/sketch.properties rename to web/bringyour.com/blog/visual/vis/linpath/sketch.properties diff --git a/bringyour.com/blog/visual/visual.md b/web/bringyour.com/blog/visual/visual.md similarity index 100% rename from bringyour.com/blog/visual/visual.md rename to web/bringyour.com/blog/visual/visual.md diff --git a/bringyour.com/client.js b/web/bringyour.com/client.js similarity index 100% rename from bringyour.com/client.js rename to web/bringyour.com/client.js diff --git a/bringyour.com/connect.js b/web/bringyour.com/connect.js similarity index 100% rename from bringyour.com/connect.js rename to web/bringyour.com/connect.js diff --git a/bringyour.com/connect_mock.js b/web/bringyour.com/connect_mock.js similarity index 100% rename from bringyour.com/connect_mock.js rename to web/bringyour.com/connect_mock.js diff --git a/bringyour.com/favicon-128.png b/web/bringyour.com/favicon-128.png similarity index 100% rename from bringyour.com/favicon-128.png rename to web/bringyour.com/favicon-128.png diff --git a/bringyour.com/favicon-180.png b/web/bringyour.com/favicon-180.png similarity index 100% rename from bringyour.com/favicon-180.png rename to web/bringyour.com/favicon-180.png diff --git a/bringyour.com/favicon-32.png b/web/bringyour.com/favicon-32.png similarity index 100% rename from bringyour.com/favicon-32.png rename to web/bringyour.com/favicon-32.png diff --git a/bringyour.com/favicon.png b/web/bringyour.com/favicon.png similarity index 100% rename from bringyour.com/favicon.png rename to web/bringyour.com/favicon.png diff --git a/bringyour.com/favicon.svg b/web/bringyour.com/favicon.svg similarity index 100% rename from bringyour.com/favicon.svg rename to web/bringyour.com/favicon.svg diff --git a/bringyour.com/flag.js b/web/bringyour.com/flag.js similarity index 100% rename from bringyour.com/flag.js rename to web/bringyour.com/flag.js diff --git a/bringyour.com/footer.js b/web/bringyour.com/footer.js similarity index 100% rename from bringyour.com/footer.js rename to web/bringyour.com/footer.js diff --git a/bringyour.com/gen.py b/web/bringyour.com/gen.py similarity index 100% rename from bringyour.com/gen.py rename to web/bringyour.com/gen.py diff --git a/bringyour.com/index.html.j2 b/web/bringyour.com/index.html.j2 similarity index 100% rename from bringyour.com/index.html.j2 rename to web/bringyour.com/index.html.j2 diff --git a/bringyour.com/lib-ur/bootstrap.bundle.min.js b/web/bringyour.com/lib-ur/bootstrap.bundle.min.js similarity index 100% rename from bringyour.com/lib-ur/bootstrap.bundle.min.js rename to web/bringyour.com/lib-ur/bootstrap.bundle.min.js diff --git a/bringyour.com/lib-ur/c.js b/web/bringyour.com/lib-ur/c.js similarity index 100% rename from bringyour.com/lib-ur/c.js rename to web/bringyour.com/lib-ur/c.js diff --git a/bringyour.com/lib-ur/connect-button.js b/web/bringyour.com/lib-ur/connect-button.js similarity index 100% rename from bringyour.com/lib-ur/connect-button.js rename to web/bringyour.com/lib-ur/connect-button.js diff --git a/bringyour.com/lib-ur/connect.js b/web/bringyour.com/lib-ur/connect.js similarity index 100% rename from bringyour.com/lib-ur/connect.js rename to web/bringyour.com/lib-ur/connect.js diff --git a/bringyour.com/lib/bootstrap.bundle.min.js b/web/bringyour.com/lib/bootstrap.bundle.min.js similarity index 100% rename from bringyour.com/lib/bootstrap.bundle.min.js rename to web/bringyour.com/lib/bootstrap.bundle.min.js diff --git a/bringyour.com/lib/d3.min.js b/web/bringyour.com/lib/d3.min.js similarity index 100% rename from bringyour.com/lib/d3.min.js rename to web/bringyour.com/lib/d3.min.js diff --git a/bringyour.com/lib/jquery.min.js b/web/bringyour.com/lib/jquery.min.js similarity index 100% rename from bringyour.com/lib/jquery.min.js rename to web/bringyour.com/lib/jquery.min.js diff --git a/bringyour.com/lib/p5.min.js b/web/bringyour.com/lib/p5.min.js similarity index 100% rename from bringyour.com/lib/p5.min.js rename to web/bringyour.com/lib/p5.min.js diff --git a/bringyour.com/lib/widgetbot.min.js b/web/bringyour.com/lib/widgetbot.min.js similarity index 100% rename from bringyour.com/lib/widgetbot.min.js rename to web/bringyour.com/lib/widgetbot.min.js diff --git a/bringyour.com/logo.js b/web/bringyour.com/logo.js similarity index 100% rename from bringyour.com/logo.js rename to web/bringyour.com/logo.js diff --git a/bringyour.com/manifest.json b/web/bringyour.com/manifest.json similarity index 100% rename from bringyour.com/manifest.json rename to web/bringyour.com/manifest.json diff --git a/bringyour.com/res-ur/images/icon-192x192.png b/web/bringyour.com/res-ur/images/icon-192x192.png similarity index 100% rename from bringyour.com/res-ur/images/icon-192x192.png rename to web/bringyour.com/res-ur/images/icon-192x192.png diff --git a/bringyour.com/res-ur/images/icon.png b/web/bringyour.com/res-ur/images/icon.png similarity index 100% rename from bringyour.com/res-ur/images/icon.png rename to web/bringyour.com/res-ur/images/icon.png diff --git a/bringyour.com/res-ur/images/icon.svg b/web/bringyour.com/res-ur/images/icon.svg similarity index 100% rename from bringyour.com/res-ur/images/icon.svg rename to web/bringyour.com/res-ur/images/icon.svg diff --git a/bringyour.com/res-ur/videos/solana_urnetwork_final.mp4 b/web/bringyour.com/res-ur/videos/solana_urnetwork_final.mp4 similarity index 100% rename from bringyour.com/res-ur/videos/solana_urnetwork_final.mp4 rename to web/bringyour.com/res-ur/videos/solana_urnetwork_final.mp4 diff --git a/bringyour.com/res-ur/videos/solana_urnetwork_web_comp1.mp4 b/web/bringyour.com/res-ur/videos/solana_urnetwork_web_comp1.mp4 similarity index 100% rename from bringyour.com/res-ur/videos/solana_urnetwork_web_comp1.mp4 rename to web/bringyour.com/res-ur/videos/solana_urnetwork_web_comp1.mp4 diff --git a/bringyour.com/res/css-ur/bootstrap.min.css b/web/bringyour.com/res/css-ur/bootstrap.min.css similarity index 100% rename from bringyour.com/res/css-ur/bootstrap.min.css rename to web/bringyour.com/res/css-ur/bootstrap.min.css diff --git a/bringyour.com/res/css-ur/connect.css b/web/bringyour.com/res/css-ur/connect.css similarity index 100% rename from bringyour.com/res/css-ur/connect.css rename to web/bringyour.com/res/css-ur/connect.css diff --git a/bringyour.com/res/css/bootstrap.min.css b/web/bringyour.com/res/css/bootstrap.min.css similarity index 100% rename from bringyour.com/res/css/bootstrap.min.css rename to web/bringyour.com/res/css/bootstrap.min.css diff --git a/bringyour.com/res/css/connect.css b/web/bringyour.com/res/css/connect.css similarity index 100% rename from bringyour.com/res/css/connect.css rename to web/bringyour.com/res/css/connect.css diff --git a/bringyour.com/res/css/main.css b/web/bringyour.com/res/css/main.css similarity index 100% rename from bringyour.com/res/css/main.css rename to web/bringyour.com/res/css/main.css diff --git a/bringyour.com/res/css/stats.css b/web/bringyour.com/res/css/stats.css similarity index 100% rename from bringyour.com/res/css/stats.css rename to web/bringyour.com/res/css/stats.css diff --git a/bringyour.com/res/emails/bringyour-wordmark-bg-240.jpg b/web/bringyour.com/res/emails/bringyour-wordmark-bg-240.jpg similarity index 100% rename from bringyour.com/res/emails/bringyour-wordmark-bg-240.jpg rename to web/bringyour.com/res/emails/bringyour-wordmark-bg-240.jpg diff --git a/bringyour.com/res/emails/ur-welcome-header-1080.jpg b/web/bringyour.com/res/emails/ur-welcome-header-1080.jpg similarity index 100% rename from bringyour.com/res/emails/ur-welcome-header-1080.jpg rename to web/bringyour.com/res/emails/ur-welcome-header-1080.jpg diff --git a/bringyour.com/res/emails/ur-welcome-header.png b/web/bringyour.com/res/emails/ur-welcome-header.png similarity index 100% rename from bringyour.com/res/emails/ur-welcome-header.png rename to web/bringyour.com/res/emails/ur-welcome-header.png diff --git a/bringyour.com/res/emails/ur-wordmark-bg-240.jpg b/web/bringyour.com/res/emails/ur-wordmark-bg-240.jpg similarity index 100% rename from bringyour.com/res/emails/ur-wordmark-bg-240.jpg rename to web/bringyour.com/res/emails/ur-wordmark-bg-240.jpg diff --git a/bringyour.com/res/emails/ur-wordmark-black.svg b/web/bringyour.com/res/emails/ur-wordmark-black.svg similarity index 100% rename from bringyour.com/res/emails/ur-wordmark-black.svg rename to web/bringyour.com/res/emails/ur-wordmark-black.svg diff --git a/bringyour.com/res/emails/ur-wordmark-white.svg b/web/bringyour.com/res/emails/ur-wordmark-white.svg similarity index 100% rename from bringyour.com/res/emails/ur-wordmark-white.svg rename to web/bringyour.com/res/emails/ur-wordmark-white.svg diff --git a/bringyour.com/res/emails/urnetwork-bars.gif b/web/bringyour.com/res/emails/urnetwork-bars.gif similarity index 100% rename from bringyour.com/res/emails/urnetwork-bars.gif rename to web/bringyour.com/res/emails/urnetwork-bars.gif diff --git a/bringyour.com/res/emails/urnetwork-goodbye-vpn.gif b/web/bringyour.com/res/emails/urnetwork-goodbye-vpn.gif similarity index 100% rename from bringyour.com/res/emails/urnetwork-goodbye-vpn.gif rename to web/bringyour.com/res/emails/urnetwork-goodbye-vpn.gif diff --git a/bringyour.com/res/emails/urnetwork-notavpn.gif b/web/bringyour.com/res/emails/urnetwork-notavpn.gif similarity index 100% rename from bringyour.com/res/emails/urnetwork-notavpn.gif rename to web/bringyour.com/res/emails/urnetwork-notavpn.gif diff --git a/bringyour.com/res/emails/urnetwork-spin.gif b/web/bringyour.com/res/emails/urnetwork-spin.gif similarity index 100% rename from bringyour.com/res/emails/urnetwork-spin.gif rename to web/bringyour.com/res/emails/urnetwork-spin.gif diff --git a/bringyour.com/res/emails/welcome-header-1080.jpg b/web/bringyour.com/res/emails/welcome-header-1080.jpg similarity index 100% rename from bringyour.com/res/emails/welcome-header-1080.jpg rename to web/bringyour.com/res/emails/welcome-header-1080.jpg diff --git a/bringyour.com/res/emails/welcome-header-1080.webp b/web/bringyour.com/res/emails/welcome-header-1080.webp similarity index 100% rename from bringyour.com/res/emails/welcome-header-1080.webp rename to web/bringyour.com/res/emails/welcome-header-1080.webp diff --git a/bringyour.com/res/fonts/Arkitech-Light.ttf b/web/bringyour.com/res/fonts/Arkitech-Light.ttf similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Light.ttf rename to web/bringyour.com/res/fonts/Arkitech-Light.ttf diff --git a/bringyour.com/res/fonts/Arkitech-Light.woff b/web/bringyour.com/res/fonts/Arkitech-Light.woff similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Light.woff rename to web/bringyour.com/res/fonts/Arkitech-Light.woff diff --git a/bringyour.com/res/fonts/Arkitech-Light.woff2 b/web/bringyour.com/res/fonts/Arkitech-Light.woff2 similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Light.woff2 rename to web/bringyour.com/res/fonts/Arkitech-Light.woff2 diff --git a/bringyour.com/res/fonts/Arkitech-Medium.ttf b/web/bringyour.com/res/fonts/Arkitech-Medium.ttf similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Medium.ttf rename to web/bringyour.com/res/fonts/Arkitech-Medium.ttf diff --git a/bringyour.com/res/fonts/Arkitech-Medium.woff b/web/bringyour.com/res/fonts/Arkitech-Medium.woff similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Medium.woff rename to web/bringyour.com/res/fonts/Arkitech-Medium.woff diff --git a/bringyour.com/res/fonts/Arkitech-Medium.woff2 b/web/bringyour.com/res/fonts/Arkitech-Medium.woff2 similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Medium.woff2 rename to web/bringyour.com/res/fonts/Arkitech-Medium.woff2 diff --git a/bringyour.com/res/fonts/Barlow-Light.woff2 b/web/bringyour.com/res/fonts/Barlow-Light.woff2 similarity index 100% rename from bringyour.com/res/fonts/Barlow-Light.woff2 rename to web/bringyour.com/res/fonts/Barlow-Light.woff2 diff --git a/bringyour.com/res/fonts/Barlow-Medium.woff2 b/web/bringyour.com/res/fonts/Barlow-Medium.woff2 similarity index 100% rename from bringyour.com/res/fonts/Barlow-Medium.woff2 rename to web/bringyour.com/res/fonts/Barlow-Medium.woff2 diff --git a/bringyour.com/res/fonts/Barlow-Regular.woff2 b/web/bringyour.com/res/fonts/Barlow-Regular.woff2 similarity index 100% rename from bringyour.com/res/fonts/Barlow-Regular.woff2 rename to web/bringyour.com/res/fonts/Barlow-Regular.woff2 diff --git a/bringyour.com/res/fonts/Barlow-Thin.woff2 b/web/bringyour.com/res/fonts/Barlow-Thin.woff2 similarity index 100% rename from bringyour.com/res/fonts/Barlow-Thin.woff2 rename to web/bringyour.com/res/fonts/Barlow-Thin.woff2 diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.otf b/web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.otf similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-Extended.otf rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.otf diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff b/web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff2 b/web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff2 similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff2 rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff2 diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.otf b/web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.otf similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.otf rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.otf diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff b/web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff2 b/web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff2 similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff2 rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff2 diff --git a/bringyour.com/res/fonts/Material-Symbols-Outlined-400.woff2 b/web/bringyour.com/res/fonts/Material-Symbols-Outlined-400.woff2 similarity index 100% rename from bringyour.com/res/fonts/Material-Symbols-Outlined-400.woff2 rename to web/bringyour.com/res/fonts/Material-Symbols-Outlined-400.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-100.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-100.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-100.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-100.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-200.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-200.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-200.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-200.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-300.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-300.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-300.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-300.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-400.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-400.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-400.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-400.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-500.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-500.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-500.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-500.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-600.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-600.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-600.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-600.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-700.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-700.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-700.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-700.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-800.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-800.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-800.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-800.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-100.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-100.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-100.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-100.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-200.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-200.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-200.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-200.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-300.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-300.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-300.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-300.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-400.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-400.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-400.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-400.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-500.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-500.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-500.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-500.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-600.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-600.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-600.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-600.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-700.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-700.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-700.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-700.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-800.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-800.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-800.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-800.woff2 diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.eot b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.eot similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.eot rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.eot diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.otf b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.otf similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.otf rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.otf diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.ttf b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.ttf similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.ttf rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.ttf diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff2 b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff2 similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff2 rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff2 diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.eot b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.eot similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.eot rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.eot diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.otf b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.otf similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.otf rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.otf diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.ttf b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.ttf similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.ttf rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.ttf diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff2 b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff2 similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff2 rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff2 diff --git "a/bringyour.com/res/fonts/PPNeueMontreal/Icon\r" "b/web/bringyour.com/res/fonts/PPNeueMontreal/Icon\r" similarity index 100% rename from "bringyour.com/res/fonts/PPNeueMontreal/Icon\r" rename to "web/bringyour.com/res/fonts/PPNeueMontreal/Icon\r" diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.otf b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.otf similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.otf rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.otf diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.ttf b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.ttf similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.ttf rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.ttf diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff2 b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff2 similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff2 rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff2 diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.otf b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.otf similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.otf rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.otf diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.ttf b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.ttf similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.ttf rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.ttf diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff2 b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff2 similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff2 rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff2 diff --git a/bringyour.com/res/fonts/Pacifico-Latin-400.woff2 b/web/bringyour.com/res/fonts/Pacifico-Latin-400.woff2 similarity index 100% rename from bringyour.com/res/fonts/Pacifico-Latin-400.woff2 rename to web/bringyour.com/res/fonts/Pacifico-Latin-400.woff2 diff --git a/bringyour.com/res/fonts/Pacifico-LatinExt-400.woff2 b/web/bringyour.com/res/fonts/Pacifico-LatinExt-400.woff2 similarity index 100% rename from bringyour.com/res/fonts/Pacifico-LatinExt-400.woff2 rename to web/bringyour.com/res/fonts/Pacifico-LatinExt-400.woff2 diff --git a/bringyour.com/res/fonts/arkitech.css b/web/bringyour.com/res/fonts/arkitech.css similarity index 100% rename from bringyour.com/res/fonts/arkitech.css rename to web/bringyour.com/res/fonts/arkitech.css diff --git a/bringyour.com/res/fonts/barlow.css b/web/bringyour.com/res/fonts/barlow.css similarity index 100% rename from bringyour.com/res/fonts/barlow.css rename to web/bringyour.com/res/fonts/barlow.css diff --git a/bringyour.com/res/fonts/gravity.css b/web/bringyour.com/res/fonts/gravity.css similarity index 100% rename from bringyour.com/res/fonts/gravity.css rename to web/bringyour.com/res/fonts/gravity.css diff --git a/bringyour.com/res/fonts/material-symbols-outlined.css b/web/bringyour.com/res/fonts/material-symbols-outlined.css similarity index 100% rename from bringyour.com/res/fonts/material-symbols-outlined.css rename to web/bringyour.com/res/fonts/material-symbols-outlined.css diff --git a/bringyour.com/res/fonts/noto-sans.css b/web/bringyour.com/res/fonts/noto-sans.css similarity index 100% rename from bringyour.com/res/fonts/noto-sans.css rename to web/bringyour.com/res/fonts/noto-sans.css diff --git a/bringyour.com/res/fonts/pacifico.css b/web/bringyour.com/res/fonts/pacifico.css similarity index 100% rename from bringyour.com/res/fonts/pacifico.css rename to web/bringyour.com/res/fonts/pacifico.css diff --git a/bringyour.com/res/fonts/pp-neue-bit.css b/web/bringyour.com/res/fonts/pp-neue-bit.css similarity index 100% rename from bringyour.com/res/fonts/pp-neue-bit.css rename to web/bringyour.com/res/fonts/pp-neue-bit.css diff --git a/bringyour.com/res/fonts/pp-neue-montreal.css b/web/bringyour.com/res/fonts/pp-neue-montreal.css similarity index 100% rename from bringyour.com/res/fonts/pp-neue-montreal.css rename to web/bringyour.com/res/fonts/pp-neue-montreal.css diff --git a/bringyour.com/res/images/1TiB.png b/web/bringyour.com/res/images/1TiB.png similarity index 100% rename from bringyour.com/res/images/1TiB.png rename to web/bringyour.com/res/images/1TiB.png diff --git a/bringyour.com/res/images/2TiB.png b/web/bringyour.com/res/images/2TiB.png similarity index 100% rename from bringyour.com/res/images/2TiB.png rename to web/bringyour.com/res/images/2TiB.png diff --git a/bringyour.com/res/images/300GiB.png b/web/bringyour.com/res/images/300GiB.png similarity index 100% rename from bringyour.com/res/images/300GiB.png rename to web/bringyour.com/res/images/300GiB.png diff --git a/bringyour.com/res/images/Company100TiB.png b/web/bringyour.com/res/images/Company100TiB.png similarity index 100% rename from bringyour.com/res/images/Company100TiB.png rename to web/bringyour.com/res/images/Company100TiB.png diff --git a/bringyour.com/res/images/Company10TiB.png b/web/bringyour.com/res/images/Company10TiB.png similarity index 100% rename from bringyour.com/res/images/Company10TiB.png rename to web/bringyour.com/res/images/Company10TiB.png diff --git a/bringyour.com/res/images/URnetwork-logo-black-400-80.svg b/web/bringyour.com/res/images/URnetwork-logo-black-400-80.svg similarity index 100% rename from bringyour.com/res/images/URnetwork-logo-black-400-80.svg rename to web/bringyour.com/res/images/URnetwork-logo-black-400-80.svg diff --git a/bringyour.com/res/images/arrow-back.svg b/web/bringyour.com/res/images/arrow-back.svg similarity index 100% rename from bringyour.com/res/images/arrow-back.svg rename to web/bringyour.com/res/images/arrow-back.svg diff --git a/bringyour.com/res/images/bg-0.png b/web/bringyour.com/res/images/bg-0.png similarity index 100% rename from bringyour.com/res/images/bg-0.png rename to web/bringyour.com/res/images/bg-0.png diff --git a/bringyour.com/res/images/bg-1.png b/web/bringyour.com/res/images/bg-1.png similarity index 100% rename from bringyour.com/res/images/bg-1.png rename to web/bringyour.com/res/images/bg-1.png diff --git a/bringyour.com/res/images/bg-2.png b/web/bringyour.com/res/images/bg-2.png similarity index 100% rename from bringyour.com/res/images/bg-2.png rename to web/bringyour.com/res/images/bg-2.png diff --git a/bringyour.com/res/images/bringyour-wordmark-260.svg b/web/bringyour.com/res/images/bringyour-wordmark-260.svg similarity index 100% rename from bringyour.com/res/images/bringyour-wordmark-260.svg rename to web/bringyour.com/res/images/bringyour-wordmark-260.svg diff --git a/bringyour.com/res/images/bringyour-wordmark-340-80.svg b/web/bringyour.com/res/images/bringyour-wordmark-340-80.svg similarity index 100% rename from bringyour.com/res/images/bringyour-wordmark-340-80.svg rename to web/bringyour.com/res/images/bringyour-wordmark-340-80.svg diff --git a/bringyour.com/res/images/bringyour-wordmark-sq-260.png b/web/bringyour.com/res/images/bringyour-wordmark-sq-260.png similarity index 100% rename from bringyour.com/res/images/bringyour-wordmark-sq-260.png rename to web/bringyour.com/res/images/bringyour-wordmark-sq-260.png diff --git a/bringyour.com/res/images/bringyour-wordmark-white.png b/web/bringyour.com/res/images/bringyour-wordmark-white.png similarity index 100% rename from bringyour.com/res/images/bringyour-wordmark-white.png rename to web/bringyour.com/res/images/bringyour-wordmark-white.png diff --git a/bringyour.com/res/images/bringyour-wordmark.png b/web/bringyour.com/res/images/bringyour-wordmark.png similarity index 100% rename from bringyour.com/res/images/bringyour-wordmark.png rename to web/bringyour.com/res/images/bringyour-wordmark.png diff --git a/bringyour.com/res/images/by.svg b/web/bringyour.com/res/images/by.svg similarity index 100% rename from bringyour.com/res/images/by.svg rename to web/bringyour.com/res/images/by.svg diff --git a/bringyour.com/res/images/cat6-wc.jpg b/web/bringyour.com/res/images/cat6-wc.jpg similarity index 100% rename from bringyour.com/res/images/cat6-wc.jpg rename to web/bringyour.com/res/images/cat6-wc.jpg diff --git a/bringyour.com/res/images/cat6.afphoto b/web/bringyour.com/res/images/cat6.afphoto similarity index 100% rename from bringyour.com/res/images/cat6.afphoto rename to web/bringyour.com/res/images/cat6.afphoto diff --git a/bringyour.com/res/images/cat6.jpg b/web/bringyour.com/res/images/cat6.jpg similarity index 100% rename from bringyour.com/res/images/cat6.jpg rename to web/bringyour.com/res/images/cat6.jpg diff --git a/bringyour.com/res/images/favicon.svg b/web/bringyour.com/res/images/favicon.svg similarity index 100% rename from bringyour.com/res/images/favicon.svg rename to web/bringyour.com/res/images/favicon.svg diff --git a/bringyour.com/res/images/ff-extended.svg b/web/bringyour.com/res/images/ff-extended.svg similarity index 100% rename from bringyour.com/res/images/ff-extended.svg rename to web/bringyour.com/res/images/ff-extended.svg diff --git a/bringyour.com/res/images/ip-connected.svg b/web/bringyour.com/res/images/ip-connected.svg similarity index 100% rename from bringyour.com/res/images/ip-connected.svg rename to web/bringyour.com/res/images/ip-connected.svg diff --git a/bringyour.com/res/images/ip-disconnected.svg b/web/bringyour.com/res/images/ip-disconnected.svg similarity index 100% rename from bringyour.com/res/images/ip-disconnected.svg rename to web/bringyour.com/res/images/ip-disconnected.svg diff --git a/bringyour.com/res/images/ip-inevaluation.svg b/web/bringyour.com/res/images/ip-inevaluation.svg similarity index 100% rename from bringyour.com/res/images/ip-inevaluation.svg rename to web/bringyour.com/res/images/ip-inevaluation.svg diff --git a/bringyour.com/res/images/ip-pulse.svg b/web/bringyour.com/res/images/ip-pulse.svg similarity index 100% rename from bringyour.com/res/images/ip-pulse.svg rename to web/bringyour.com/res/images/ip-pulse.svg diff --git a/bringyour.com/res/images/lagdev.svg b/web/bringyour.com/res/images/lagdev.svg similarity index 100% rename from bringyour.com/res/images/lagdev.svg rename to web/bringyour.com/res/images/lagdev.svg diff --git a/bringyour.com/res/images/logo-placeholder.png b/web/bringyour.com/res/images/logo-placeholder.png similarity index 100% rename from bringyour.com/res/images/logo-placeholder.png rename to web/bringyour.com/res/images/logo-placeholder.png diff --git a/bringyour.com/res/images/pack-2-alpha.png b/web/bringyour.com/res/images/pack-2-alpha.png similarity index 100% rename from bringyour.com/res/images/pack-2-alpha.png rename to web/bringyour.com/res/images/pack-2-alpha.png diff --git a/bringyour.com/res/images/pack-2-alpha.webp b/web/bringyour.com/res/images/pack-2-alpha.webp similarity index 100% rename from bringyour.com/res/images/pack-2-alpha.webp rename to web/bringyour.com/res/images/pack-2-alpha.webp diff --git a/bringyour.com/res/images/pack-2.png b/web/bringyour.com/res/images/pack-2.png similarity index 100% rename from bringyour.com/res/images/pack-2.png rename to web/bringyour.com/res/images/pack-2.png diff --git a/bringyour.com/res/images/pack-2.webp b/web/bringyour.com/res/images/pack-2.webp similarity index 100% rename from bringyour.com/res/images/pack-2.webp rename to web/bringyour.com/res/images/pack-2.webp diff --git a/bringyour.com/res/images/pack.jpg b/web/bringyour.com/res/images/pack.jpg similarity index 100% rename from bringyour.com/res/images/pack.jpg rename to web/bringyour.com/res/images/pack.jpg diff --git a/bringyour.com/res/images/pack.png b/web/bringyour.com/res/images/pack.png similarity index 100% rename from bringyour.com/res/images/pack.png rename to web/bringyour.com/res/images/pack.png diff --git a/bringyour.com/res/images/provided-extended.svg b/web/bringyour.com/res/images/provided-extended.svg similarity index 100% rename from bringyour.com/res/images/provided-extended.svg rename to web/bringyour.com/res/images/provided-extended.svg diff --git a/bringyour.com/res/images/provided.svg b/web/bringyour.com/res/images/provided.svg similarity index 100% rename from bringyour.com/res/images/provided.svg rename to web/bringyour.com/res/images/provided.svg diff --git a/bringyour.com/res/images/reviews-g2.png b/web/bringyour.com/res/images/reviews-g2.png similarity index 100% rename from bringyour.com/res/images/reviews-g2.png rename to web/bringyour.com/res/images/reviews-g2.png diff --git a/bringyour.com/res/images/s-discord.png b/web/bringyour.com/res/images/s-discord.png similarity index 100% rename from bringyour.com/res/images/s-discord.png rename to web/bringyour.com/res/images/s-discord.png diff --git a/bringyour.com/res/images/s-github.png b/web/bringyour.com/res/images/s-github.png similarity index 100% rename from bringyour.com/res/images/s-github.png rename to web/bringyour.com/res/images/s-github.png diff --git a/bringyour.com/res/images/s-linkedin.png b/web/bringyour.com/res/images/s-linkedin.png similarity index 100% rename from bringyour.com/res/images/s-linkedin.png rename to web/bringyour.com/res/images/s-linkedin.png diff --git a/bringyour.com/res/images/s-twitter.png b/web/bringyour.com/res/images/s-twitter.png similarity index 100% rename from bringyour.com/res/images/s-twitter.png rename to web/bringyour.com/res/images/s-twitter.png diff --git a/bringyour.com/res/images/s-youtube.png b/web/bringyour.com/res/images/s-youtube.png similarity index 100% rename from bringyour.com/res/images/s-youtube.png rename to web/bringyour.com/res/images/s-youtube.png diff --git a/bringyour.com/res/images/s2-discord.svg b/web/bringyour.com/res/images/s2-discord.svg similarity index 100% rename from bringyour.com/res/images/s2-discord.svg rename to web/bringyour.com/res/images/s2-discord.svg diff --git a/bringyour.com/res/images/s2-github.svg b/web/bringyour.com/res/images/s2-github.svg similarity index 100% rename from bringyour.com/res/images/s2-github.svg rename to web/bringyour.com/res/images/s2-github.svg diff --git a/bringyour.com/res/images/s2-linkedin.svg b/web/bringyour.com/res/images/s2-linkedin.svg similarity index 100% rename from bringyour.com/res/images/s2-linkedin.svg rename to web/bringyour.com/res/images/s2-linkedin.svg diff --git a/bringyour.com/res/images/s2-reddit.svg b/web/bringyour.com/res/images/s2-reddit.svg similarity index 100% rename from bringyour.com/res/images/s2-reddit.svg rename to web/bringyour.com/res/images/s2-reddit.svg diff --git a/bringyour.com/res/images/s2-youtube.svg b/web/bringyour.com/res/images/s2-youtube.svg similarity index 100% rename from bringyour.com/res/images/s2-youtube.svg rename to web/bringyour.com/res/images/s2-youtube.svg diff --git a/bringyour.com/res/images/share-private-2-alpha.png b/web/bringyour.com/res/images/share-private-2-alpha.png similarity index 100% rename from bringyour.com/res/images/share-private-2-alpha.png rename to web/bringyour.com/res/images/share-private-2-alpha.png diff --git a/bringyour.com/res/images/share-private-2-alpha.webp b/web/bringyour.com/res/images/share-private-2-alpha.webp similarity index 100% rename from bringyour.com/res/images/share-private-2-alpha.webp rename to web/bringyour.com/res/images/share-private-2-alpha.webp diff --git a/bringyour.com/res/images/share-private-2.png b/web/bringyour.com/res/images/share-private-2.png similarity index 100% rename from bringyour.com/res/images/share-private-2.png rename to web/bringyour.com/res/images/share-private-2.png diff --git a/bringyour.com/res/images/share-private-2.webp b/web/bringyour.com/res/images/share-private-2.webp similarity index 100% rename from bringyour.com/res/images/share-private-2.webp rename to web/bringyour.com/res/images/share-private-2.webp diff --git a/bringyour.com/res/images/share-private.jpg b/web/bringyour.com/res/images/share-private.jpg similarity index 100% rename from bringyour.com/res/images/share-private.jpg rename to web/bringyour.com/res/images/share-private.jpg diff --git a/bringyour.com/res/images/share-private.png b/web/bringyour.com/res/images/share-private.png similarity index 100% rename from bringyour.com/res/images/share-private.png rename to web/bringyour.com/res/images/share-private.png diff --git a/bringyour.com/res/images/share-public-2-alpha.png b/web/bringyour.com/res/images/share-public-2-alpha.png similarity index 100% rename from bringyour.com/res/images/share-public-2-alpha.png rename to web/bringyour.com/res/images/share-public-2-alpha.png diff --git a/bringyour.com/res/images/share-public-2-alpha.webp b/web/bringyour.com/res/images/share-public-2-alpha.webp similarity index 100% rename from bringyour.com/res/images/share-public-2-alpha.webp rename to web/bringyour.com/res/images/share-public-2-alpha.webp diff --git a/bringyour.com/res/images/share-public-2.png b/web/bringyour.com/res/images/share-public-2.png similarity index 100% rename from bringyour.com/res/images/share-public-2.png rename to web/bringyour.com/res/images/share-public-2.png diff --git a/bringyour.com/res/images/share-public-2.webp b/web/bringyour.com/res/images/share-public-2.webp similarity index 100% rename from bringyour.com/res/images/share-public-2.webp rename to web/bringyour.com/res/images/share-public-2.webp diff --git a/bringyour.com/res/images/share-public.jpg b/web/bringyour.com/res/images/share-public.jpg similarity index 100% rename from bringyour.com/res/images/share-public.jpg rename to web/bringyour.com/res/images/share-public.jpg diff --git a/bringyour.com/res/images/share-public.png b/web/bringyour.com/res/images/share-public.png similarity index 100% rename from bringyour.com/res/images/share-public.png rename to web/bringyour.com/res/images/share-public.png diff --git a/bringyour.com/res/images/signup-redeem.svg b/web/bringyour.com/res/images/signup-redeem.svg similarity index 100% rename from bringyour.com/res/images/signup-redeem.svg rename to web/bringyour.com/res/images/signup-redeem.svg diff --git a/bringyour.com/res/images/store-app-dark.png b/web/bringyour.com/res/images/store-app-dark.png similarity index 100% rename from bringyour.com/res/images/store-app-dark.png rename to web/bringyour.com/res/images/store-app-dark.png diff --git a/bringyour.com/res/images/store-app-dark.svg b/web/bringyour.com/res/images/store-app-dark.svg similarity index 100% rename from bringyour.com/res/images/store-app-dark.svg rename to web/bringyour.com/res/images/store-app-dark.svg diff --git a/bringyour.com/res/images/store-app.svg b/web/bringyour.com/res/images/store-app.svg similarity index 100% rename from bringyour.com/res/images/store-app.svg rename to web/bringyour.com/res/images/store-app.svg diff --git a/bringyour.com/res/images/store-ms.svg b/web/bringyour.com/res/images/store-ms.svg similarity index 100% rename from bringyour.com/res/images/store-ms.svg rename to web/bringyour.com/res/images/store-ms.svg diff --git a/bringyour.com/res/images/store-play.png b/web/bringyour.com/res/images/store-play.png similarity index 100% rename from bringyour.com/res/images/store-play.png rename to web/bringyour.com/res/images/store-play.png diff --git a/bringyour.com/res/images/superfast.svg b/web/bringyour.com/res/images/superfast.svg similarity index 100% rename from bringyour.com/res/images/superfast.svg rename to web/bringyour.com/res/images/superfast.svg diff --git a/bringyour.com/res/images/ur-sq.webp b/web/bringyour.com/res/images/ur-sq.webp similarity index 100% rename from bringyour.com/res/images/ur-sq.webp rename to web/bringyour.com/res/images/ur-sq.webp diff --git a/bringyour.com/res/images/ur.svg b/web/bringyour.com/res/images/ur.svg similarity index 100% rename from bringyour.com/res/images/ur.svg rename to web/bringyour.com/res/images/ur.svg diff --git a/bringyour.com/res/images/use-cases-2-alpha.png b/web/bringyour.com/res/images/use-cases-2-alpha.png similarity index 100% rename from bringyour.com/res/images/use-cases-2-alpha.png rename to web/bringyour.com/res/images/use-cases-2-alpha.png diff --git a/bringyour.com/res/images/use-cases-2-alpha.webp b/web/bringyour.com/res/images/use-cases-2-alpha.webp similarity index 100% rename from bringyour.com/res/images/use-cases-2-alpha.webp rename to web/bringyour.com/res/images/use-cases-2-alpha.webp diff --git a/bringyour.com/res/images/use-cases-2.png b/web/bringyour.com/res/images/use-cases-2.png similarity index 100% rename from bringyour.com/res/images/use-cases-2.png rename to web/bringyour.com/res/images/use-cases-2.png diff --git a/bringyour.com/res/images/use-cases-2.webp b/web/bringyour.com/res/images/use-cases-2.webp similarity index 100% rename from bringyour.com/res/images/use-cases-2.webp rename to web/bringyour.com/res/images/use-cases-2.webp diff --git a/bringyour.com/res/images/use-cases.jpg b/web/bringyour.com/res/images/use-cases.jpg similarity index 100% rename from bringyour.com/res/images/use-cases.jpg rename to web/bringyour.com/res/images/use-cases.jpg diff --git a/bringyour.com/res/images/use-cases.png b/web/bringyour.com/res/images/use-cases.png similarity index 100% rename from bringyour.com/res/images/use-cases.png rename to web/bringyour.com/res/images/use-cases.png diff --git a/bringyour.com/res/images/world-sq.png b/web/bringyour.com/res/images/world-sq.png similarity index 100% rename from bringyour.com/res/images/world-sq.png rename to web/bringyour.com/res/images/world-sq.png diff --git a/bringyour.com/res/images/world.png b/web/bringyour.com/res/images/world.png similarity index 100% rename from bringyour.com/res/images/world.png rename to web/bringyour.com/res/images/world.png diff --git a/bringyour.com/res/images/world2.png b/web/bringyour.com/res/images/world2.png similarity index 100% rename from bringyour.com/res/images/world2.png rename to web/bringyour.com/res/images/world2.png diff --git a/bringyour.com/res/images/world3.png b/web/bringyour.com/res/images/world3.png similarity index 100% rename from bringyour.com/res/images/world3.png rename to web/bringyour.com/res/images/world3.png diff --git a/bringyour.com/robots.txt b/web/bringyour.com/robots.txt similarity index 100% rename from bringyour.com/robots.txt rename to web/bringyour.com/robots.txt diff --git a/bringyour.com/sitemap.txt b/web/bringyour.com/sitemap.txt similarity index 100% rename from bringyour.com/sitemap.txt rename to web/bringyour.com/sitemap.txt diff --git a/bringyour.com/sketch_220813c.js b/web/bringyour.com/sketch_220813c.js similarity index 100% rename from bringyour.com/sketch_220813c.js rename to web/bringyour.com/sketch_220813c.js diff --git a/bringyour.com/sketch_220824a.js b/web/bringyour.com/sketch_220824a.js similarity index 100% rename from bringyour.com/sketch_220824a.js rename to web/bringyour.com/sketch_220824a.js diff --git a/bringyour.com/stats.js b/web/bringyour.com/stats.js similarity index 100% rename from bringyour.com/stats.js rename to web/bringyour.com/stats.js diff --git a/bringyour.com/stats_mock.js b/web/bringyour.com/stats_mock.js similarity index 100% rename from bringyour.com/stats_mock.js rename to web/bringyour.com/stats_mock.js diff --git a/bringyour.com/window.js b/web/bringyour.com/window.js similarity index 100% rename from bringyour.com/window.js rename to web/bringyour.com/window.js diff --git a/components/whereami/.gitignore b/web/components/whereami/.gitignore similarity index 100% rename from components/whereami/.gitignore rename to web/components/whereami/.gitignore diff --git a/components/whereami/index/.gitignore b/web/components/whereami/index/.gitignore similarity index 100% rename from components/whereami/index/.gitignore rename to web/components/whereami/index/.gitignore diff --git a/components/whereami/index/index.templ b/web/components/whereami/index/index.templ similarity index 100% rename from components/whereami/index/index.templ rename to web/components/whereami/index/index.templ diff --git a/components/whereami/index/index_templ.go b/web/components/whereami/index/index_templ.go similarity index 100% rename from components/whereami/index/index_templ.go rename to web/components/whereami/index/index_templ.go diff --git a/components/whereami/index/transform.go b/web/components/whereami/index/transform.go similarity index 100% rename from components/whereami/index/transform.go rename to web/components/whereami/index/transform.go diff --git a/components/whereami/my-ip-info/.gitignore b/web/components/whereami/my-ip-info/.gitignore similarity index 100% rename from components/whereami/my-ip-info/.gitignore rename to web/components/whereami/my-ip-info/.gitignore diff --git a/components/whereami/my-ip-info/README.md b/web/components/whereami/my-ip-info/README.md similarity index 100% rename from components/whereami/my-ip-info/README.md rename to web/components/whereami/my-ip-info/README.md diff --git a/components/whereami/my-ip-info/generate.go b/web/components/whereami/my-ip-info/generate.go similarity index 100% rename from components/whereami/my-ip-info/generate.go rename to web/components/whereami/my-ip-info/generate.go diff --git a/components/whereami/my-ip-info/package-lock.json b/web/components/whereami/my-ip-info/package-lock.json similarity index 100% rename from components/whereami/my-ip-info/package-lock.json rename to web/components/whereami/my-ip-info/package-lock.json diff --git a/components/whereami/my-ip-info/package.json b/web/components/whereami/my-ip-info/package.json similarity index 100% rename from components/whereami/my-ip-info/package.json rename to web/components/whereami/my-ip-info/package.json diff --git a/components/whereami/my-ip-info/postcss.config.js b/web/components/whereami/my-ip-info/postcss.config.js similarity index 100% rename from components/whereami/my-ip-info/postcss.config.js rename to web/components/whereami/my-ip-info/postcss.config.js diff --git a/components/whereami/my-ip-info/src/App.css b/web/components/whereami/my-ip-info/src/App.css similarity index 100% rename from components/whereami/my-ip-info/src/App.css rename to web/components/whereami/my-ip-info/src/App.css diff --git a/components/whereami/my-ip-info/src/App.jsx b/web/components/whereami/my-ip-info/src/App.jsx similarity index 100% rename from components/whereami/my-ip-info/src/App.jsx rename to web/components/whereami/my-ip-info/src/App.jsx diff --git a/components/whereami/my-ip-info/src/GridComparison.jsx b/web/components/whereami/my-ip-info/src/GridComparison.jsx similarity index 100% rename from components/whereami/my-ip-info/src/GridComparison.jsx rename to web/components/whereami/my-ip-info/src/GridComparison.jsx diff --git a/components/whereami/my-ip-info/src/SingleVersion.jsx b/web/components/whereami/my-ip-info/src/SingleVersion.jsx similarity index 100% rename from components/whereami/my-ip-info/src/SingleVersion.jsx rename to web/components/whereami/my-ip-info/src/SingleVersion.jsx diff --git a/components/whereami/my-ip-info/src/assets/crossed-cloud.svg b/web/components/whereami/my-ip-info/src/assets/crossed-cloud.svg similarity index 100% rename from components/whereami/my-ip-info/src/assets/crossed-cloud.svg rename to web/components/whereami/my-ip-info/src/assets/crossed-cloud.svg diff --git a/components/whereami/my-ip-info/src/assets/solid.svg b/web/components/whereami/my-ip-info/src/assets/solid.svg similarity index 100% rename from components/whereami/my-ip-info/src/assets/solid.svg rename to web/components/whereami/my-ip-info/src/assets/solid.svg diff --git a/components/whereami/my-ip-info/src/assets/thumbsup.svg b/web/components/whereami/my-ip-info/src/assets/thumbsup.svg similarity index 100% rename from components/whereami/my-ip-info/src/assets/thumbsup.svg rename to web/components/whereami/my-ip-info/src/assets/thumbsup.svg diff --git a/components/whereami/my-ip-info/src/assets/warning.svg b/web/components/whereami/my-ip-info/src/assets/warning.svg similarity index 100% rename from components/whereami/my-ip-info/src/assets/warning.svg rename to web/components/whereami/my-ip-info/src/assets/warning.svg diff --git a/components/whereami/my-ip-info/src/components/NotSupported.jsx b/web/components/whereami/my-ip-info/src/components/NotSupported.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/NotSupported.jsx rename to web/components/whereami/my-ip-info/src/components/NotSupported.jsx diff --git a/components/whereami/my-ip-info/src/components/Privacy.jsx b/web/components/whereami/my-ip-info/src/components/Privacy.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/Privacy.jsx rename to web/components/whereami/my-ip-info/src/components/Privacy.jsx diff --git a/components/whereami/my-ip-info/src/components/PrivacySingle.jsx b/web/components/whereami/my-ip-info/src/components/PrivacySingle.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/PrivacySingle.jsx rename to web/components/whereami/my-ip-info/src/components/PrivacySingle.jsx diff --git a/components/whereami/my-ip-info/src/components/landmarks-single/index.jsx b/web/components/whereami/my-ip-info/src/components/landmarks-single/index.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/landmarks-single/index.jsx rename to web/components/whereami/my-ip-info/src/components/landmarks-single/index.jsx diff --git a/components/whereami/my-ip-info/src/components/landmarks-single/measure-rtts.js b/web/components/whereami/my-ip-info/src/components/landmarks-single/measure-rtts.js similarity index 100% rename from components/whereami/my-ip-info/src/components/landmarks-single/measure-rtts.js rename to web/components/whereami/my-ip-info/src/components/landmarks-single/measure-rtts.js diff --git a/components/whereami/my-ip-info/src/components/landmarks/index.jsx b/web/components/whereami/my-ip-info/src/components/landmarks/index.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/landmarks/index.jsx rename to web/components/whereami/my-ip-info/src/components/landmarks/index.jsx diff --git a/components/whereami/my-ip-info/src/components/landmarks/measure-rtts.js b/web/components/whereami/my-ip-info/src/components/landmarks/measure-rtts.js similarity index 100% rename from components/whereami/my-ip-info/src/components/landmarks/measure-rtts.js rename to web/components/whereami/my-ip-info/src/components/landmarks/measure-rtts.js diff --git a/components/whereami/my-ip-info/src/components/spinner/index.jsx b/web/components/whereami/my-ip-info/src/components/spinner/index.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/spinner/index.jsx rename to web/components/whereami/my-ip-info/src/components/spinner/index.jsx diff --git a/components/whereami/my-ip-info/src/globe/GlobeComponent.jsx b/web/components/whereami/my-ip-info/src/globe/GlobeComponent.jsx similarity index 100% rename from components/whereami/my-ip-info/src/globe/GlobeComponent.jsx rename to web/components/whereami/my-ip-info/src/globe/GlobeComponent.jsx diff --git a/components/whereami/my-ip-info/src/globe/data/world-110m.v1.json b/web/components/whereami/my-ip-info/src/globe/data/world-110m.v1.json similarity index 100% rename from components/whereami/my-ip-info/src/globe/data/world-110m.v1.json rename to web/components/whereami/my-ip-info/src/globe/data/world-110m.v1.json diff --git a/components/whereami/my-ip-info/src/index.css b/web/components/whereami/my-ip-info/src/index.css similarity index 100% rename from components/whereami/my-ip-info/src/index.css rename to web/components/whereami/my-ip-info/src/index.css diff --git a/components/whereami/my-ip-info/tailwind.config.js b/web/components/whereami/my-ip-info/tailwind.config.js similarity index 100% rename from components/whereami/my-ip-info/tailwind.config.js rename to web/components/whereami/my-ip-info/tailwind.config.js diff --git a/components/whereami/my-ip-info/vite.config.js b/web/components/whereami/my-ip-info/vite.config.js similarity index 100% rename from components/whereami/my-ip-info/vite.config.js rename to web/components/whereami/my-ip-info/vite.config.js diff --git a/components/whereami/my-ip-widget/.gitignore b/web/components/whereami/my-ip-widget/.gitignore similarity index 100% rename from components/whereami/my-ip-widget/.gitignore rename to web/components/whereami/my-ip-widget/.gitignore diff --git a/components/whereami/my-ip-widget/README.md b/web/components/whereami/my-ip-widget/README.md similarity index 100% rename from components/whereami/my-ip-widget/README.md rename to web/components/whereami/my-ip-widget/README.md diff --git a/components/whereami/my-ip-widget/generate.go b/web/components/whereami/my-ip-widget/generate.go similarity index 100% rename from components/whereami/my-ip-widget/generate.go rename to web/components/whereami/my-ip-widget/generate.go diff --git a/components/whereami/my-ip-widget/package-lock.json b/web/components/whereami/my-ip-widget/package-lock.json similarity index 100% rename from components/whereami/my-ip-widget/package-lock.json rename to web/components/whereami/my-ip-widget/package-lock.json diff --git a/components/whereami/my-ip-widget/package.json b/web/components/whereami/my-ip-widget/package.json similarity index 100% rename from components/whereami/my-ip-widget/package.json rename to web/components/whereami/my-ip-widget/package.json diff --git a/components/whereami/my-ip-widget/postcss.config.js b/web/components/whereami/my-ip-widget/postcss.config.js similarity index 100% rename from components/whereami/my-ip-widget/postcss.config.js rename to web/components/whereami/my-ip-widget/postcss.config.js diff --git a/components/whereami/my-ip-widget/src/Widget.css b/web/components/whereami/my-ip-widget/src/Widget.css similarity index 100% rename from components/whereami/my-ip-widget/src/Widget.css rename to web/components/whereami/my-ip-widget/src/Widget.css diff --git a/components/whereami/my-ip-widget/src/Widget.jsx b/web/components/whereami/my-ip-widget/src/Widget.jsx similarity index 100% rename from components/whereami/my-ip-widget/src/Widget.jsx rename to web/components/whereami/my-ip-widget/src/Widget.jsx diff --git a/components/whereami/my-ip-widget/src/components/dot/index.jsx b/web/components/whereami/my-ip-widget/src/components/dot/index.jsx similarity index 100% rename from components/whereami/my-ip-widget/src/components/dot/index.jsx rename to web/components/whereami/my-ip-widget/src/components/dot/index.jsx diff --git a/components/whereami/my-ip-widget/src/components/spinner/index.jsx b/web/components/whereami/my-ip-widget/src/components/spinner/index.jsx similarity index 100% rename from components/whereami/my-ip-widget/src/components/spinner/index.jsx rename to web/components/whereami/my-ip-widget/src/components/spinner/index.jsx diff --git a/components/whereami/my-ip-widget/src/index.css b/web/components/whereami/my-ip-widget/src/index.css similarity index 100% rename from components/whereami/my-ip-widget/src/index.css rename to web/components/whereami/my-ip-widget/src/index.css diff --git a/components/whereami/my-ip-widget/tailwind.config.js b/web/components/whereami/my-ip-widget/tailwind.config.js similarity index 100% rename from components/whereami/my-ip-widget/tailwind.config.js rename to web/components/whereami/my-ip-widget/tailwind.config.js diff --git a/components/whereami/my-ip-widget/vite.config.js b/web/components/whereami/my-ip-widget/vite.config.js similarity index 100% rename from components/whereami/my-ip-widget/vite.config.js rename to web/components/whereami/my-ip-widget/vite.config.js diff --git a/components/whereami/static/connect-bundle-2.js b/web/components/whereami/static/connect-bundle-2.js similarity index 100% rename from components/whereami/static/connect-bundle-2.js rename to web/components/whereami/static/connect-bundle-2.js diff --git a/web/go.mod b/web/go.mod new file mode 100644 index 0000000..ac5d855 --- /dev/null +++ b/web/go.mod @@ -0,0 +1,7 @@ +module github.com/urnetwork/web/web + +go 1.24.0 + +require github.com/urnetwork/warp v0.0.0 + +replace github.com/urnetwork/warp => ../../warp diff --git a/web/main.go b/web/main.go new file mode 100644 index 0000000..9e24bed --- /dev/null +++ b/web/main.go @@ -0,0 +1,22 @@ +package main + +import ( + "os" + + "github.com/urnetwork/warp" +) + +// this value is set via the linker, e.g. +// -ldflags "-X main.Version=$WARP_VERSION-$WARP_VERSION_CODE" +var Version string + +func main() { + configPath := "/etc/nginx/nginx.conf" + convertedConfigPath := "/etc/nginx/nginx_host.conf" + + err, exitCode := warp.Nginx(configPath, convertedConfigPath) + if err != nil { + panic(err) + } + os.Exit(exitCode) +} diff --git a/nginx-local/gen.py b/web/nginx-local/gen.py similarity index 100% rename from nginx-local/gen.py rename to web/nginx-local/gen.py diff --git a/app.old/nginx/mime.types b/web/nginx-local/mime.types similarity index 100% rename from app.old/nginx/mime.types rename to web/nginx-local/mime.types diff --git a/nginx-local/nginx.conf.j2 b/web/nginx-local/nginx.conf.j2 similarity index 100% rename from nginx-local/nginx.conf.j2 rename to web/nginx-local/nginx.conf.j2 diff --git a/app.old/nginx/gen.py b/web/nginx/gen.py similarity index 100% rename from app.old/nginx/gen.py rename to web/nginx/gen.py diff --git a/nginx-local/mime.types b/web/nginx/mime.types similarity index 100% rename from nginx-local/mime.types rename to web/nginx/mime.types diff --git a/nginx/nginx.conf.j2 b/web/nginx/nginx.conf.j2 similarity index 100% rename from nginx/nginx.conf.j2 rename to web/nginx/nginx.conf.j2 diff --git a/ur.io/.well-known/assetlinks.json b/web/ur.io/.well-known/assetlinks.json similarity index 100% rename from ur.io/.well-known/assetlinks.json rename to web/ur.io/.well-known/assetlinks.json diff --git a/ur.io/.well-known/manifest.json b/web/ur.io/.well-known/manifest.json similarity index 100% rename from ur.io/.well-known/manifest.json rename to web/ur.io/.well-known/manifest.json diff --git a/ur.io/.well-known/pgp-key.txt b/web/ur.io/.well-known/pgp-key.txt similarity index 100% rename from ur.io/.well-known/pgp-key.txt rename to web/ur.io/.well-known/pgp-key.txt diff --git a/ur.io/.well-known/privacy.txt b/web/ur.io/.well-known/privacy.txt similarity index 100% rename from ur.io/.well-known/privacy.txt rename to web/ur.io/.well-known/privacy.txt diff --git a/ur.io/.well-known/security.txt b/web/ur.io/.well-known/security.txt similarity index 100% rename from ur.io/.well-known/security.txt rename to web/ur.io/.well-known/security.txt