diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..2ab6fb17fe17e7257598fc25a0bc02463cb40215 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +node_modules +dist +dist-ssr +server/uploads +*.log +.env +.DS_Store +mandi.db +server/mandi.db +.gitignore +README.md +scripts/ +out.txt diff --git a/.env.example b/.env.example new file mode 100644 index 0000000000000000000000000000000000000000..07de638d6f3e9da2e3f5b75532ad5ca3e1ba5726 --- /dev/null +++ b/.env.example @@ -0,0 +1,13 @@ +# Copy this file to .env for local development. +# On Hugging Face Spaces, set these in: +# Settings → Variables and secrets + +# Required: Neon PostgreSQL connection string +DATABASE_URL="postgresql://USER:PASSWORD@HOST/DBNAME?sslmode=require&channel_binding=require" + +# Optional: Custom admin password (SHA-256 hash will be computed from this) +# If not set, a default hash is used (change it in production!) +ADMIN_SECRET="YourSecureAdminPasswordHere" + +# Optional: Override the server port (HF Spaces requires 7860, which is the default) +# PORT=7860 diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..bd5e5ee982cf3e5534f1a003f3bdd79e26c36405 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +server/models/group1-shard1of1 filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..158867f54526b9bff446d3b292fcd64e5e79e565 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Environment secrets — never commit these +.env +.env.* +!.env.example diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..5ef1beb50b3b1559178bfa058121406bb7ec9018 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,53 @@ +# ── Build Stage ───────────────────────────────────────────────────────────── +FROM node:20-slim AS builder + +WORKDIR /app + +# Install build tools for native modules (sharp, tfjs-node) +RUN apt-get update && apt-get install -y --no-install-recommends \ + python3 \ + make \ + g++ \ + && rm -rf /var/lib/apt/lists/* + +# Install all dependencies (including optional tfjs-node) +COPY package*.json ./ +RUN npm ci + +# Copy source and build static frontend +COPY . . +RUN npm run build + +# Prune devDeps (keeps production node_modules and native binaries) +RUN npm prune --omit=dev + +# ── Runtime Stage ─────────────────────────────────────────────────────────── +FROM node:20-slim + +WORKDIR /app + +# Runtime dependencies for sharp/tensorflow +RUN apt-get update && apt-get install -y --no-install-recommends \ + libvips-dev \ + && rm -rf /var/lib/apt/lists/* + +# Copy only what's needed from builder +COPY --from=builder /app/dist ./dist +COPY --from=builder /app/package*.json ./ +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/server ./server + +# Ensure upload directory remains writable +RUN mkdir -p server/uploads && chmod 777 server/uploads + +# Env configuration for Hugging Face Spaces +ENV NODE_ENV=production +ENV PORT=7860 +EXPOSE 7860 + +# Non-root security +RUN groupadd -r appgroup && useradd -r -g appgroup appuser +RUN chown -R appuser:appgroup /app +USER appuser + +CMD ["node", "server/index.js"] diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000000000000000000000000000000000000..c90c6be964c4a20c2b94ae80c3679a6266c5f3a5 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,30 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: { ...globals.browser, ...globals.node }, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + rules: { + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]|motion', caughtErrors: 'none' }], + 'no-empty': ['error', { allowEmptyCatch: true }], + }, + }, +]) diff --git a/index.html b/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b31dd1078db9d2a9606755e04422d3ab9483e205 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Meri Mandi + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..e1ed5beaa466226a3e105f750512c508fbc1db5f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6270 @@ +{ + "name": "mandi", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mandi", + "version": "0.0.0", + "dependencies": { + "@tensorflow/tfjs": "^4.22.0", + "buffer": "^6.0.3", + "concurrently": "^9.2.1", + "cors": "^2.8.6", + "dotenv": "^17.3.1", + "events": "^3.3.0", + "express": "^5.2.1", + "framer-motion": "^12.38.0", + "lucide-react": "^1.7.0", + "morgan": "^1.10.1", + "multer": "^2.1.1", + "nsfwjs": "^4.3.0", + "pg": "^8.20.0", + "process": "^0.11.10", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router-dom": "^7.13.2", + "sharp": "^0.34.5", + "simple-peer": "^9.11.1", + "socket.io": "^4.8.3", + "socket.io-client": "^4.8.3", + "util": "^0.12.5", + "uuid": "^13.0.0", + "zustand": "^5.0.12" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "vite": "^8.0.1" + }, + "optionalDependencies": { + "@tensorflow/tfjs-node": "^4.22.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@tensorflow/tfjs": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-4.22.0.tgz", + "integrity": "sha512-0TrIrXs6/b7FLhLVNmfh8Sah6JgjBPH4mZ8JGb7NU6WW+cx00qK5BcAZxw7NCzxj6N8MRAIfHq+oNbPUNG5VAg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@tensorflow/tfjs-backend-cpu": "4.22.0", + "@tensorflow/tfjs-backend-webgl": "4.22.0", + "@tensorflow/tfjs-converter": "4.22.0", + "@tensorflow/tfjs-core": "4.22.0", + "@tensorflow/tfjs-data": "4.22.0", + "@tensorflow/tfjs-layers": "4.22.0", + "argparse": "^1.0.10", + "chalk": "^4.1.0", + "core-js": "3.29.1", + "regenerator-runtime": "^0.13.5", + "yargs": "^16.0.3" + }, + "bin": { + "tfjs-custom-module": "dist/tools/custom_module/cli.js" + } + }, + "node_modules/@tensorflow/tfjs-backend-cpu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.22.0.tgz", + "integrity": "sha512-1u0FmuLGuRAi8D2c3cocHTASGXOmHc/4OvoVDENJayjYkS119fcTcQf4iHrtLthWyDIPy3JiPhRrZQC9EwnhLw==", + "license": "Apache-2.0", + "dependencies": { + "@types/seedrandom": "^2.4.28", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs-backend-webgl": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.22.0.tgz", + "integrity": "sha512-H535XtZWnWgNwSzv538czjVlbJebDl5QTMOth4RXr2p/kJ1qSIXE0vZvEtO+5EC9b00SvhplECny2yDewQb/Yg==", + "license": "Apache-2.0", + "dependencies": { + "@tensorflow/tfjs-backend-cpu": "4.22.0", + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "^2.4.28", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs-converter": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.22.0.tgz", + "integrity": "sha512-PT43MGlnzIo+YfbsjM79Lxk9lOq6uUwZuCc8rrp0hfpLjF6Jv8jS84u2jFb+WpUeuF4K33ZDNx8CjiYrGQ2trQ==", + "license": "Apache-2.0", + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs-core": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.22.0.tgz", + "integrity": "sha512-LEkOyzbknKFoWUwfkr59vSB68DMJ4cjwwHgicXN0DUi3a0Vh1Er3JQqCI1Hl86GGZQvY8ezVrtDIvqR1ZFW55A==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/long": "^4.0.1", + "@types/offscreencanvas": "~2019.7.0", + "@types/seedrandom": "^2.4.28", + "@webgpu/types": "0.1.38", + "long": "4.0.0", + "node-fetch": "~2.6.1", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + } + }, + "node_modules/@tensorflow/tfjs-core/node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, + "node_modules/@tensorflow/tfjs-data": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-4.22.0.tgz", + "integrity": "sha512-dYmF3LihQIGvtgJrt382hSRH4S0QuAp2w1hXJI2+kOaEqo5HnUPG0k5KA6va+S1yUhx7UBToUKCBHeLHFQRV4w==", + "license": "Apache-2.0", + "dependencies": { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.6.1", + "string_decoder": "^1.3.0" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0", + "seedrandom": "^3.0.5" + } + }, + "node_modules/@tensorflow/tfjs-layers": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-4.22.0.tgz", + "integrity": "sha512-lybPj4ZNj9iIAPUj7a8ZW1hg8KQGfqWLlCZDi9eM/oNKCCAgchiyzx8OrYoWmRrB+AM6VNEeIT+2gZKg5ReihA==", + "license": "Apache-2.0 AND MIT", + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs-node": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-node/-/tfjs-node-4.22.0.tgz", + "integrity": "sha512-uHrXeUlfgkMxTZqHkESSV7zSdKdV0LlsBeblqkuKU9nnfxB1pC6DtoyYVaLxznzZy7WQSegjcohxxCjAf6Dc7w==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "1.0.9", + "@tensorflow/tfjs": "4.22.0", + "adm-zip": "^0.5.2", + "google-protobuf": "^3.9.2", + "https-proxy-agent": "^2.2.1", + "progress": "^2.0.0", + "rimraf": "^2.6.2", + "tar": "^6.2.1" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@tensorflow/tfjs/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@tensorflow/tfjs/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/@tensorflow/tfjs/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tensorflow/tfjs/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.4" + } + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.3.0", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz", + "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/seedrandom": { + "version": "2.4.34", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.34.tgz", + "integrity": "sha512-ytDiArvrn/3Xk6/vtylys5tlY6eo7Ane0hvcx++TKo6RxQXuVfW0AF/oeWqAj9dN29SyhtawuXstgmPlwNcv/A==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/@webgpu/types": { + "version": "0.1.38", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.38.tgz", + "integrity": "sha512-7LrhVKz2PRh+DD7+S+PVaFd5HxaWQvoMqBbsV9fNJO1pjUs1P8bM2vQVNfk+3URTqbuTI7gkXi0rfsN0IadoBA==", + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC", + "optional": true + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "peer": 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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "license": "MIT", + "optional": true, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" + }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.11.tgz", + "integrity": "sha512-DAKrHphkJyiGuau/cFieRYhcTFeK/lBuD++C7cZ6KZHbMhBrisoi+EvhQ5RZrIfV5qwsW8kgQ07JIC+MDJRAhg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "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/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001781", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz", + "integrity": "sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==", + "dev": true, + "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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC", + "optional": true + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/core-js": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", + "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT", + "optional": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.325", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.325.tgz", + "integrity": "sha512-PwfIw7WQSt3xX7yOf5OE/unLzsK9CaN2f/FvV3WjPR1Knoc1T9vePRVV4W1EM301JzzysK51K7FNKcusCr0zYA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.6.tgz", + "integrity": "sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "@types/ws": "^8.5.12", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.4.tgz", + "integrity": "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT", + "optional": true + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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, + "license": "MIT", + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/framer-motion": { + "version": "12.38.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz", + "integrity": "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.38.0", + "motion-utils": "^12.36.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "optional": true + }, + "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==", + "license": "ISC", + "optional": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-browser-rtc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz", + "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==", + "license": "MIT" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", + "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==", + "license": "(BSD-3-Clause AND Apache-2.0)", + "optional": true + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC", + "optional": true + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "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==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "optional": true, + "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==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "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==", + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.7.0.tgz", + "integrity": "sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "optional": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "optional": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "optional": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/morgan": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", + "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", + "license": "MIT", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.1.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/motion-dom": { + "version": "12.38.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz", + "integrity": "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.36.0" + } + }, + "node_modules/motion-utils": { + "version": "12.36.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz", + "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz", + "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "type-is": "^1.6.18" + }, + "engines": { + "node": ">= 10.16.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/multer/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nsfwjs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/nsfwjs/-/nsfwjs-4.3.0.tgz", + "integrity": "sha512-WTKDte0vp1X97N1h34P79G/hG+sVT3+TnDz9di1WseIJR93v11E4viNX7Vg9WsO6HYoR772Nzq2iM8jo3XBZ+g==", + "license": "MIT", + "peerDependencies": { + "@tensorflow/tfjs": "^4.0.0", + "buffer": "^6.0.3" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "optional": true, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.0.tgz", + "integrity": "sha512-PuseHIvAnz3bjrM2rGJtSgo1zjgxapTLZ7x2pjhzWwlp4SJQgK3f3iZIQwkpEnBaKz6seKBADpM4B4ySkuYypg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pg": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", + "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", + "license": "MIT", + "peer": true, + "dependencies": { + "pg-connection-string": "^2.12.0", + "pg-pool": "^3.13.0", + "pg-protocol": "^1.13.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.3.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", + "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.12.0.tgz", + "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.13.0.tgz", + "integrity": "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", + "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-router": { + "version": "7.13.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.2.tgz", + "integrity": "sha512-tX1Aee+ArlKQP+NIUd7SE6Li+CiGKwQtbS+FfRxPX6Pe4vHOo6nr9d++u5cwg+Z8K/x8tP+7qLmujDtfrAoUJA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.13.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.2.tgz", + "integrity": "sha512-aR7SUORwTqAW0JDeiWF07e9SBE9qGpByR9I8kJT5h/FrBKxPMS6TiC7rmVO+gC0q52Bx7JnjWe8Z1sR9faN4YA==", + "license": "MIT", + "dependencies": { + "react-router": "7.13.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.12" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC", + "optional": true + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC", + "optional": true + }, + "node_modules/simple-peer": { + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz", + "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "debug": "^4.3.2", + "err-code": "^3.0.1", + "get-browser-rtc": "^1.1.0", + "queue-microtask": "^1.2.3", + "randombytes": "^2.1.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/socket.io": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", + "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", + "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", + "license": "MIT", + "dependencies": { + "debug": "~4.4.1", + "ws": "~8.18.3" + } + }, + "node_modules/socket.io-client": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", + "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", + "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "optional": true + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.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, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zustand": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz", + "integrity": "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..cb262e60ed2a761838af20eddb37d176030ab520 --- /dev/null +++ b/package.json @@ -0,0 +1,54 @@ +{ + "name": "mandi", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "concurrently \"npm run dev:server\" \"npm run dev:client\"", + "dev:server": "node --watch server/index.js", + "dev:client": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@tensorflow/tfjs": "^4.22.0", + "buffer": "^6.0.3", + "concurrently": "^9.2.1", + "cors": "^2.8.6", + "dotenv": "^17.3.1", + "events": "^3.3.0", + "express": "^5.2.1", + "framer-motion": "^12.38.0", + "lucide-react": "^1.7.0", + "morgan": "^1.10.1", + "multer": "^2.1.1", + "nsfwjs": "^4.3.0", + "pg": "^8.20.0", + "process": "^0.11.10", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router-dom": "^7.13.2", + "sharp": "^0.34.5", + "simple-peer": "^9.11.1", + "socket.io": "^4.8.3", + "socket.io-client": "^4.8.3", + "util": "^0.12.5", + "uuid": "^13.0.0", + "zustand": "^5.0.12" + }, + "optionalDependencies": { + "@tensorflow/tfjs-node": "^4.22.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "vite": "^8.0.1" + } +} diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000000000000000000000000000000000000..6893eb13237060adc0c968a690149a49faa2d7d3 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons.svg b/public/icons.svg new file mode 100644 index 0000000000000000000000000000000000000000..e9522193d9f796a9748e9ad8c952a5df73c87db9 --- /dev/null +++ b/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/upiqr.jpeg b/public/upiqr.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..8de3bba0e411c6cfd6b9d9b9b0de440f6f01f339 Binary files /dev/null and b/public/upiqr.jpeg differ diff --git a/scripts/migrate.js b/scripts/migrate.js new file mode 100644 index 0000000000000000000000000000000000000000..b13cc988b2dc27d1139847671b58b5bb3c911c41 --- /dev/null +++ b/scripts/migrate.js @@ -0,0 +1,23 @@ +import 'dotenv/config'; +import pg from 'pg'; +const { Pool } = pg; + +const db = new Pool({ + connectionString: process.env.DATABASE_URL, + ssl: { rejectUnauthorized: false } +}); + +async function migrate() { + try { + console.log("Applying migrations..."); + await db.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS "deviceId" TEXT;`); + await db.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS "deviceToken" TEXT;`); + console.log("✓ Database Migration Successful"); + } catch (err) { + console.error("Migration failed:", err); + } finally { + await db.end(); + } +} + +migrate(); diff --git a/server/db.js b/server/db.js new file mode 100644 index 0000000000000000000000000000000000000000..97ac02a091252caaa0a58fd2c8c1fb3fa3b8c3ae --- /dev/null +++ b/server/db.js @@ -0,0 +1,95 @@ +import 'dotenv/config'; +import pg from 'pg'; +// Postgres by default returns bigint (int8, type 20) as a string. Map it securely to Number for timestamps +pg.types.setTypeParser(20, parseInt); +const { Pool } = pg; + +// Neon/PostgreSQL requires a connection string +const connectionString = process.env.DATABASE_URL; + +if (!connectionString) { + console.warn("⚠️ WARNING: DATABASE_URL environment variable is missing."); + console.warn("Make sure to provide your Neon connection string."); +} + +const db = new Pool({ + connectionString, + ssl: connectionString && connectionString.includes('localhost') ? false : { rejectUnauthorized: false } +}); + +export const initDB = async () => { + if (!connectionString) return; + console.log("Initializing PostgreSQL Tables..."); + const client = await db.connect(); + try { + await client.query(` + CREATE TABLE IF NOT EXISTS users ( + "id" TEXT PRIMARY KEY, + "name" TEXT NOT NULL, + "role" TEXT NOT NULL, + "selfiePath" TEXT NOT NULL, + "district" TEXT DEFAULT '', + "state" TEXT DEFAULT '', + "pincode" TEXT DEFAULT '', + "contact" TEXT DEFAULT '', + "location" TEXT DEFAULT '', + "nearestCity" TEXT DEFAULT '', + "deviceId" TEXT, + "deviceToken" TEXT, + "isBlocked" INTEGER DEFAULT 0 + ); + + CREATE TABLE IF NOT EXISTS listings ( + "id" TEXT PRIMARY KEY, + "sellerId" TEXT NOT NULL, + "sellerName" TEXT NOT NULL, + "cropName" TEXT DEFAULT '', + "quantity" TEXT DEFAULT '', + "price" TEXT DEFAULT '', + "location" TEXT NOT NULL, + "nearestCity" TEXT DEFAULT '', + "district" TEXT DEFAULT '', + "state" TEXT DEFAULT '', + "pincode" TEXT DEFAULT '', + "timestamp" BIGINT NOT NULL, + "status" TEXT DEFAULT 'active', + FOREIGN KEY ("sellerId") REFERENCES users("id") ON DELETE CASCADE + ); + + CREATE TABLE IF NOT EXISTS listing_images ( + "id" SERIAL PRIMARY KEY, + "listingId" TEXT NOT NULL, + "imagePath" TEXT NOT NULL, + FOREIGN KEY ("listingId") REFERENCES listings("id") ON DELETE CASCADE + ); + + CREATE TABLE IF NOT EXISTS support_messages ( + "id" TEXT PRIMARY KEY, + "senderId" TEXT NOT NULL, + "message" TEXT NOT NULL, + "adminReply" TEXT DEFAULT NULL, + "unreadAdminReply" INTEGER DEFAULT 0, + "isResolved" INTEGER DEFAULT 0, + "timestamp" BIGINT NOT NULL + ); + + CREATE TABLE IF NOT EXISTS messages ( + "id" TEXT PRIMARY KEY, + "senderId" TEXT NOT NULL, + "receiverId" TEXT NOT NULL, + "message" TEXT NOT NULL, + "timestamp" BIGINT NOT NULL, + "isRead" INTEGER DEFAULT 0, + FOREIGN KEY ("senderId") REFERENCES users("id") ON DELETE CASCADE, + FOREIGN KEY ("receiverId") REFERENCES users("id") ON DELETE CASCADE + ); + `); + console.log("✓ PostgreSQL Database Ready"); + } catch (err) { + console.error("Database initialization failed:", err); + } finally { + client.release(); + } +}; + +export default db; diff --git a/server/index.js b/server/index.js new file mode 100644 index 0000000000000000000000000000000000000000..592c549c4f347632bd8bd7a08309f3f63cb46c65 --- /dev/null +++ b/server/index.js @@ -0,0 +1,722 @@ +import 'dotenv/config'; +import express from 'express'; +import cors from 'cors'; +import multer from 'multer'; +import path from 'path'; +import fs from 'fs'; +import { v4 as uuidv4 } from 'uuid'; +import crypto from 'crypto'; +import db, { initDB } from './db.js'; + +// Import Http & Socket.io for Signaling +import { createServer } from 'http'; +import { Server } from 'socket.io'; + +const app = express(); +const PORT = process.env.PORT || 7860; + +// Create raw HTTP server for Express app (required for socket.io) +const httpServer = createServer(app); + +import * as nsfwjs from 'nsfwjs'; +import sharp from 'sharp'; + +let tf; +try { + tf = await import('@tensorflow/tfjs-node'); +} catch (e) { + tf = await import('@tensorflow/tfjs'); + console.warn("⚠ Running TensorFlow.js in pure JS mode. Install @tensorflow/tfjs-node for faster performance."); +} + +// Middlewares +import morgan from 'morgan'; +app.use(cors()); +app.use(express.json()); +app.use(morgan('dev')); + +const uploadDir = path.resolve('./server/uploads'); +const modelsDir = path.resolve('./server/models'); + +// Graceful port handling – if the default port is busy, try the next one +// Ensure upload and model directories exist +if (!fs.existsSync(uploadDir)) { + fs.mkdirSync(uploadDir, { recursive: true }); +} +if (!fs.existsSync(modelsDir)) { + fs.mkdirSync(modelsDir, { recursive: true }); +} + +// Graceful port handling – after httpServer is defined +httpServer.on('error', (err) => { + if (err.code === 'EADDRINUSE') { + console.warn(`Port ${PORT} already in use, trying ${PORT + 1}`); + httpServer.listen(PORT + 1); + } else { + console.error('Server error:', err); + } +}); + +app.use('/uploads', express.static(uploadDir)); +app.use('/models', express.static(modelsDir)); + +// Serve the React production build +const distDir = path.resolve('./dist'); +if (fs.existsSync(distDir)) { + app.use(express.static(distDir)); +} + +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, uploadDir); + }, + filename: function (req, file, cb) { + const ext = path.extname(file.originalname); + cb(null, uuidv4() + ext); + } +}); +const upload = multer({ storage: storage }); + +// Load NSFW Model Locally +let nsfwModel = null; +const loadModel = async () => { + try { + // Wait for the server to be fully ready before internal fetch + await new Promise(resolve => setTimeout(resolve, 500)); + + // Attempt local filesystem URL first if path-aware, fallback to internal HTTP + // tfjs-node can handle file:// URLs directly and is MUCH faster. + const isNodeBackend = tf.engine().backendName === 'tensorflow'; + let modelFileUrl; + + if (isNodeBackend) { + // On Linux/HuggingFace, we need file:///app/server/... + // On Windows, absolute path needs to be converted carefully. + const absPath = path.resolve(modelsDir); + modelFileUrl = `file://${absPath.startsWith('/') ? '' : '/'}${absPath.replace(/\\/g, '/')}/`; + console.log("Loading NSFW Model via Native Engine (File IO)..."); + } else { + modelFileUrl = `http://127.0.0.1:${PORT}/models/`; + console.log("Loading NSFW Model via Pure JS Mode (HTTP Loopback)..."); + } + + nsfwModel = await nsfwjs.load(modelFileUrl, { size: 224 }); + console.log("✓ Offline NSFW Security Engine Loaded"); + } catch (err) { + console.warn(`⚠ Local NSFW Model load failed (err: ${err.message}). Attempting CDN fallback...`); + try { + // Corrected CDN URL for MobileNetV2 fallback + nsfwModel = await nsfwjs.load('https://nsfwjs.com/model/', { size: 224 }); + console.log("✓ Online NSFW Security Engine Loaded (CDN Fallback)"); + } catch (cdnErr) { + console.warn("⚠ NSFW Model could not be loaded even from CDN. Content moderation will be disabled.", cdnErr.message); + } + } +}; + +// Helper to check if an image is inappropriate +const checkInappropriate = async (filePath) => { + if (!nsfwModel) return false; + try { + // Standardize image processing via sharp before passing to TFJS + // Model expects 224x224 (MobileNetV2 standard) + const { data, info } = await sharp(filePath) + .resize(224, 224) + .removeAlpha() + .raw() + .toBuffer({ resolveWithObject: true }); + + // Reconstruct into a tensor for classification + const image = tf.tensor3d(new Uint8Array(data), [info.height, info.width, 3]); + const predictions = await nsfwModel.classify(image); + image.dispose(); + + // Block if highly explicit content is detected + return predictions.some(p => + ['Porn', 'Hentai', 'Sexy'].includes(p.className) && p.probability > 0.6 + ); + } catch (err) { + console.error("AI Analysis Error:", err); + return false; + } +}; + +// REST API Endpoints +app.post('/api/users', upload.single('selfie'), async (req, res) => { + try { + const { id: deviceId, deviceToken, name, role, contact, nearestCity, district, state, pincode, location } = req.body; + if (!deviceId || !name || !role || !contact || !nearestCity || !district || !state || !pincode || !location || !req.file) { + if (req.file) try { fs.unlinkSync(req.file.path); } catch(e){} + return res.status(400).json({ error: 'Missing required fields, location or selfie.' }); + } + + // AI Validation on Backend + const isInappropriate = await checkInappropriate(req.file.path); + if (isInappropriate) { + try { fs.unlinkSync(req.file.path); } catch(e){} + return res.status(400).json({ error: 'Snapshot rejected: Inappropriate content detected by security engine.' }); + } + + const { rows: matches } = await db.query(` + SELECT * FROM users + WHERE contact = $1 AND role = $2 AND name = $3 AND state = $4 AND district = $5 AND pincode = $6 + `, [contact, role, name, state, district, pincode]); + const existingProfile = matches[0]; + + const compoundId = existingProfile ? existingProfile.id : `${deviceId}_${role}`; + const selfiePath = `/uploads/${req.file.filename}`; + + if (!existingProfile) { + // New Profile - Extra Security Check: Prevent hijacking if only phone matches but others don't + const { rows: phoneCheck } = await db.query(`SELECT id FROM users WHERE contact = $1 AND role = $2`, [contact, role]); + if (phoneCheck.length > 0) { + return res.status(400).json({ error: 'A profile with this phone number exists with different details. Please verify your exact name and location details to restore it.' }); + } + + await db.query(` + INSERT INTO users (id, name, role, "selfiePath", contact, "nearestCity", district, state, pincode, location, "deviceId", "deviceToken") + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) + `, [compoundId, name, role, selfiePath, contact, nearestCity, district, state, pincode, location, deviceId, deviceToken]); + } else { + // "Auto-Sync" - Re-link existing profile to this new device if it matches contact/role + if (existingProfile.isBlocked) { + return res.status(403).json({ error: 'Account blocked by admin.' }); + } + + // Cleanup old selfie + if (existingProfile.selfiePath) { + try { fs.unlinkSync(path.join(process.cwd(), 'server', existingProfile.selfiePath)); } catch(e){} + } + + await db.query(` + UPDATE users SET name = $1, "selfiePath" = $2, "nearestCity" = $3, district = $4, state = $5, pincode = $6, location = $7, "deviceId" = $8, "deviceToken" = $9 + WHERE id = $10 + `, [name, selfiePath, nearestCity, district, state, pincode, location, deviceId, deviceToken, compoundId]); + } + + res.status(200).json({ + id: compoundId, deviceId, name, role, contact, + nearestCity, district, state, pincode, + location: JSON.parse(location), + selfiePath, isBlocked: existingProfile ? existingProfile.isBlocked : 0 + }); + } catch (err) { + console.error(err); + res.status(500).json({ error: 'Failed to register.' }); + } +}); + +app.get('/api/users/device/:deviceId', async (req, res) => { + try { + const { deviceId } = req.params; + const token = req.headers['x-device-token']; // Secure verification + + const { rows: profiles } = await db.query(` + SELECT * FROM users + WHERE "deviceId" = $1 OR id LIKE $2 + `, [deviceId, `${deviceId}_%`]); + + // Simple Token-based security check (if profile exists and has a token, it MUST match) + const validProfiles = profiles.filter(p => !p.deviceToken || p.deviceToken === token); + + res.json(validProfiles); + } catch (err) { + console.error(err); + res.status(500).json({ error: 'Failed to fetch device profiles' }); + } +}); + +app.get('/api/listings', async (req, res) => { + try { + const { rows } = await db.query(` + SELECT listings.*, users."selfiePath" as "sellerSelfie" + FROM listings + JOIN users ON listings."sellerId" = users.id + WHERE listings.status != 'sold' + ORDER BY timestamp DESC + `); + + const result = await Promise.all(rows.map(async (listing) => { + const { rows: images } = await db.query('SELECT "imagePath" FROM listing_images WHERE "listingId" = $1', [listing.id]); + return { + ...listing, + location: JSON.parse(listing.location), + nearestCity: listing.nearestCity || '', + district: listing.district || '', + state: listing.state || '', + pincode: listing.pincode || '', + images: images.map(img => img.imagePath) + }; + })); + res.json(result); + } catch (err) { + console.error(err); + res.status(500).json({ error: 'Failed to fetch' }); + } +}); + +app.post('/api/listings', upload.array('images', 5), async (req, res) => { + try { + const { sellerId, sellerName, cropName, quantity, price, location, nearestCity, district, state, pincode } = req.body; + + // Strict Location Validation + let parsedLocation; + try { + parsedLocation = JSON.parse(location); + if (!parsedLocation || typeof parsedLocation.lat !== 'number' || typeof parsedLocation.lng !== 'number') { + throw new Error('Invalid coordinates'); + } + } catch (e) { + if (req.files) req.files.forEach(f => { try { fs.unlinkSync(f.path); } catch(ev){} }); + return res.status(400).json({ error: 'Valid GPS Location is strictly mandatory for all listings.' }); + } + + if (!sellerId || !cropName || !quantity || !location || !req.files || req.files.length === 0) { + if (req.files) req.files.forEach(f => { try { fs.unlinkSync(f.path); } catch(e){} }); + return res.status(400).json({ error: 'Missing fields' }); + } + + // AI Validation for all uploaded images + for (const file of req.files) { + const isInappropriate = await checkInappropriate(file.path); + if (isInappropriate) { + // Delete all uploaded images for this request if any are NSFW + req.files.forEach(f => { try { fs.unlinkSync(f.path); } catch(e){} }); + return res.status(400).json({ error: 'Listing rejected: One or more images contain inappropriate content.' }); + } + } + + const listingId = uuidv4(); + const timestamp = Date.now(); + + await db.query(` + INSERT INTO listings (id, "sellerId", "sellerName", "cropName", quantity, price, location, "nearestCity", district, state, pincode, timestamp) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) + `, [listingId, sellerId, sellerName, cropName, quantity, price, location, nearestCity, district, state, pincode, timestamp]); + + const imagePaths = req.files.map(file => `/uploads/${file.filename}`); + + await Promise.all(imagePaths.map(p => + db.query(`INSERT INTO listing_images ("listingId", "imagePath") VALUES ($1, $2)`, [listingId, p]) + )); + + const { rows: userRows } = await db.query(`SELECT "selfiePath" FROM users WHERE id = $1`, [sellerId]); + const user = userRows[0]; + + res.status(201).json({ + id: listingId, sellerId, sellerName, + sellerSelfie: user ? user.selfiePath : null, + cropName, quantity, price, location: JSON.parse(location), + timestamp, images: imagePaths + }); + } catch (err) { + if (req.files) req.files.forEach(f => { try { fs.unlinkSync(f.path); } catch(e){} }); + res.status(500).json({ error: 'Failed to create' }); + } +}); + +// Configure Socket.IO Server +const io = new Server(httpServer, { + cors: { + origin: '*', + methods: ['GET', 'POST'] + } +}); + +// Global mapping of deviceId -> socketId +const activeUsers = new Map(); + +// Mark as sold endpoint (uses io) +app.patch('/api/listings/:id/sold', async (req, res) => { + try { + const { id } = req.params; + await db.query(`UPDATE listings SET status = 'sold' WHERE id = $1`, [id]); + + // Broadcast everywhere immediately + io.emit('listing-updated', { id, status: 'sold' }); + + res.json({ success: true, id, status: 'sold' }); + } catch (err) { + console.error(err); + res.status(500).json({ error: 'Failed to update listing' }); + } +}); + +// Edit listing info endpoint +app.patch('/api/listings/:id/edit', async (req, res) => { + try { + const { id } = req.params; + const { cropName, quantity, price } = req.body; + + await db.query(`UPDATE listings SET "cropName" = $1, quantity = $2, price = $3 WHERE id = $4`, [cropName, quantity, price, id]); + + // Broadcast changes + io.emit('listing-edited', { id, cropName, quantity, price }); + + res.json({ success: true, id, cropName, quantity, price }); + } catch (err) { + console.error(err); + res.status(500).json({ error: 'Failed to edit listing' }); + } +}); + +// --- USER MESSAGING API --- +app.post('/api/messages', async (req, res) => { + try { + const { id, senderId, receiverId, message, timestamp } = req.body; + const socketId = req.headers['x-socket-id']; + + // Zero-Trust IDOR Check + const activeSocket = activeUsers.get(senderId ? senderId.split('_')[0] : null); + if (!activeSocket || activeSocket !== socketId) { + return res.status(403).json({ error: 'Messaging Identity verification failed.' }); + } + + await db.query(`INSERT INTO messages (id, "senderId", "receiverId", message, timestamp) VALUES ($1, $2, $3, $4, $5)`, [id, senderId, receiverId, message, timestamp]); + res.json({ success: true, id }); + } catch (err) { + console.error(err); + res.status(500).json({ error: 'Failed to send message' }); + } +}); + +app.get('/api/messages/history/:user1/:user2', async (req, res) => { + try { + const { user1, user2 } = req.params; + const { rows: history } = await db.query(` + SELECT * FROM messages + WHERE ("senderId" = $1 AND "receiverId" = $2) OR ("senderId" = $3 AND "receiverId" = $4) + ORDER BY timestamp ASC + `, [user1, user2, user2, user1]); + res.json(history); + } catch (err) { + res.status(500).json({ error: 'Failed to fetch messages' }); + } +}); + +app.get('/api/messages/inbox/:userId', async (req, res) => { + try { + const { userId } = req.params; + // Get the most recent message for each unique conversation strictly ordered by timestamp + const { rows: inbox } = await db.query(` + SELECT * FROM ( + SELECT m.*, + CASE WHEN m."senderId" = $1 THEN r.name ELSE s.name END as "contactName", + CASE WHEN m."senderId" = $1 THEN r."selfiePath" ELSE s."selfiePath" END as "contactSelfie", + CASE WHEN m."senderId" = $1 THEN r.id ELSE s.id END as "contactId", + ROW_NUMBER() OVER(PARTITION BY CASE WHEN m."senderId" = $1 THEN m."receiverId" ELSE m."senderId" END ORDER BY m.timestamp DESC) as rn + FROM messages m + JOIN users s ON m."senderId" = s.id + JOIN users r ON m."receiverId" = r.id + WHERE m."senderId" = $1 OR m."receiverId" = $1 + ) sub + WHERE rn = 1 + ORDER BY timestamp DESC + `, [userId]); + res.json(inbox); + } catch (err) { + console.error("Inbox fetch err:", err); + res.status(500).json({ error: 'Failed to fetch inbox' }); + } +}); + +app.get('/api/messages/unread-count/:userId', async (req, res) => { + try { + const { rows } = await db.query(`SELECT COUNT(*) as count FROM messages WHERE "receiverId" = $1 AND "isRead" = 0`, [req.params.userId]); + res.json({ count: parseInt(rows[0].count) }); + } catch (err) { + res.status(500).json({ error: 'Failed to fetch unread count' }); + } +}); + +app.patch('/api/messages/read/:senderId/:receiverId', async (req, res) => { + try { + await db.query(`UPDATE messages SET "isRead" = 1 WHERE "senderId" = $1 AND "receiverId" = $2`, [req.params.senderId, req.params.receiverId]); + res.json({ success: true }); + } catch (err) { + res.status(500).json({ error: 'Failed' }); + } +}); + +// --- SUPPORT API (CLIENT) --- +app.post('/api/support', async (req, res) => { + try { + const { senderId, message } = req.body; + if (!senderId || !message) return res.status(400).json({ error: 'Missing fields' }); + const ticketId = uuidv4(); + await db.query(`INSERT INTO support_messages (id, "senderId", message, timestamp) VALUES ($1, $2, $3, $4)`, [ticketId, senderId, message, Date.now()]); + // Notify admin clients + io.emit('support-ticket-updated'); + res.status(201).json({ success: true, id: ticketId }); + } catch (err) { + res.status(500).json({ error: 'Failed to create support ticket' }); + } +}); + +app.get('/api/support/history/:deviceId', async (req, res) => { + try { + const { deviceId } = req.params; + const { rows: history } = await db.query(`SELECT * FROM support_messages WHERE ("senderId" = $1 OR "senderId" LIKE $2) ORDER BY timestamp DESC`, [deviceId, `${deviceId}_%`]); + res.json(history); + } catch (err) { + res.status(500).json({ error: 'Failed' }); + } +}); + +app.get('/api/support/unread/:deviceId', async (req, res) => { + try { + const { deviceId } = req.params; + const { rows } = await db.query(`SELECT COUNT(*) as count FROM support_messages WHERE ("senderId" = $1 OR "senderId" LIKE $2) AND "unreadAdminReply" = 1`, [deviceId, `${deviceId}_%`]); + res.json({ count: parseInt(rows[0].count) }); + } catch (err) { + res.status(500).json({ error: 'Failed' }); + } +}); + +app.patch('/api/support/read/:deviceId', async (req, res) => { + try { + const { deviceId } = req.params; + await db.query(`UPDATE support_messages SET "unreadAdminReply" = 0 WHERE ("senderId" = $1 OR "senderId" LIKE $2)`, [deviceId, `${deviceId}_%`]); + res.json({ success: true }); + } catch (err) { + res.status(500).json({ error: 'Failed' }); + } +}); + +// --- ADMIN API --- +// WORKAROUND: Instead of storing secret in .env, we use the SHA-256 hash +// Hash of "MyNewSecureAdminPassword2026!" is provided as the default. +const DEFAULT_ADMIN_HASH = '922b11a4333a2f48c9cd3a55240b26b724d5273d28564e485582b5a375876e46'; +const ADMIN_SECRET = process.env.ADMIN_SECRET; + +const ADMIN_HASH_EXPECTED = ADMIN_SECRET + ? crypto.createHash('sha256').update(ADMIN_SECRET).digest('hex') + : DEFAULT_ADMIN_HASH; + +const activeAdminTokens = new Set(); + +app.post('/api/admin/login', (req, res) => { + if (req.body.passwordHash === ADMIN_HASH_EXPECTED) { + const sessionToken = uuidv4(); + activeAdminTokens.add(sessionToken); + res.json({ token: sessionToken }); + } else { + res.status(401).json({ error: 'Invalid encrypted admin password' }); + } +}); + +const adminAuth = (req, res, next) => { + if (activeAdminTokens.has(req.headers['x-admin-key'])) return next(); + return res.status(403).json({ error: 'Unauthorized Admin Session.' }); +}; + +app.get('/api/admin/stats', adminAuth, async (req, res) => { + try { + const { rows: users } = await db.query(`SELECT count(*) as count FROM users`); + const { rows: listings } = await db.query(`SELECT count(*) as count FROM listings`); + const { rows: pendingSupport } = await db.query(`SELECT count(*) as count FROM support_messages WHERE "isResolved" = 0`); + res.json({ users: parseInt(users[0].count), listings: parseInt(listings[0].count), pendingSupport: parseInt(pendingSupport[0].count) }); + } catch (e) { res.status(500).json({ error: 'Failed' }); } +}); + +app.get('/api/admin/users', adminAuth, async (req, res) => { + try { + const { rows: users } = await db.query(`SELECT * FROM users ORDER BY id ASC`); + res.json(users); + } catch(e) { res.status(500).json({ error: 'Failed' }); } +}); + +app.patch('/api/admin/users/:id/block', adminAuth, async (req, res) => { + const { isBlocked } = req.body; + try { + await db.query(`UPDATE users SET "isBlocked" = $1 WHERE id = $2`, [isBlocked ? 1 : 0, req.params.id]); + io.emit('user-blocked-status-changed', { id: req.params.id, isBlocked: isBlocked ? 1 : 0 }); // Global notification + res.json({ success: true }); + } catch(e) { res.status(500).json({ error: 'Failed' }); } +}); + +app.delete('/api/admin/users/:id', adminAuth, async (req, res) => { + try { + const { rows: users } = await db.query(`SELECT * FROM users WHERE id = $1`, [req.params.id]); + const user = users[0]; + if (!user) return res.status(404).json({ error: 'Not found' }); + + // Delete their selfie image file physically + try { fs.unlinkSync(path.join(uploadDir, path.basename(user.selfiePath))); } catch(e){} + + // Also delete listing images as SQLite Pragma foreign key relies on delete cascade for db rows not files + const { rows: userListings } = await db.query(`SELECT id FROM listings WHERE "sellerId" = $1`, [req.params.id]); + for (const l of userListings) { + const { rows: imgs } = await db.query(`SELECT "imagePath" FROM listing_images WHERE "listingId" = $1`, [l.id]); + for (const i of imgs) { + try { fs.unlinkSync(path.join(uploadDir, path.basename(i.imagePath))); } catch(e){} + } + } + + // Let's manually cascade for safety as PRAGMA might not be active on all connections + for (const l of userListings) { + await db.query(`DELETE FROM listing_images WHERE "listingId" = $1`, [l.id]); + } + await db.query(`DELETE FROM listings WHERE "sellerId" = $1`, [req.params.id]); + + // Cleanup the user's selfie to prevent storage leak + if (user && user.selfiePath) { + try { fs.unlinkSync(path.join(process.cwd(), 'server', user.selfiePath)); } catch (e) {} + } + await db.query(`DELETE FROM users WHERE id = $1`, [req.params.id]); + + // Blast it out to clients + io.emit('listing-updated', { forceRefresh: true }); // trigger refresh for others + + res.json({ success: true }); + } catch(e) { console.error(e); res.status(500).json({ error: 'Failed to delete' }); } +}); + +app.get('/api/admin/listings', adminAuth, async (req, res) => { + try { + const { rows: listings } = await db.query(`SELECT listings.*, users.name as "sellerNameDisplay", users.contact as "sellerContact" FROM listings JOIN users ON users.id = listings."sellerId" ORDER BY timestamp DESC`); + const result = await Promise.all(listings.map(async l => { + const { rows: imgs } = await db.query(`SELECT "imagePath" FROM listing_images WHERE "listingId" = $1`, [l.id]); + return { ...l, images: imgs.map(i => i.imagePath) }; + })); + res.json(result); + } catch(e) { res.status(500).json({ error: 'Failed' }); } +}); + +app.delete('/api/admin/listings/:id', adminAuth, async (req, res) => { + try { + const { rows: imgs } = await db.query(`SELECT "imagePath" FROM listing_images WHERE "listingId" = $1`, [req.params.id]); + for (const i of imgs) { + try { fs.unlinkSync(path.join(uploadDir, path.basename(i.imagePath))); } catch(e){} + } + await db.query(`DELETE FROM listing_images WHERE "listingId" = $1`, [req.params.id]); + await db.query(`DELETE FROM listings WHERE id = $1`, [req.params.id]); + + // Push delete command to all socket clients using the updated structure + io.emit('listing-updated', { id: req.params.id, status: 'deleted' }); + + res.json({ success: true }); + } catch(e) { res.status(500).json({ error: 'Failed' }); } +}); +app.get('/api/admin/support', adminAuth, async (req, res) => { + try { + const { rows: messages } = await db.query(`SELECT support_messages.*, users.name, users.role, users.contact, users."selfiePath" FROM support_messages LEFT JOIN users ON users.id = support_messages."senderId" ORDER BY support_messages.timestamp DESC`); + res.json(messages); + } catch(e) { res.status(500).json({ error: 'Failed' }); } +}); + +app.patch('/api/admin/support/:id/resolve', adminAuth, async (req, res) => { + try { + await db.query(`UPDATE support_messages SET "isResolved" = 1 WHERE id = $1`, [req.params.id]); + res.json({ success: true }); + } catch(e) { res.status(500).json({ error: 'Failed' }); } +}); + +app.patch('/api/admin/support/:id/reply', adminAuth, async (req, res) => { + try { + const { reply } = req.body; + await db.query(`UPDATE support_messages SET "adminReply" = $1, "unreadAdminReply" = 1 WHERE id = $2`, [reply, req.params.id]); + io.emit('support-ticket-updated'); // Notify clients + res.json({ success: true, reply }); + } catch(e) { + console.error("Support Reply Error:", e); + res.status(500).json({ error: 'Failed' }); + } +}); +// --- END ADMIN API --- + +io.on('connection', (socket) => { + + socket.on('join-network', (deviceId) => { + activeUsers.set(deviceId, socket.id); + console.log(`User connected: ${deviceId} via socket ${socket.id}`); + }); + + socket.on('disconnect', () => { + for (const [deviceId, sockId] of activeUsers.entries()) { + if (sockId === socket.id) { + activeUsers.delete(deviceId); + console.log(`User disconnected: ${deviceId}`); + break; + } + } + }); + + const getRawId = (id) => id ? id.split('_')[0] : null; + + // Live Messaging Events + socket.on('send-message', (data) => { + const receiverSocket = activeUsers.get(getRawId(data.receiverId)); + if (receiverSocket) { + io.to(receiverSocket).emit('receive-message', data); + } + }); + + // WebRTC Signaling Events + socket.on('call-user', (data) => { + const { userToCall, signalData, from, callerName, callerSelfie } = data; + const receiverSocket = activeUsers.get(getRawId(userToCall)); + if (receiverSocket) { + io.to(receiverSocket).emit('incoming-call', { + signal: signalData, + from, + callerName, + callerSelfie + }); + } else { + // Notify caller that receiver is offline + io.to(socket.id).emit('call-failed', { message: 'User is offline' }); + } + }); + + socket.on('answer-call', (data) => { + const callerSocket = activeUsers.get(getRawId(data.to)); + if (callerSocket) { + io.to(callerSocket).emit('call-accepted', data.signal); + } + }); + + socket.on('end-call', (data) => { + const peerSocket = activeUsers.get(getRawId(data.to)); + if (peerSocket) { + io.to(peerSocket).emit('call-ended'); + } + }); + + socket.on('missed-call', (data) => { + const peerSocket = activeUsers.get(getRawId(data.to)); + if (peerSocket) io.to(peerSocket).emit('missed-call'); + }); + + // Video Negotiation Signaling + socket.on('request-video', (data) => { + const peerSocket = activeUsers.get(getRawId(data.to)); + if (peerSocket) io.to(peerSocket).emit('video-requested', { from: data.from }); + }); + + socket.on('accept-video', (data) => { + const peerSocket = activeUsers.get(getRawId(data.to)); + if (peerSocket) io.to(peerSocket).emit('video-accepted'); + }); + + socket.on('reject-video', (data) => { + const peerSocket = activeUsers.get(getRawId(data.to)); + if (peerSocket) io.to(peerSocket).emit('video-rejected'); + }); +}); + +// SPA fallback — must be registered AFTER all API routes but BEFORE listen +// Express 5 uses path-to-regexp v8 which requires '/{*splat}' instead of '*' +const spaDistDir = path.resolve('./dist'); +const spaIndexHtml = path.join(spaDistDir, 'index.html'); +if (fs.existsSync(spaIndexHtml)) { + app.get('/{*splat}', (req, res) => { + res.sendFile(spaIndexHtml); + }); +} + +httpServer.listen(PORT, '0.0.0.0', async () => { + await initDB(); + console.log(`Backend API & WebSocket Server running at http://0.0.0.0:${PORT}`); + await loadModel(); +}); diff --git a/server/mandi.db b/server/mandi.db new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/server/models/group1-shard1of1 b/server/models/group1-shard1of1 new file mode 100644 index 0000000000000000000000000000000000000000..88fc573b944aa7328778a44637ab666f0b0fa91b --- /dev/null +++ b/server/models/group1-shard1of1 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e7dddbb16acacc1bf1601b1b8a761e730ff934b7f2d7771312b2f000e5f5f13 +size 2619461 diff --git a/server/models/model.json b/server/models/model.json new file mode 100644 index 0000000000000000000000000000000000000000..d68082e4e7cb1d6bdfc1a89f6ca1e098f44078f0 --- /dev/null +++ b/server/models/model.json @@ -0,0 +1 @@ +{"modelTopology": {"keras_version": "2.2.4", "backend": "tensorflow", "model_config": {"class_name": "Model", "config": {"name": "model_1", "layers": [{"name": "input_1", "class_name": "InputLayer", "config": {"batch_input_shape": [null, 224, 224, 3], "dtype": "float32", "sparse": false, "name": "input_1"}, "inbound_nodes": []}, {"name": "Conv1_pad", "class_name": "ZeroPadding2D", "config": {"name": "Conv1_pad", "trainable": false, "padding": [[0, 1], [0, 1]], "data_format": "channels_last"}, "inbound_nodes": [[["input_1", 0, 0, {}]]]}, {"name": "Conv1", "class_name": "Conv2D", "config": {"name": "Conv1", "trainable": false, "filters": 32, "kernel_size": [3, 3], "strides": [2, 2], "padding": "valid", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["Conv1_pad", 0, 0, {}]]]}, {"name": "bn_Conv1", "class_name": "BatchNormalization", "config": {"name": "bn_Conv1", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["Conv1", 0, 0, {}]]]}, {"name": "Conv1_relu", "class_name": "ReLU", "config": {"name": "Conv1_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["bn_Conv1", 0, 0, {}]]]}, {"name": "expanded_conv_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "expanded_conv_depthwise", "trainable": false, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["Conv1_relu", 0, 0, {}]]]}, {"name": "expanded_conv_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "expanded_conv_depthwise_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["expanded_conv_depthwise", 0, 0, {}]]]}, {"name": "expanded_conv_depthwise_relu", "class_name": "ReLU", "config": {"name": "expanded_conv_depthwise_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["expanded_conv_depthwise_BN", 0, 0, {}]]]}, {"name": "expanded_conv_project", "class_name": "Conv2D", "config": {"name": "expanded_conv_project", "trainable": false, "filters": 16, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["expanded_conv_depthwise_relu", 0, 0, {}]]]}, {"name": "expanded_conv_project_BN", "class_name": "BatchNormalization", "config": {"name": "expanded_conv_project_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["expanded_conv_project", 0, 0, {}]]]}, {"name": "block_1_expand", "class_name": "Conv2D", "config": {"name": "block_1_expand", "trainable": false, "filters": 96, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["expanded_conv_project_BN", 0, 0, {}]]]}, {"name": "block_1_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_1_expand_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_1_expand", 0, 0, {}]]]}, {"name": "block_1_expand_relu", "class_name": "ReLU", "config": {"name": "block_1_expand_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_1_expand_BN", 0, 0, {}]]]}, {"name": "block_1_pad", "class_name": "ZeroPadding2D", "config": {"name": "block_1_pad", "trainable": false, "padding": [[0, 1], [0, 1]], "data_format": "channels_last"}, "inbound_nodes": [[["block_1_expand_relu", 0, 0, {}]]]}, {"name": "block_1_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_1_depthwise", "trainable": false, "kernel_size": [3, 3], "strides": [2, 2], "padding": "valid", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_1_pad", 0, 0, {}]]]}, {"name": "block_1_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_1_depthwise_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_1_depthwise", 0, 0, {}]]]}, {"name": "block_1_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_1_depthwise_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_1_depthwise_BN", 0, 0, {}]]]}, {"name": "block_1_project", "class_name": "Conv2D", "config": {"name": "block_1_project", "trainable": false, "filters": 24, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_1_depthwise_relu", 0, 0, {}]]]}, {"name": "block_1_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_1_project_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_1_project", 0, 0, {}]]]}, {"name": "block_2_expand", "class_name": "Conv2D", "config": {"name": "block_2_expand", "trainable": false, "filters": 144, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_1_project_BN", 0, 0, {}]]]}, {"name": "block_2_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_2_expand_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_2_expand", 0, 0, {}]]]}, {"name": "block_2_expand_relu", "class_name": "ReLU", "config": {"name": "block_2_expand_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_2_expand_BN", 0, 0, {}]]]}, {"name": "block_2_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_2_depthwise", "trainable": false, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_2_expand_relu", 0, 0, {}]]]}, {"name": "block_2_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_2_depthwise_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_2_depthwise", 0, 0, {}]]]}, {"name": "block_2_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_2_depthwise_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_2_depthwise_BN", 0, 0, {}]]]}, {"name": "block_2_project", "class_name": "Conv2D", "config": {"name": "block_2_project", "trainable": false, "filters": 24, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_2_depthwise_relu", 0, 0, {}]]]}, {"name": "block_2_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_2_project_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_2_project", 0, 0, {}]]]}, {"name": "block_2_add", "class_name": "Add", "config": {"name": "block_2_add", "trainable": false}, "inbound_nodes": [[["block_1_project_BN", 0, 0, {}], ["block_2_project_BN", 0, 0, {}]]]}, {"name": "block_3_expand", "class_name": "Conv2D", "config": {"name": "block_3_expand", "trainable": false, "filters": 144, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_2_add", 0, 0, {}]]]}, {"name": "block_3_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_3_expand_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_3_expand", 0, 0, {}]]]}, {"name": "block_3_expand_relu", "class_name": "ReLU", "config": {"name": "block_3_expand_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_3_expand_BN", 0, 0, {}]]]}, {"name": "block_3_pad", "class_name": "ZeroPadding2D", "config": {"name": "block_3_pad", "trainable": false, "padding": [[0, 1], [0, 1]], "data_format": "channels_last"}, "inbound_nodes": [[["block_3_expand_relu", 0, 0, {}]]]}, {"name": "block_3_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_3_depthwise", "trainable": false, "kernel_size": [3, 3], "strides": [2, 2], "padding": "valid", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_3_pad", 0, 0, {}]]]}, {"name": "block_3_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_3_depthwise_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_3_depthwise", 0, 0, {}]]]}, {"name": "block_3_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_3_depthwise_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_3_depthwise_BN", 0, 0, {}]]]}, {"name": "block_3_project", "class_name": "Conv2D", "config": {"name": "block_3_project", "trainable": false, "filters": 32, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_3_depthwise_relu", 0, 0, {}]]]}, {"name": "block_3_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_3_project_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_3_project", 0, 0, {}]]]}, {"name": "block_4_expand", "class_name": "Conv2D", "config": {"name": "block_4_expand", "trainable": false, "filters": 192, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_3_project_BN", 0, 0, {}]]]}, {"name": "block_4_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_4_expand_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_4_expand", 0, 0, {}]]]}, {"name": "block_4_expand_relu", "class_name": "ReLU", "config": {"name": "block_4_expand_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_4_expand_BN", 0, 0, {}]]]}, {"name": "block_4_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_4_depthwise", "trainable": false, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_4_expand_relu", 0, 0, {}]]]}, {"name": "block_4_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_4_depthwise_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_4_depthwise", 0, 0, {}]]]}, {"name": "block_4_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_4_depthwise_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_4_depthwise_BN", 0, 0, {}]]]}, {"name": "block_4_project", "class_name": "Conv2D", "config": {"name": "block_4_project", "trainable": false, "filters": 32, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_4_depthwise_relu", 0, 0, {}]]]}, {"name": "block_4_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_4_project_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_4_project", 0, 0, {}]]]}, {"name": "block_4_add", "class_name": "Add", "config": {"name": "block_4_add", "trainable": false}, "inbound_nodes": [[["block_3_project_BN", 0, 0, {}], ["block_4_project_BN", 0, 0, {}]]]}, {"name": "block_5_expand", "class_name": "Conv2D", "config": {"name": "block_5_expand", "trainable": false, "filters": 192, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_4_add", 0, 0, {}]]]}, {"name": "block_5_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_5_expand_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_5_expand", 0, 0, {}]]]}, {"name": "block_5_expand_relu", "class_name": "ReLU", "config": {"name": "block_5_expand_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_5_expand_BN", 0, 0, {}]]]}, {"name": "block_5_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_5_depthwise", "trainable": false, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_5_expand_relu", 0, 0, {}]]]}, {"name": "block_5_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_5_depthwise_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_5_depthwise", 0, 0, {}]]]}, {"name": "block_5_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_5_depthwise_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_5_depthwise_BN", 0, 0, {}]]]}, {"name": "block_5_project", "class_name": "Conv2D", "config": {"name": "block_5_project", "trainable": false, "filters": 32, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_5_depthwise_relu", 0, 0, {}]]]}, {"name": "block_5_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_5_project_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_5_project", 0, 0, {}]]]}, {"name": "block_5_add", "class_name": "Add", "config": {"name": "block_5_add", "trainable": false}, "inbound_nodes": [[["block_4_add", 0, 0, {}], ["block_5_project_BN", 0, 0, {}]]]}, {"name": "block_6_expand", "class_name": "Conv2D", "config": {"name": "block_6_expand", "trainable": false, "filters": 192, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_5_add", 0, 0, {}]]]}, {"name": "block_6_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_6_expand_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_6_expand", 0, 0, {}]]]}, {"name": "block_6_expand_relu", "class_name": "ReLU", "config": {"name": "block_6_expand_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_6_expand_BN", 0, 0, {}]]]}, {"name": "block_6_pad", "class_name": "ZeroPadding2D", "config": {"name": "block_6_pad", "trainable": false, "padding": [[0, 1], [0, 1]], "data_format": "channels_last"}, "inbound_nodes": [[["block_6_expand_relu", 0, 0, {}]]]}, {"name": "block_6_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_6_depthwise", "trainable": false, "kernel_size": [3, 3], "strides": [2, 2], "padding": "valid", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_6_pad", 0, 0, {}]]]}, {"name": "block_6_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_6_depthwise_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_6_depthwise", 0, 0, {}]]]}, {"name": "block_6_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_6_depthwise_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_6_depthwise_BN", 0, 0, {}]]]}, {"name": "block_6_project", "class_name": "Conv2D", "config": {"name": "block_6_project", "trainable": false, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_6_depthwise_relu", 0, 0, {}]]]}, {"name": "block_6_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_6_project_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_6_project", 0, 0, {}]]]}, {"name": "block_7_expand", "class_name": "Conv2D", "config": {"name": "block_7_expand", "trainable": false, "filters": 384, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_6_project_BN", 0, 0, {}]]]}, {"name": "block_7_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_7_expand_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_7_expand", 0, 0, {}]]]}, {"name": "block_7_expand_relu", "class_name": "ReLU", "config": {"name": "block_7_expand_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_7_expand_BN", 0, 0, {}]]]}, {"name": "block_7_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_7_depthwise", "trainable": false, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_7_expand_relu", 0, 0, {}]]]}, {"name": "block_7_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_7_depthwise_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_7_depthwise", 0, 0, {}]]]}, {"name": "block_7_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_7_depthwise_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_7_depthwise_BN", 0, 0, {}]]]}, {"name": "block_7_project", "class_name": "Conv2D", "config": {"name": "block_7_project", "trainable": false, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_7_depthwise_relu", 0, 0, {}]]]}, {"name": "block_7_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_7_project_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_7_project", 0, 0, {}]]]}, {"name": "block_7_add", "class_name": "Add", "config": {"name": "block_7_add", "trainable": false}, "inbound_nodes": [[["block_6_project_BN", 0, 0, {}], ["block_7_project_BN", 0, 0, {}]]]}, {"name": "block_8_expand", "class_name": "Conv2D", "config": {"name": "block_8_expand", "trainable": false, "filters": 384, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_7_add", 0, 0, {}]]]}, {"name": "block_8_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_8_expand_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_8_expand", 0, 0, {}]]]}, {"name": "block_8_expand_relu", "class_name": "ReLU", "config": {"name": "block_8_expand_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_8_expand_BN", 0, 0, {}]]]}, {"name": "block_8_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_8_depthwise", "trainable": false, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_8_expand_relu", 0, 0, {}]]]}, {"name": "block_8_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_8_depthwise_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_8_depthwise", 0, 0, {}]]]}, {"name": "block_8_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_8_depthwise_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_8_depthwise_BN", 0, 0, {}]]]}, {"name": "block_8_project", "class_name": "Conv2D", "config": {"name": "block_8_project", "trainable": false, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_8_depthwise_relu", 0, 0, {}]]]}, {"name": "block_8_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_8_project_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_8_project", 0, 0, {}]]]}, {"name": "block_8_add", "class_name": "Add", "config": {"name": "block_8_add", "trainable": false}, "inbound_nodes": [[["block_7_add", 0, 0, {}], ["block_8_project_BN", 0, 0, {}]]]}, {"name": "block_9_expand", "class_name": "Conv2D", "config": {"name": "block_9_expand", "trainable": false, "filters": 384, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_8_add", 0, 0, {}]]]}, {"name": "block_9_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_9_expand_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_9_expand", 0, 0, {}]]]}, {"name": "block_9_expand_relu", "class_name": "ReLU", "config": {"name": "block_9_expand_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_9_expand_BN", 0, 0, {}]]]}, {"name": "block_9_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_9_depthwise", "trainable": false, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_9_expand_relu", 0, 0, {}]]]}, {"name": "block_9_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_9_depthwise_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_9_depthwise", 0, 0, {}]]]}, {"name": "block_9_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_9_depthwise_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_9_depthwise_BN", 0, 0, {}]]]}, {"name": "block_9_project", "class_name": "Conv2D", "config": {"name": "block_9_project", "trainable": false, "filters": 64, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_9_depthwise_relu", 0, 0, {}]]]}, {"name": "block_9_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_9_project_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_9_project", 0, 0, {}]]]}, {"name": "block_9_add", "class_name": "Add", "config": {"name": "block_9_add", "trainable": false}, "inbound_nodes": [[["block_8_add", 0, 0, {}], ["block_9_project_BN", 0, 0, {}]]]}, {"name": "block_10_expand", "class_name": "Conv2D", "config": {"name": "block_10_expand", "trainable": false, "filters": 384, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_9_add", 0, 0, {}]]]}, {"name": "block_10_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_10_expand_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_10_expand", 0, 0, {}]]]}, {"name": "block_10_expand_relu", "class_name": "ReLU", "config": {"name": "block_10_expand_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_10_expand_BN", 0, 0, {}]]]}, {"name": "block_10_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_10_depthwise", "trainable": false, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_10_expand_relu", 0, 0, {}]]]}, {"name": "block_10_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_10_depthwise_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_10_depthwise", 0, 0, {}]]]}, {"name": "block_10_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_10_depthwise_relu", "trainable": false, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_10_depthwise_BN", 0, 0, {}]]]}, {"name": "block_10_project", "class_name": "Conv2D", "config": {"name": "block_10_project", "trainable": false, "filters": 96, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_10_depthwise_relu", 0, 0, {}]]]}, {"name": "block_10_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_10_project_BN", "trainable": false, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_10_project", 0, 0, {}]]]}, {"name": "block_11_expand", "class_name": "Conv2D", "config": {"name": "block_11_expand", "trainable": true, "filters": 576, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_10_project_BN", 0, 0, {}]]]}, {"name": "block_11_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_11_expand_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_11_expand", 0, 0, {}]]]}, {"name": "block_11_expand_relu", "class_name": "ReLU", "config": {"name": "block_11_expand_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_11_expand_BN", 0, 0, {}]]]}, {"name": "block_11_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_11_depthwise", "trainable": true, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_11_expand_relu", 0, 0, {}]]]}, {"name": "block_11_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_11_depthwise_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_11_depthwise", 0, 0, {}]]]}, {"name": "block_11_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_11_depthwise_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_11_depthwise_BN", 0, 0, {}]]]}, {"name": "block_11_project", "class_name": "Conv2D", "config": {"name": "block_11_project", "trainable": true, "filters": 96, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_11_depthwise_relu", 0, 0, {}]]]}, {"name": "block_11_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_11_project_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_11_project", 0, 0, {}]]]}, {"name": "block_11_add", "class_name": "Add", "config": {"name": "block_11_add", "trainable": true}, "inbound_nodes": [[["block_10_project_BN", 0, 0, {}], ["block_11_project_BN", 0, 0, {}]]]}, {"name": "block_12_expand", "class_name": "Conv2D", "config": {"name": "block_12_expand", "trainable": true, "filters": 576, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_11_add", 0, 0, {}]]]}, {"name": "block_12_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_12_expand_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_12_expand", 0, 0, {}]]]}, {"name": "block_12_expand_relu", "class_name": "ReLU", "config": {"name": "block_12_expand_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_12_expand_BN", 0, 0, {}]]]}, {"name": "block_12_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_12_depthwise", "trainable": true, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_12_expand_relu", 0, 0, {}]]]}, {"name": "block_12_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_12_depthwise_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_12_depthwise", 0, 0, {}]]]}, {"name": "block_12_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_12_depthwise_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_12_depthwise_BN", 0, 0, {}]]]}, {"name": "block_12_project", "class_name": "Conv2D", "config": {"name": "block_12_project", "trainable": true, "filters": 96, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_12_depthwise_relu", 0, 0, {}]]]}, {"name": "block_12_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_12_project_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_12_project", 0, 0, {}]]]}, {"name": "block_12_add", "class_name": "Add", "config": {"name": "block_12_add", "trainable": true}, "inbound_nodes": [[["block_11_add", 0, 0, {}], ["block_12_project_BN", 0, 0, {}]]]}, {"name": "block_13_expand", "class_name": "Conv2D", "config": {"name": "block_13_expand", "trainable": true, "filters": 576, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_12_add", 0, 0, {}]]]}, {"name": "block_13_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_13_expand_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_13_expand", 0, 0, {}]]]}, {"name": "block_13_expand_relu", "class_name": "ReLU", "config": {"name": "block_13_expand_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_13_expand_BN", 0, 0, {}]]]}, {"name": "block_13_pad", "class_name": "ZeroPadding2D", "config": {"name": "block_13_pad", "trainable": true, "padding": [[0, 1], [0, 1]], "data_format": "channels_last"}, "inbound_nodes": [[["block_13_expand_relu", 0, 0, {}]]]}, {"name": "block_13_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_13_depthwise", "trainable": true, "kernel_size": [3, 3], "strides": [2, 2], "padding": "valid", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_13_pad", 0, 0, {}]]]}, {"name": "block_13_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_13_depthwise_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_13_depthwise", 0, 0, {}]]]}, {"name": "block_13_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_13_depthwise_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_13_depthwise_BN", 0, 0, {}]]]}, {"name": "block_13_project", "class_name": "Conv2D", "config": {"name": "block_13_project", "trainable": true, "filters": 160, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_13_depthwise_relu", 0, 0, {}]]]}, {"name": "block_13_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_13_project_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_13_project", 0, 0, {}]]]}, {"name": "block_14_expand", "class_name": "Conv2D", "config": {"name": "block_14_expand", "trainable": true, "filters": 960, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_13_project_BN", 0, 0, {}]]]}, {"name": "block_14_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_14_expand_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_14_expand", 0, 0, {}]]]}, {"name": "block_14_expand_relu", "class_name": "ReLU", "config": {"name": "block_14_expand_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_14_expand_BN", 0, 0, {}]]]}, {"name": "block_14_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_14_depthwise", "trainable": true, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_14_expand_relu", 0, 0, {}]]]}, {"name": "block_14_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_14_depthwise_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_14_depthwise", 0, 0, {}]]]}, {"name": "block_14_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_14_depthwise_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_14_depthwise_BN", 0, 0, {}]]]}, {"name": "block_14_project", "class_name": "Conv2D", "config": {"name": "block_14_project", "trainable": true, "filters": 160, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_14_depthwise_relu", 0, 0, {}]]]}, {"name": "block_14_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_14_project_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_14_project", 0, 0, {}]]]}, {"name": "block_14_add", "class_name": "Add", "config": {"name": "block_14_add", "trainable": true}, "inbound_nodes": [[["block_13_project_BN", 0, 0, {}], ["block_14_project_BN", 0, 0, {}]]]}, {"name": "block_15_expand", "class_name": "Conv2D", "config": {"name": "block_15_expand", "trainable": true, "filters": 960, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_14_add", 0, 0, {}]]]}, {"name": "block_15_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_15_expand_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_15_expand", 0, 0, {}]]]}, {"name": "block_15_expand_relu", "class_name": "ReLU", "config": {"name": "block_15_expand_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_15_expand_BN", 0, 0, {}]]]}, {"name": "block_15_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_15_depthwise", "trainable": true, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_15_expand_relu", 0, 0, {}]]]}, {"name": "block_15_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_15_depthwise_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_15_depthwise", 0, 0, {}]]]}, {"name": "block_15_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_15_depthwise_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_15_depthwise_BN", 0, 0, {}]]]}, {"name": "block_15_project", "class_name": "Conv2D", "config": {"name": "block_15_project", "trainable": true, "filters": 160, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_15_depthwise_relu", 0, 0, {}]]]}, {"name": "block_15_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_15_project_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_15_project", 0, 0, {}]]]}, {"name": "block_15_add", "class_name": "Add", "config": {"name": "block_15_add", "trainable": true}, "inbound_nodes": [[["block_14_add", 0, 0, {}], ["block_15_project_BN", 0, 0, {}]]]}, {"name": "block_16_expand", "class_name": "Conv2D", "config": {"name": "block_16_expand", "trainable": true, "filters": 960, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_15_add", 0, 0, {}]]]}, {"name": "block_16_expand_BN", "class_name": "BatchNormalization", "config": {"name": "block_16_expand_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_16_expand", 0, 0, {}]]]}, {"name": "block_16_expand_relu", "class_name": "ReLU", "config": {"name": "block_16_expand_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_16_expand_BN", 0, 0, {}]]]}, {"name": "block_16_depthwise", "class_name": "DepthwiseConv2D", "config": {"name": "block_16_depthwise", "trainable": true, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "activity_regularizer": null, "bias_constraint": null, "depth_multiplier": 1, "depthwise_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "depthwise_regularizer": null, "depthwise_constraint": null}, "inbound_nodes": [[["block_16_expand_relu", 0, 0, {}]]]}, {"name": "block_16_depthwise_BN", "class_name": "BatchNormalization", "config": {"name": "block_16_depthwise_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_16_depthwise", 0, 0, {}]]]}, {"name": "block_16_depthwise_relu", "class_name": "ReLU", "config": {"name": "block_16_depthwise_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["block_16_depthwise_BN", 0, 0, {}]]]}, {"name": "block_16_project", "class_name": "Conv2D", "config": {"name": "block_16_project", "trainable": true, "filters": 320, "kernel_size": [1, 1], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_16_depthwise_relu", 0, 0, {}]]]}, {"name": "block_16_project_BN", "class_name": "BatchNormalization", "config": {"name": "block_16_project_BN", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["block_16_project", 0, 0, {}]]]}, {"name": "Conv_1", "class_name": "Conv2D", "config": {"name": "Conv_1", "trainable": true, "filters": 1280, "kernel_size": [1, 1], "strides": [1, 1], "padding": "valid", "data_format": "channels_last", "dilation_rate": [1, 1], "activation": "linear", "use_bias": false, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["block_16_project_BN", 0, 0, {}]]]}, {"name": "Conv_1_bn", "class_name": "BatchNormalization", "config": {"name": "Conv_1_bn", "trainable": true, "axis": -1, "momentum": 0.999, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["Conv_1", 0, 0, {}]]]}, {"name": "out_relu", "class_name": "ReLU", "config": {"name": "out_relu", "trainable": true, "max_value": 6.0, "negative_slope": 0.0, "threshold": 0.0}, "inbound_nodes": [[["Conv_1_bn", 0, 0, {}]]]}, {"name": "average_pooling2d_1", "class_name": "AveragePooling2D", "config": {"name": "average_pooling2d_1", "trainable": true, "pool_size": [7, 7], "padding": "valid", "strides": [7, 7], "data_format": "channels_last"}, "inbound_nodes": [[["out_relu", 0, 0, {}]]]}, {"name": "flatten_1", "class_name": "Flatten", "config": {"name": "flatten_1", "trainable": true, "data_format": "channels_last"}, "inbound_nodes": [[["average_pooling2d_1", 0, 0, {}]]]}, {"name": "dense_1", "class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "units": 256, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": {"class_name": "L1L2", "config": {"l1": 0.0, "l2": 0.0005000000237487257}}, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["flatten_1", 0, 0, {}]]]}, {"name": "dropout_2", "class_name": "Dropout", "config": {"name": "dropout_2", "trainable": true, "rate": 0.5, "noise_shape": null, "seed": null}, "inbound_nodes": [[["dense_1", 0, 0, {}]]]}, {"name": "dense_2", "class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "units": 128, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 2.0, "mode": "fan_in", "distribution": "normal", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["dropout_2", 0, 0, {}]]]}, {"name": "dropout_3", "class_name": "Dropout", "config": {"name": "dropout_3", "trainable": true, "rate": 0.25, "noise_shape": null, "seed": null}, "inbound_nodes": [[["dense_2", 0, 0, {}]]]}, {"name": "dense_3", "class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "units": 5, "activation": "softmax", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["dropout_3", 0, 0, {}]]]}], "input_layers": [["input_1", 0, 0]], "output_layers": [["dense_3", 0, 0]]}}, "training_config": {"optimizer_config": {"class_name": "SGD", "config": {"lr": 8.999999749903509e-07, "momentum": 0.8999999761581421, "decay": 0.0, "nesterov": false}}, "loss": "categorical_crossentropy", "metrics": ["accuracy"], "sample_weight_mode": null, "loss_weights": null}}, "weightsManifest": [{"paths": ["group1-shard1of1"], "weights": [{"name": "Conv1/kernel", "shape": [3, 3, 3, 32], "dtype": "float32", "quantization": {"min": -0.87334511607301, "scale": 0.006666756611244351, "dtype": "uint8"}}, {"name": "Conv_1/kernel", "shape": [1, 1, 320, 1280], "dtype": "float32", "quantization": {"min": -0.16725910831900204, "scale": 0.0012671144569621367, "dtype": "uint8"}}, {"name": "Conv_1_bn/gamma", "shape": [1280], "dtype": "float32", "quantization": {"min": 4.058098316192627, "scale": 0.004296330844654757, "dtype": "uint8"}}, {"name": "Conv_1_bn/beta", "shape": [1280], "dtype": "float32", "quantization": {"min": -5.497056007385254, "scale": 0.007127556146359911, "dtype": "uint8"}}, {"name": "Conv_1_bn/moving_mean", "shape": [1280], "dtype": "float32", "quantization": {"min": -0.0023754353781102917, "scale": 1.963169733975448e-05, "dtype": "uint8"}}, {"name": "Conv_1_bn/moving_variance", "shape": [1280], "dtype": "float32", "quantization": {"min": 1.2001450061798096, "scale": 0.04519893702338724, "dtype": "uint8"}}, {"name": "block_10_depthwise/depthwise_kernel", "shape": [3, 3, 384, 1], "dtype": "float32", "quantization": {"min": -4.088800318100873, "scale": 0.03407333598417394, "dtype": "uint8"}}, {"name": "block_10_depthwise_BN/gamma", "shape": [384], "dtype": "float32", "quantization": {"min": 0.40248510241508484, "scale": 0.007302123541925468, "dtype": "uint8"}}, {"name": "block_10_depthwise_BN/beta", "shape": [384], "dtype": "float32", "quantization": {"min": -1.6703001022338868, "scale": 0.023198612531026206, "dtype": "uint8"}}, {"name": "block_10_depthwise_BN/moving_mean", "shape": [384], "dtype": "float32", "quantization": {"min": -10.684502940084421, "scale": 0.0632219108880735, "dtype": "uint8"}}, {"name": "block_10_depthwise_BN/moving_variance", "shape": [384], "dtype": "float32", "quantization": {"min": 0.22930045425891876, "scale": 0.08007498739981184, "dtype": "uint8"}}, {"name": "block_10_expand/kernel", "shape": [1, 1, 64, 384], "dtype": "float32", "quantization": {"min": -0.4983156303564708, "scale": 0.004187526305516561, "dtype": "uint8"}}, {"name": "block_10_expand_BN/gamma", "shape": [384], "dtype": "float32", "quantization": {"min": 0.3032448887825012, "scale": 0.006853209056106268, "dtype": "uint8"}}, {"name": "block_10_expand_BN/beta", "shape": [384], "dtype": "float32", "quantization": {"min": -1.9566102308385513, "scale": 0.016305085256987928, "dtype": "uint8"}}, {"name": "block_10_expand_BN/moving_mean", "shape": [384], "dtype": "float32", "quantization": {"min": -0.01945700193298798, "scale": 0.0001341862202275033, "dtype": "uint8"}}, {"name": "block_10_expand_BN/moving_variance", "shape": [384], "dtype": "float32", "quantization": {"min": 3.7177557945251465, "scale": 0.11230436773861156, "dtype": "uint8"}}, {"name": "block_10_project/kernel", "shape": [1, 1, 384, 96], "dtype": "float32", "quantization": {"min": -0.4085769327247844, "scale": 0.0036808732677908506, "dtype": "uint8"}}, {"name": "block_10_project_BN/gamma", "shape": [96], "dtype": "float32", "quantization": {"min": 1.8223402500152588, "scale": 0.010350557402068493, "dtype": "uint8"}}, {"name": "block_10_project_BN/beta", "shape": [96], "dtype": "float32", "quantization": {"min": -0.007311846215423999, "scale": 5.337114025856934e-05, "dtype": "uint8"}}, {"name": "block_10_project_BN/moving_mean", "shape": [96], "dtype": "float32", "quantization": {"min": -4.210502486135446, "scale": 0.028258405947217756, "dtype": "uint8"}}, {"name": "block_10_project_BN/moving_variance", "shape": [96], "dtype": "float32", "quantization": {"min": 0.7251929640769958, "scale": 0.03310593647115371, "dtype": "uint8"}}, {"name": "block_11_depthwise/depthwise_kernel", "shape": [3, 3, 576, 1], "dtype": "float32", "quantization": {"min": -3.1480287383584415, "scale": 0.02421560567968032, "dtype": "uint8"}}, {"name": "block_11_depthwise_BN/gamma", "shape": [576], "dtype": "float32", "quantization": {"min": 0.25000280141830444, "scale": 0.01196848200816734, "dtype": "uint8"}}, {"name": "block_11_depthwise_BN/beta", "shape": [576], "dtype": "float32", "quantization": {"min": -3.51122283000572, "scale": 0.024215329862108417, "dtype": "uint8"}}, {"name": "block_11_depthwise_BN/moving_mean", "shape": [576], "dtype": "float32", "quantization": {"min": -7.024682351654651, "scale": 0.04084117646310843, "dtype": "uint8"}}, {"name": "block_11_depthwise_BN/moving_variance", "shape": [576], "dtype": "float32", "quantization": {"min": 0.00013964888057671487, "scale": 0.050268485751938916, "dtype": "uint8"}}, {"name": "block_11_expand/kernel", "shape": [1, 1, 96, 576], "dtype": "float32", "quantization": {"min": -0.3371829879050161, "scale": 0.0025162909545150456, "dtype": "uint8"}}, {"name": "block_11_expand_BN/gamma", "shape": [576], "dtype": "float32", "quantization": {"min": 0.0032904082909226418, "scale": 0.011158546772511567, "dtype": "uint8"}}, {"name": "block_11_expand_BN/beta", "shape": [576], "dtype": "float32", "quantization": {"min": -1.68603814349455, "scale": 0.018733757149939443, "dtype": "uint8"}}, {"name": "block_11_expand_BN/moving_mean", "shape": [576], "dtype": "float32", "quantization": {"min": -0.003988752377164714, "scale": 2.9990619377178305e-05, "dtype": "uint8"}}, {"name": "block_11_expand_BN/moving_variance", "shape": [576], "dtype": "float32", "quantization": {"min": 1.7648493885920324e-14, "scale": 0.03621620103424664, "dtype": "uint8"}}, {"name": "block_11_project/kernel", "shape": [1, 1, 576, 96], "dtype": "float32", "quantization": {"min": -0.2600216061461206, "scale": 0.0020969484366622627, "dtype": "uint8"}}, {"name": "block_11_project_BN/gamma", "shape": [96], "dtype": "float32", "quantization": {"min": 0.5630056262016296, "scale": 0.008524748157052432, "dtype": "uint8"}}, {"name": "block_11_project_BN/beta", "shape": [96], "dtype": "float32", "quantization": {"min": -0.006553136140984647, "scale": 4.227829768377192e-05, "dtype": "uint8"}}, {"name": "block_11_project_BN/moving_mean", "shape": [96], "dtype": "float32", "quantization": {"min": -1.8660660654890773, "scale": 0.016226661439035454, "dtype": "uint8"}}, {"name": "block_11_project_BN/moving_variance", "shape": [96], "dtype": "float32", "quantization": {"min": 0.14689797163009644, "scale": 0.0020041888835383398, "dtype": "uint8"}}, {"name": "block_12_depthwise/depthwise_kernel", "shape": [3, 3, 576, 1], "dtype": "float32", "quantization": {"min": -3.0593730814316697, "scale": 0.02487295188155829, "dtype": "uint8"}}, {"name": "block_12_depthwise_BN/gamma", "shape": [576], "dtype": "float32", "quantization": {"min": 0.18331484496593475, "scale": 0.018403769299095752, "dtype": "uint8"}}, {"name": "block_12_depthwise_BN/beta", "shape": [576], "dtype": "float32", "quantization": {"min": -5.980123789170208, "scale": 0.03646416944615981, "dtype": "uint8"}}, {"name": "block_12_depthwise_BN/moving_mean", "shape": [576], "dtype": "float32", "quantization": {"min": -10.866527250701306, "scale": 0.05544146556480258, "dtype": "uint8"}}, {"name": "block_12_depthwise_BN/moving_variance", "shape": [576], "dtype": "float32", "quantization": {"min": 0.00022924139921087772, "scale": 0.03855800487656904, "dtype": "uint8"}}, {"name": "block_12_expand/kernel", "shape": [1, 1, 96, 576], "dtype": "float32", "quantization": {"min": -0.25110526645884795, "scale": 0.0020925438871570662, "dtype": "uint8"}}, {"name": "block_12_expand_BN/gamma", "shape": [576], "dtype": "float32", "quantization": {"min": 0.21571911871433258, "scale": 0.010054528888534097, "dtype": "uint8"}}, {"name": "block_12_expand_BN/beta", "shape": [576], "dtype": "float32", "quantization": {"min": -1.9130254502389943, "scale": 0.016491598708956848, "dtype": "uint8"}}, {"name": "block_12_expand_BN/moving_mean", "shape": [576], "dtype": "float32", "quantization": {"min": -0.006275338518853281, "scale": 4.9026082178541256e-05, "dtype": "uint8"}}, {"name": "block_12_expand_BN/moving_variance", "shape": [576], "dtype": "float32", "quantization": {"min": 1.4346864223480225, "scale": 0.058915868459963334, "dtype": "uint8"}}, {"name": "block_12_project/kernel", "shape": [1, 1, 576, 96], "dtype": "float32", "quantization": {"min": -0.49135843445273003, "scale": 0.0032977076137767117, "dtype": "uint8"}}, {"name": "block_12_project_BN/gamma", "shape": [96], "dtype": "float32", "quantization": {"min": 0.721093475818634, "scale": 0.013475235536986705, "dtype": "uint8"}}, {"name": "block_12_project_BN/beta", "shape": [96], "dtype": "float32", "quantization": {"min": -0.005543093726623292, "scale": 3.95935266187378e-05, "dtype": "uint8"}}, {"name": "block_12_project_BN/moving_mean", "shape": [96], "dtype": "float32", "quantization": {"min": -1.9206050424014822, "scale": 0.01333753501667696, "dtype": "uint8"}}, {"name": "block_12_project_BN/moving_variance", "shape": [96], "dtype": "float32", "quantization": {"min": 0.10041400790214539, "scale": 0.0021526618331086404, "dtype": "uint8"}}, {"name": "block_13_depthwise/depthwise_kernel", "shape": [3, 3, 576, 1], "dtype": "float32", "quantization": {"min": -1.4754528438343721, "scale": 0.011177673059351304, "dtype": "uint8"}}, {"name": "block_13_depthwise_BN/gamma", "shape": [576], "dtype": "float32", "quantization": {"min": 0.350769579410553, "scale": 0.005496745249804328, "dtype": "uint8"}}, {"name": "block_13_depthwise_BN/beta", "shape": [576], "dtype": "float32", "quantization": {"min": -2.24450935569464, "scale": 0.027042281393911325, "dtype": "uint8"}}, {"name": "block_13_depthwise_BN/moving_mean", "shape": [576], "dtype": "float32", "quantization": {"min": -7.984861721712, "scale": 0.04810157663681928, "dtype": "uint8"}}, {"name": "block_13_depthwise_BN/moving_variance", "shape": [576], "dtype": "float32", "quantization": {"min": 0.010228983126580715, "scale": 0.06980591618328118, "dtype": "uint8"}}, {"name": "block_13_expand/kernel", "shape": [1, 1, 96, 576], "dtype": "float32", "quantization": {"min": -0.4197306464700138, "scale": 0.0033311956069048713, "dtype": "uint8"}}, {"name": "block_13_expand_BN/gamma", "shape": [576], "dtype": "float32", "quantization": {"min": 0.06031922623515129, "scale": 0.007420331195873373, "dtype": "uint8"}}, {"name": "block_13_expand_BN/beta", "shape": [576], "dtype": "float32", "quantization": {"min": -2.7976019186132093, "scale": 0.019701421962064855, "dtype": "uint8"}}, {"name": "block_13_expand_BN/moving_mean", "shape": [576], "dtype": "float32", "quantization": {"min": -0.013370727481064843, "scale": 9.350159077667722e-05, "dtype": "uint8"}}, {"name": "block_13_expand_BN/moving_variance", "shape": [576], "dtype": "float32", "quantization": {"min": 1.3005495071411133, "scale": 0.10002251793356502, "dtype": "uint8"}}, {"name": "block_13_project/kernel", "shape": [1, 1, 576, 160], "dtype": "float32", "quantization": {"min": -0.37188173567547517, "scale": 0.002928202643113978, "dtype": "uint8"}}, {"name": "block_13_project_BN/gamma", "shape": [160], "dtype": "float32", "quantization": {"min": 1.550618290901184, "scale": 0.005993789317561131, "dtype": "uint8"}}, {"name": "block_13_project_BN/beta", "shape": [160], "dtype": "float32", "quantization": {"min": -0.005035641438820782, "scale": 4.577855853473439e-05, "dtype": "uint8"}}, {"name": "block_13_project_BN/moving_mean", "shape": [160], "dtype": "float32", "quantization": {"min": -6.040092789893057, "scale": 0.04507531932756013, "dtype": "uint8"}}, {"name": "block_13_project_BN/moving_variance", "shape": [160], "dtype": "float32", "quantization": {"min": 0.38076847791671753, "scale": 0.009339294480342491, "dtype": "uint8"}}, {"name": "block_14_depthwise/depthwise_kernel", "shape": [3, 3, 960, 1], "dtype": "float32", "quantization": {"min": -3.8016654528823555, "scale": 0.026585073097079408, "dtype": "uint8"}}, {"name": "block_14_depthwise_BN/gamma", "shape": [960], "dtype": "float32", "quantization": {"min": 0.2858554720878601, "scale": 0.01798316474054374, "dtype": "uint8"}}, {"name": "block_14_depthwise_BN/beta", "shape": [960], "dtype": "float32", "quantization": {"min": -5.42720035945668, "scale": 0.032892123390646545, "dtype": "uint8"}}, {"name": "block_14_depthwise_BN/moving_mean", "shape": [960], "dtype": "float32", "quantization": {"min": -6.137411499023437, "scale": 0.04870961507161458, "dtype": "uint8"}}, {"name": "block_14_depthwise_BN/moving_variance", "shape": [960], "dtype": "float32", "quantization": {"min": 3.2535186619497836e-05, "scale": 0.10036481178277766, "dtype": "uint8"}}, {"name": "block_14_expand/kernel", "shape": [1, 1, 160, 960], "dtype": "float32", "quantization": {"min": -0.3070852241095374, "scale": 0.0023805056132522283, "dtype": "uint8"}}, {"name": "block_14_expand_BN/gamma", "shape": [960], "dtype": "float32", "quantization": {"min": 0.2994632422924042, "scale": 0.008773572889028811, "dtype": "uint8"}}, {"name": "block_14_expand_BN/beta", "shape": [960], "dtype": "float32", "quantization": {"min": -1.8759665405049042, "scale": 0.01589802152970258, "dtype": "uint8"}}, {"name": "block_14_expand_BN/moving_mean", "shape": [960], "dtype": "float32", "quantization": {"min": -0.003465659838790695, "scale": 2.9123191922610883e-05, "dtype": "uint8"}}, {"name": "block_14_expand_BN/moving_variance", "shape": [960], "dtype": "float32", "quantization": {"min": 0.6711487770080566, "scale": 0.03398493411494236, "dtype": "uint8"}}, {"name": "block_14_project/kernel", "shape": [1, 1, 960, 160], "dtype": "float32", "quantization": {"min": -0.34923891810809865, "scale": 0.002328259454053991, "dtype": "uint8"}}, {"name": "block_14_project_BN/gamma", "shape": [160], "dtype": "float32", "quantization": {"min": 0.820835530757904, "scale": 0.007008622908124737, "dtype": "uint8"}}, {"name": "block_14_project_BN/beta", "shape": [160], "dtype": "float32", "quantization": {"min": -0.003992707589093376, "scale": 3.1193028039792e-05, "dtype": "uint8"}}, {"name": "block_14_project_BN/moving_mean", "shape": [160], "dtype": "float32", "quantization": {"min": -2.1882847701801973, "scale": 0.01585713601579853, "dtype": "uint8"}}, {"name": "block_14_project_BN/moving_variance", "shape": [160], "dtype": "float32", "quantization": {"min": 0.22255808115005493, "scale": 0.0026917350058462105, "dtype": "uint8"}}, {"name": "block_15_depthwise/depthwise_kernel", "shape": [3, 3, 960, 1], "dtype": "float32", "quantization": {"min": -3.787860099007102, "scale": 0.02848015112035415, "dtype": "uint8"}}, {"name": "block_15_depthwise_BN/gamma", "shape": [960], "dtype": "float32", "quantization": {"min": 0.08640849590301514, "scale": 0.01727106851689956, "dtype": "uint8"}}, {"name": "block_15_depthwise_BN/beta", "shape": [960], "dtype": "float32", "quantization": {"min": -6.166259084963331, "scale": 0.03585034351722867, "dtype": "uint8"}}, {"name": "block_15_depthwise_BN/moving_mean", "shape": [960], "dtype": "float32", "quantization": {"min": -15.027781598708208, "scale": 0.0910774642345952, "dtype": "uint8"}}, {"name": "block_15_depthwise_BN/moving_variance", "shape": [960], "dtype": "float32", "quantization": {"min": 1.0875285170186544e-06, "scale": 0.09568451099636488, "dtype": "uint8"}}, {"name": "block_15_expand/kernel", "shape": [1, 1, 160, 960], "dtype": "float32", "quantization": {"min": -0.2951788762036492, "scale": 0.0024598239683637432, "dtype": "uint8"}}, {"name": "block_15_expand_BN/gamma", "shape": [960], "dtype": "float32", "quantization": {"min": 0.16954641044139862, "scale": 0.010391918642848146, "dtype": "uint8"}}, {"name": "block_15_expand_BN/beta", "shape": [960], "dtype": "float32", "quantization": {"min": -2.0732759391560274, "scale": 0.018347574682796703, "dtype": "uint8"}}, {"name": "block_15_expand_BN/moving_mean", "shape": [960], "dtype": "float32", "quantization": {"min": -0.005657272238065215, "scale": 4.7942985068349274e-05, "dtype": "uint8"}}, {"name": "block_15_expand_BN/moving_variance", "shape": [960], "dtype": "float32", "quantization": {"min": 0.984294056892395, "scale": 0.2563706823423797, "dtype": "uint8"}}, {"name": "block_15_project/kernel", "shape": [1, 1, 960, 160], "dtype": "float32", "quantization": {"min": -0.4387097349353865, "scale": 0.0033489292743159277, "dtype": "uint8"}}, {"name": "block_15_project_BN/gamma", "shape": [160], "dtype": "float32", "quantization": {"min": 1.2517534494400024, "scale": 0.010856366157531739, "dtype": "uint8"}}, {"name": "block_15_project_BN/beta", "shape": [160], "dtype": "float32", "quantization": {"min": -0.00269769683261128, "scale": 2.0132065915009555e-05, "dtype": "uint8"}}, {"name": "block_15_project_BN/moving_mean", "shape": [160], "dtype": "float32", "quantization": {"min": -2.2665801300722013, "scale": 0.014078137453864603, "dtype": "uint8"}}, {"name": "block_15_project_BN/moving_variance", "shape": [160], "dtype": "float32", "quantization": {"min": 0.059768594801425934, "scale": 0.001256188078253877, "dtype": "uint8"}}, {"name": "block_16_depthwise/depthwise_kernel", "shape": [3, 3, 960, 1], "dtype": "float32", "quantization": {"min": -2.8038849550134994, "scale": 0.02336570795844583, "dtype": "uint8"}}, {"name": "block_16_depthwise_BN/gamma", "shape": [960], "dtype": "float32", "quantization": {"min": 0.4405687749385834, "scale": 0.011913974261751363, "dtype": "uint8"}}, {"name": "block_16_depthwise_BN/beta", "shape": [960], "dtype": "float32", "quantization": {"min": -3.7257910148770206, "scale": 0.03239818273806105, "dtype": "uint8"}}, {"name": "block_16_depthwise_BN/moving_mean", "shape": [960], "dtype": "float32", "quantization": {"min": -5.307021010155771, "scale": 0.03423884522681143, "dtype": "uint8"}}, {"name": "block_16_depthwise_BN/moving_variance", "shape": [960], "dtype": "float32", "quantization": {"min": 7.858918706915574e-07, "scale": 0.22784748143189615, "dtype": "uint8"}}, {"name": "block_16_expand/kernel", "shape": [1, 1, 160, 960], "dtype": "float32", "quantization": {"min": -0.38862050584718294, "scale": 0.0032117397177453136, "dtype": "uint8"}}, {"name": "block_16_expand_BN/gamma", "shape": [960], "dtype": "float32", "quantization": {"min": 0.27079182863235474, "scale": 0.013339150886909635, "dtype": "uint8"}}, {"name": "block_16_expand_BN/beta", "shape": [960], "dtype": "float32", "quantization": {"min": -1.8340444209528906, "scale": 0.015542749330109242, "dtype": "uint8"}}, {"name": "block_16_expand_BN/moving_mean", "shape": [960], "dtype": "float32", "quantization": {"min": -0.007079307767836487, "scale": 7.779459085534601e-05, "dtype": "uint8"}}, {"name": "block_16_expand_BN/moving_variance", "shape": [960], "dtype": "float32", "quantization": {"min": 1.8959892988204956, "scale": 0.26395472778993495, "dtype": "uint8"}}, {"name": "block_16_project/kernel", "shape": [1, 1, 960, 320], "dtype": "float32", "quantization": {"min": -0.5272602123372695, "scale": 0.004184604859819599, "dtype": "uint8"}}, {"name": "block_16_project_BN/gamma", "shape": [320], "dtype": "float32", "quantization": {"min": 1.737635612487793, "scale": 0.007401946946686389, "dtype": "uint8"}}, {"name": "block_16_project_BN/beta", "shape": [320], "dtype": "float32", "quantization": {"min": -0.0022203737532026043, "scale": 2.037040140552848e-05, "dtype": "uint8"}}, {"name": "block_16_project_BN/moving_mean", "shape": [320], "dtype": "float32", "quantization": {"min": -6.317516297920077, "scale": 0.04023895731159285, "dtype": "uint8"}}, {"name": "block_16_project_BN/moving_variance", "shape": [320], "dtype": "float32", "quantization": {"min": 0.4311196208000183, "scale": 0.035004029788222965, "dtype": "uint8"}}, {"name": "block_1_depthwise/depthwise_kernel", "shape": [3, 3, 96, 1], "dtype": "float32", "quantization": {"min": -3.070943791258569, "scale": 0.02537970075420305, "dtype": "uint8"}}, {"name": "block_1_depthwise_BN/gamma", "shape": [96], "dtype": "float32", "quantization": {"min": 0.4857683479785919, "scale": 0.011590205804974425, "dtype": "uint8"}}, {"name": "block_1_depthwise_BN/beta", "shape": [96], "dtype": "float32", "quantization": {"min": -4.136155797920975, "scale": 0.034183105767941944, "dtype": "uint8"}}, {"name": "block_1_depthwise_BN/moving_mean", "shape": [96], "dtype": "float32", "quantization": {"min": -28.937354689953374, "scale": 0.26548031825645296, "dtype": "uint8"}}, {"name": "block_1_depthwise_BN/moving_variance", "shape": [96], "dtype": "float32", "quantization": {"min": 0.04768875613808632, "scale": 0.8554738763354572, "dtype": "uint8"}}, {"name": "block_1_expand/kernel", "shape": [1, 1, 16, 96], "dtype": "float32", "quantization": {"min": -1.2957038131414675, "scale": 0.008098148832134172, "dtype": "uint8"}}, {"name": "block_1_expand_BN/gamma", "shape": [96], "dtype": "float32", "quantization": {"min": 0.2122029960155487, "scale": 0.03750847472864039, "dtype": "uint8"}}, {"name": "block_1_expand_BN/beta", "shape": [96], "dtype": "float32", "quantization": {"min": -2.2824947160833022, "scale": 0.028178947112139533, "dtype": "uint8"}}, {"name": "block_1_expand_BN/moving_mean", "shape": [96], "dtype": "float32", "quantization": {"min": -0.056052549300240534, "scale": 0.00041830260671821295, "dtype": "uint8"}}, {"name": "block_1_expand_BN/moving_variance", "shape": [96], "dtype": "float32", "quantization": {"min": 1.6280046701431274, "scale": 0.10497297165440578, "dtype": "uint8"}}, {"name": "block_1_project/kernel", "shape": [1, 1, 96, 24], "dtype": "float32", "quantization": {"min": -1.3319599740645465, "scale": 0.008121707158930161, "dtype": "uint8"}}, {"name": "block_1_project_BN/gamma", "shape": [24], "dtype": "float32", "quantization": {"min": 1.9806559085845947, "scale": 0.013070227118099437, "dtype": "uint8"}}, {"name": "block_1_project_BN/beta", "shape": [24], "dtype": "float32", "quantization": {"min": -0.010182667633189875, "scale": 8.081482248563392e-05, "dtype": "uint8"}}, {"name": "block_1_project_BN/moving_mean", "shape": [24], "dtype": "float32", "quantization": {"min": -5.945862329707427, "scale": 0.03693082192364861, "dtype": "uint8"}}, {"name": "block_1_project_BN/moving_variance", "shape": [24], "dtype": "float32", "quantization": {"min": 0.37005844712257385, "scale": 0.015794806737525792, "dtype": "uint8"}}, {"name": "block_2_depthwise/depthwise_kernel", "shape": [3, 3, 144, 1], "dtype": "float32", "quantization": {"min": -7.181409458085602, "scale": 0.05886401195152133, "dtype": "uint8"}}, {"name": "block_2_depthwise_BN/gamma", "shape": [144], "dtype": "float32", "quantization": {"min": 0.40984275937080383, "scale": 0.008265640104518216, "dtype": "uint8"}}, {"name": "block_2_depthwise_BN/beta", "shape": [144], "dtype": "float32", "quantization": {"min": -3.2851701624253216, "scale": 0.034220522525263766, "dtype": "uint8"}}, {"name": "block_2_depthwise_BN/moving_mean", "shape": [144], "dtype": "float32", "quantization": {"min": -11.277414492064832, "scale": 0.05843219944075042, "dtype": "uint8"}}, {"name": "block_2_depthwise_BN/moving_variance", "shape": [144], "dtype": "float32", "quantization": {"min": -0.0, "scale": 0.1796044293571921, "dtype": "uint8"}}, {"name": "block_2_expand/kernel", "shape": [1, 1, 24, 144], "dtype": "float32", "quantization": {"min": -0.596191698663375, "scale": 0.004621641074909883, "dtype": "uint8"}}, {"name": "block_2_expand_BN/gamma", "shape": [144], "dtype": "float32", "quantization": {"min": 0.1913505643606186, "scale": 0.01640206651360381, "dtype": "uint8"}}, {"name": "block_2_expand_BN/beta", "shape": [144], "dtype": "float32", "quantization": {"min": -2.538083179324281, "scale": 0.028517788531733493, "dtype": "uint8"}}, {"name": "block_2_expand_BN/moving_mean", "shape": [144], "dtype": "float32", "quantization": {"min": -0.00857109451556907, "scale": 6.968369524852903e-05, "dtype": "uint8"}}, {"name": "block_2_expand_BN/moving_variance", "shape": [144], "dtype": "float32", "quantization": {"min": 1.5163608506781247e-34, "scale": 0.17690577787511488, "dtype": "uint8"}}, {"name": "block_2_project/kernel", "shape": [1, 1, 144, 24], "dtype": "float32", "quantization": {"min": -0.4962309951875724, "scale": 0.005063581583546657, "dtype": "uint8"}}, {"name": "block_2_project_BN/gamma", "shape": [24], "dtype": "float32", "quantization": {"min": 1.5146973133087158, "scale": 0.02459877519046559, "dtype": "uint8"}}, {"name": "block_2_project_BN/beta", "shape": [24], "dtype": "float32", "quantization": {"min": -0.006625267572920112, "scale": 5.662621857196677e-05, "dtype": "uint8"}}, {"name": "block_2_project_BN/moving_mean", "shape": [24], "dtype": "float32", "quantization": {"min": -4.26975632835837, "scale": 0.041453944935518156, "dtype": "uint8"}}, {"name": "block_2_project_BN/moving_variance", "shape": [24], "dtype": "float32", "quantization": {"min": 0.667578399181366, "scale": 0.012379103314642812, "dtype": "uint8"}}, {"name": "block_3_depthwise/depthwise_kernel", "shape": [3, 3, 144, 1], "dtype": "float32", "quantization": {"min": -2.280805359634699, "scale": 0.017959097319958258, "dtype": "uint8"}}, {"name": "block_3_depthwise_BN/gamma", "shape": [144], "dtype": "float32", "quantization": {"min": 0.38231614232063293, "scale": 0.011584419245813406, "dtype": "uint8"}}, {"name": "block_3_depthwise_BN/beta", "shape": [144], "dtype": "float32", "quantization": {"min": -2.7828902637257293, "scale": 0.030921002930285883, "dtype": "uint8"}}, {"name": "block_3_depthwise_BN/moving_mean", "shape": [144], "dtype": "float32", "quantization": {"min": -28.649707906386432, "scale": 0.18483682520249312, "dtype": "uint8"}}, {"name": "block_3_depthwise_BN/moving_variance", "shape": [144], "dtype": "float32", "quantization": {"min": 0.18932129442691803, "scale": 0.38042693132278965, "dtype": "uint8"}}, {"name": "block_3_expand/kernel", "shape": [1, 1, 24, 144], "dtype": "float32", "quantization": {"min": -1.118310601571027, "scale": 0.008103700011384253, "dtype": "uint8"}}, {"name": "block_3_expand_BN/gamma", "shape": [144], "dtype": "float32", "quantization": {"min": 0.2990524172782898, "scale": 0.013908624882791557, "dtype": "uint8"}}, {"name": "block_3_expand_BN/beta", "shape": [144], "dtype": "float32", "quantization": {"min": -2.3489304075054096, "scale": 0.024988621356440525, "dtype": "uint8"}}, {"name": "block_3_expand_BN/moving_mean", "shape": [144], "dtype": "float32", "quantization": {"min": -0.010190908223682758, "scale": 8.353203462035048e-05, "dtype": "uint8"}}, {"name": "block_3_expand_BN/moving_variance", "shape": [144], "dtype": "float32", "quantization": {"min": 3.8810181617736816, "scale": 0.2802370613696528, "dtype": "uint8"}}, {"name": "block_3_project/kernel", "shape": [1, 1, 144, 32], "dtype": "float32", "quantization": {"min": -0.7998786091804505, "scale": 0.0068365693092346195, "dtype": "uint8"}}, {"name": "block_3_project_BN/gamma", "shape": [32], "dtype": "float32", "quantization": {"min": 2.4770939350128174, "scale": 0.01675523215649175, "dtype": "uint8"}}, {"name": "block_3_project_BN/beta", "shape": [32], "dtype": "float32", "quantization": {"min": -0.005942130622033979, "scale": 5.8832976455781976e-05, "dtype": "uint8"}}, {"name": "block_3_project_BN/moving_mean", "shape": [32], "dtype": "float32", "quantization": {"min": -3.650315753151389, "scale": 0.04195765233507343, "dtype": "uint8"}}, {"name": "block_3_project_BN/moving_variance", "shape": [32], "dtype": "float32", "quantization": {"min": 0.7385707497596741, "scale": 0.037899703371758554, "dtype": "uint8"}}, {"name": "block_4_depthwise/depthwise_kernel", "shape": [3, 3, 192, 1], "dtype": "float32", "quantization": {"min": -4.985755969028847, "scale": 0.0372071340972302, "dtype": "uint8"}}, {"name": "block_4_depthwise_BN/gamma", "shape": [192], "dtype": "float32", "quantization": {"min": 0.3745843470096588, "scale": 0.009330581566866706, "dtype": "uint8"}}, {"name": "block_4_depthwise_BN/beta", "shape": [192], "dtype": "float32", "quantization": {"min": -2.906554125804527, "scale": 0.024021108477723364, "dtype": "uint8"}}, {"name": "block_4_depthwise_BN/moving_mean", "shape": [192], "dtype": "float32", "quantization": {"min": -5.352850296918083, "scale": 0.044607085807650694, "dtype": "uint8"}}, {"name": "block_4_depthwise_BN/moving_variance", "shape": [192], "dtype": "float32", "quantization": {"min": 0.03507642820477486, "scale": 0.04683735304895569, "dtype": "uint8"}}, {"name": "block_4_expand/kernel", "shape": [1, 1, 32, 192], "dtype": "float32", "quantization": {"min": -0.40418717720929315, "scale": 0.0030620240697673724, "dtype": "uint8"}}, {"name": "block_4_expand_BN/gamma", "shape": [192], "dtype": "float32", "quantization": {"min": 0.167377769947052, "scale": 0.007529168736700918, "dtype": "uint8"}}, {"name": "block_4_expand_BN/beta", "shape": [192], "dtype": "float32", "quantization": {"min": -2.5541455465204574, "scale": 0.022209961274090934, "dtype": "uint8"}}, {"name": "block_4_expand_BN/moving_mean", "shape": [192], "dtype": "float32", "quantization": {"min": -0.004339029848137323, "scale": 3.099307034383802e-05, "dtype": "uint8"}}, {"name": "block_4_expand_BN/moving_variance", "shape": [192], "dtype": "float32", "quantization": {"min": 1.8437719345092773, "scale": 0.10860272201837277, "dtype": "uint8"}}, {"name": "block_4_project/kernel", "shape": [1, 1, 192, 32], "dtype": "float32", "quantization": {"min": -0.5263700140457528, "scale": 0.003630138027901743, "dtype": "uint8"}}, {"name": "block_4_project_BN/gamma", "shape": [32], "dtype": "float32", "quantization": {"min": 0.9728992581367493, "scale": 0.01992112959132475, "dtype": "uint8"}}, {"name": "block_4_project_BN/beta", "shape": [32], "dtype": "float32", "quantization": {"min": -0.006176024123880209, "scale": 4.863011121165519e-05, "dtype": "uint8"}}, {"name": "block_4_project_BN/moving_mean", "shape": [32], "dtype": "float32", "quantization": {"min": -2.7950704770929673, "scale": 0.020401974285350125, "dtype": "uint8"}}, {"name": "block_4_project_BN/moving_variance", "shape": [32], "dtype": "float32", "quantization": {"min": 0.2692086398601532, "scale": 0.004634153726054173, "dtype": "uint8"}}, {"name": "block_5_depthwise/depthwise_kernel", "shape": [3, 3, 192, 1], "dtype": "float32", "quantization": {"min": -4.52747631259993, "scale": 0.03257177203309302, "dtype": "uint8"}}, {"name": "block_5_depthwise_BN/gamma", "shape": [192], "dtype": "float32", "quantization": {"min": 0.4237539768218994, "scale": 0.008437786850274779, "dtype": "uint8"}}, {"name": "block_5_depthwise_BN/beta", "shape": [192], "dtype": "float32", "quantization": {"min": -2.8744141410378847, "scale": 0.023369220658844593, "dtype": "uint8"}}, {"name": "block_5_depthwise_BN/moving_mean", "shape": [192], "dtype": "float32", "quantization": {"min": -18.298168743357937, "scale": 0.10456096424775965, "dtype": "uint8"}}, {"name": "block_5_depthwise_BN/moving_variance", "shape": [192], "dtype": "float32", "quantization": {"min": 0.040692880749702454, "scale": 0.04720107591619679, "dtype": "uint8"}}, {"name": "block_5_expand/kernel", "shape": [1, 1, 32, 192], "dtype": "float32", "quantization": {"min": -0.36168030208232355, "scale": 0.0032007106378966685, "dtype": "uint8"}}, {"name": "block_5_expand_BN/gamma", "shape": [192], "dtype": "float32", "quantization": {"min": 0.1293688714504242, "scale": 0.007221938231412102, "dtype": "uint8"}}, {"name": "block_5_expand_BN/beta", "shape": [192], "dtype": "float32", "quantization": {"min": -1.6064272095175351, "scale": 0.019124133446637322, "dtype": "uint8"}}, {"name": "block_5_expand_BN/moving_mean", "shape": [192], "dtype": "float32", "quantization": {"min": -0.006665974828031132, "scale": 6.733307907102154e-05, "dtype": "uint8"}}, {"name": "block_5_expand_BN/moving_variance", "shape": [192], "dtype": "float32", "quantization": {"min": 2.6557254791259766, "scale": 0.08463248458563112, "dtype": "uint8"}}, {"name": "block_5_project/kernel", "shape": [1, 1, 192, 32], "dtype": "float32", "quantization": {"min": -0.4291310926278432, "scale": 0.00354653795560201, "dtype": "uint8"}}, {"name": "block_5_project_BN/gamma", "shape": [32], "dtype": "float32", "quantization": {"min": 0.9242632985115051, "scale": 0.018858166068207984, "dtype": "uint8"}}, {"name": "block_5_project_BN/beta", "shape": [32], "dtype": "float32", "quantization": {"min": -0.005500635230804191, "scale": 4.3655835165112626e-05, "dtype": "uint8"}}, {"name": "block_5_project_BN/moving_mean", "shape": [32], "dtype": "float32", "quantization": {"min": -2.1954680022071393, "scale": 0.018764683779548198, "dtype": "uint8"}}, {"name": "block_5_project_BN/moving_variance", "shape": [32], "dtype": "float32", "quantization": {"min": 0.2067245990037918, "scale": 0.0037080140090456197, "dtype": "uint8"}}, {"name": "block_6_depthwise/depthwise_kernel", "shape": [3, 3, 192, 1], "dtype": "float32", "quantization": {"min": -1.9960154365090763, "scale": 0.01663346197090897, "dtype": "uint8"}}, {"name": "block_6_depthwise_BN/gamma", "shape": [192], "dtype": "float32", "quantization": {"min": 0.4712669849395752, "scale": 0.006421379014557483, "dtype": "uint8"}}, {"name": "block_6_depthwise_BN/beta", "shape": [192], "dtype": "float32", "quantization": {"min": -1.4898768144495347, "scale": 0.02613818972718482, "dtype": "uint8"}}, {"name": "block_6_depthwise_BN/moving_mean", "shape": [192], "dtype": "float32", "quantization": {"min": -15.621279009650735, "scale": 0.12109518612132353, "dtype": "uint8"}}, {"name": "block_6_depthwise_BN/moving_variance", "shape": [192], "dtype": "float32", "quantization": {"min": 0.0683574229478836, "scale": 0.28740606138519215, "dtype": "uint8"}}, {"name": "block_6_expand/kernel", "shape": [1, 1, 32, 192], "dtype": "float32", "quantization": {"min": -0.6843907033695894, "scale": 0.005609759863685159, "dtype": "uint8"}}, {"name": "block_6_expand_BN/gamma", "shape": [192], "dtype": "float32", "quantization": {"min": 0.4731082618236542, "scale": 0.009170516448862413, "dtype": "uint8"}}, {"name": "block_6_expand_BN/beta", "shape": [192], "dtype": "float32", "quantization": {"min": -1.8309699773788453, "scale": 0.015386302330914666, "dtype": "uint8"}}, {"name": "block_6_expand_BN/moving_mean", "shape": [192], "dtype": "float32", "quantization": {"min": -0.016153413539423664, "scale": 0.00014169660999494441, "dtype": "uint8"}}, {"name": "block_6_expand_BN/moving_variance", "shape": [192], "dtype": "float32", "quantization": {"min": 5.0375471115112305, "scale": 0.1423933328366747, "dtype": "uint8"}}, {"name": "block_6_project/kernel", "shape": [1, 1, 192, 64], "dtype": "float32", "quantization": {"min": -0.9496052826152128, "scale": 0.006330701884101419, "dtype": "uint8"}}, {"name": "block_6_project_BN/gamma", "shape": [64], "dtype": "float32", "quantization": {"min": 0.8319648504257202, "scale": 0.02171465789570528, "dtype": "uint8"}}, {"name": "block_6_project_BN/beta", "shape": [64], "dtype": "float32", "quantization": {"min": -0.005802899913168421, "scale": 4.363082641480016e-05, "dtype": "uint8"}}, {"name": "block_6_project_BN/moving_mean", "shape": [64], "dtype": "float32", "quantization": {"min": -5.993951730167165, "scale": 0.04473098306094899, "dtype": "uint8"}}, {"name": "block_6_project_BN/moving_variance", "shape": [64], "dtype": "float32", "quantization": {"min": 0.4466089904308319, "scale": 0.05287521037400938, "dtype": "uint8"}}, {"name": "block_7_depthwise/depthwise_kernel", "shape": [3, 3, 384, 1], "dtype": "float32", "quantization": {"min": -3.3044106876148898, "scale": 0.022947296441770067, "dtype": "uint8"}}, {"name": "block_7_depthwise_BN/gamma", "shape": [384], "dtype": "float32", "quantization": {"min": 0.23756937682628632, "scale": 0.009583088755607604, "dtype": "uint8"}}, {"name": "block_7_depthwise_BN/beta", "shape": [384], "dtype": "float32", "quantization": {"min": -3.6187023807974423, "scale": 0.021162002226885628, "dtype": "uint8"}}, {"name": "block_7_depthwise_BN/moving_mean", "shape": [384], "dtype": "float32", "quantization": {"min": -21.42839676913093, "scale": 0.09439822365255916, "dtype": "uint8"}}, {"name": "block_7_depthwise_BN/moving_variance", "shape": [384], "dtype": "float32", "quantization": {"min": 0.0010467394022271037, "scale": 0.05028138783093834, "dtype": "uint8"}}, {"name": "block_7_expand/kernel", "shape": [1, 1, 64, 384], "dtype": "float32", "quantization": {"min": -0.367723983409358, "scale": 0.0027442088314131195, "dtype": "uint8"}}, {"name": "block_7_expand_BN/gamma", "shape": [384], "dtype": "float32", "quantization": {"min": 0.11244644224643707, "scale": 0.005810386000895033, "dtype": "uint8"}}, {"name": "block_7_expand_BN/beta", "shape": [384], "dtype": "float32", "quantization": {"min": -1.5284377168206607, "scale": 0.019347312871147604, "dtype": "uint8"}}, {"name": "block_7_expand_BN/moving_mean", "shape": [384], "dtype": "float32", "quantization": {"min": -0.0030003727450236386, "scale": 2.542688766969185e-05, "dtype": "uint8"}}, {"name": "block_7_expand_BN/moving_variance", "shape": [384], "dtype": "float32", "quantization": {"min": 1.0071969032287598, "scale": 0.036530892989214726, "dtype": "uint8"}}, {"name": "block_7_project/kernel", "shape": [1, 1, 384, 64], "dtype": "float32", "quantization": {"min": -0.4649557908376058, "scale": 0.003907191519643746, "dtype": "uint8"}}, {"name": "block_7_project_BN/gamma", "shape": [64], "dtype": "float32", "quantization": {"min": 0.5764568448066711, "scale": 0.02033467830396166, "dtype": "uint8"}}, {"name": "block_7_project_BN/beta", "shape": [64], "dtype": "float32", "quantization": {"min": -0.004176882530252139, "scale": 3.5099853195396126e-05, "dtype": "uint8"}}, {"name": "block_7_project_BN/moving_mean", "shape": [64], "dtype": "float32", "quantization": {"min": -1.323780222967559, "scale": 0.017191950947630638, "dtype": "uint8"}}, {"name": "block_7_project_BN/moving_variance", "shape": [64], "dtype": "float32", "quantization": {"min": 0.17085391283035278, "scale": 0.008321891812717213, "dtype": "uint8"}}, {"name": "block_8_depthwise/depthwise_kernel", "shape": [3, 3, 384, 1], "dtype": "float32", "quantization": {"min": -3.422506362316655, "scale": 0.026948868994619332, "dtype": "uint8"}}, {"name": "block_8_depthwise_BN/gamma", "shape": [384], "dtype": "float32", "quantization": {"min": 0.28603067994117737, "scale": 0.01632120130108852, "dtype": "uint8"}}, {"name": "block_8_depthwise_BN/beta", "shape": [384], "dtype": "float32", "quantization": {"min": -6.150375859877642, "scale": 0.03271476521211512, "dtype": "uint8"}}, {"name": "block_8_depthwise_BN/moving_mean", "shape": [384], "dtype": "float32", "quantization": {"min": -9.423691969291836, "scale": 0.04596922911849676, "dtype": "uint8"}}, {"name": "block_8_depthwise_BN/moving_variance", "shape": [384], "dtype": "float32", "quantization": {"min": 0.004629261326044798, "scale": 0.061719789197120595, "dtype": "uint8"}}, {"name": "block_8_expand/kernel", "shape": [1, 1, 64, 384], "dtype": "float32", "quantization": {"min": -0.5420334745855893, "scale": 0.0037125580451067754, "dtype": "uint8"}}, {"name": "block_8_expand_BN/gamma", "shape": [384], "dtype": "float32", "quantization": {"min": 0.12719938158988953, "scale": 0.005510600992277557, "dtype": "uint8"}}, {"name": "block_8_expand_BN/beta", "shape": [384], "dtype": "float32", "quantization": {"min": -1.4796660900115968, "scale": 0.01450653029423134, "dtype": "uint8"}}, {"name": "block_8_expand_BN/moving_mean", "shape": [384], "dtype": "float32", "quantization": {"min": -0.005836034748776287, "scale": 3.8649236746862825e-05, "dtype": "uint8"}}, {"name": "block_8_expand_BN/moving_variance", "shape": [384], "dtype": "float32", "quantization": {"min": 1.4665534496307373, "scale": 0.05413022228315765, "dtype": "uint8"}}, {"name": "block_8_project/kernel", "shape": [1, 1, 384, 64], "dtype": "float32", "quantization": {"min": -0.30033120641521377, "scale": 0.002422025858187208, "dtype": "uint8"}}, {"name": "block_8_project_BN/gamma", "shape": [64], "dtype": "float32", "quantization": {"min": 0.6333269476890564, "scale": 0.012745298357570873, "dtype": "uint8"}}, {"name": "block_8_project_BN/beta", "shape": [64], "dtype": "float32", "quantization": {"min": -0.004904859973227277, "scale": 3.6332296097979825e-05, "dtype": "uint8"}}, {"name": "block_8_project_BN/moving_mean", "shape": [64], "dtype": "float32", "quantization": {"min": -1.0753987162720924, "scale": 0.00977635196610993, "dtype": "uint8"}}, {"name": "block_8_project_BN/moving_variance", "shape": [64], "dtype": "float32", "quantization": {"min": 0.13130801916122437, "scale": 0.0021861090379602767, "dtype": "uint8"}}, {"name": "block_9_depthwise/depthwise_kernel", "shape": [3, 3, 384, 1], "dtype": "float32", "quantization": {"min": -2.831250134636374, "scale": 0.019798951990464154, "dtype": "uint8"}}, {"name": "block_9_depthwise_BN/gamma", "shape": [384], "dtype": "float32", "quantization": {"min": 0.31796711683273315, "scale": 0.007955082023845, "dtype": "uint8"}}, {"name": "block_9_depthwise_BN/beta", "shape": [384], "dtype": "float32", "quantization": {"min": -4.171680545806884, "scale": 0.025130605697631835, "dtype": "uint8"}}, {"name": "block_9_depthwise_BN/moving_mean", "shape": [384], "dtype": "float32", "quantization": {"min": -4.612406263164445, "scale": 0.028827539144777783, "dtype": "uint8"}}, {"name": "block_9_depthwise_BN/moving_variance", "shape": [384], "dtype": "float32", "quantization": {"min": 0.054740116000175476, "scale": 0.01920037485805212, "dtype": "uint8"}}, {"name": "block_9_expand/kernel", "shape": [1, 1, 64, 384], "dtype": "float32", "quantization": {"min": -0.36515102853962017, "scale": 0.0035110675821117326, "dtype": "uint8"}}, {"name": "block_9_expand_BN/gamma", "shape": [384], "dtype": "float32", "quantization": {"min": 0.23342087864875793, "scale": 0.007018205114439422, "dtype": "uint8"}}, {"name": "block_9_expand_BN/beta", "shape": [384], "dtype": "float32", "quantization": {"min": -1.3883685602861293, "scale": 0.011866397951163498, "dtype": "uint8"}}, {"name": "block_9_expand_BN/moving_mean", "shape": [384], "dtype": "float32", "quantization": {"min": -0.008643162741745805, "scale": 6.308877913683069e-05, "dtype": "uint8"}}, {"name": "block_9_expand_BN/moving_variance", "shape": [384], "dtype": "float32", "quantization": {"min": 2.118360996246338, "scale": 0.07897544374652937, "dtype": "uint8"}}, {"name": "block_9_project/kernel", "shape": [1, 1, 384, 64], "dtype": "float32", "quantization": {"min": -0.4918418302255518, "scale": 0.0033458627906500123, "dtype": "uint8"}}, {"name": "block_9_project_BN/gamma", "shape": [64], "dtype": "float32", "quantization": {"min": 0.6817672848701477, "scale": 0.01215742405723123, "dtype": "uint8"}}, {"name": "block_9_project_BN/beta", "shape": [64], "dtype": "float32", "quantization": {"min": -0.00399385870927397, "scale": 2.8941005139666446e-05, "dtype": "uint8"}}, {"name": "block_9_project_BN/moving_mean", "shape": [64], "dtype": "float32", "quantization": {"min": -1.8452984529383043, "scale": 0.01125181983498966, "dtype": "uint8"}}, {"name": "block_9_project_BN/moving_variance", "shape": [64], "dtype": "float32", "quantization": {"min": 0.11924822628498077, "scale": 0.0018466930179034963, "dtype": "uint8"}}, {"name": "bn_Conv1/gamma", "shape": [32], "dtype": "float32", "quantization": {"min": 0.13053518533706665, "scale": 0.016117237829694563, "dtype": "uint8"}}, {"name": "bn_Conv1/beta", "shape": [32], "dtype": "float32", "quantization": {"min": -6.189409682329964, "scale": 0.04298201168284697, "dtype": "uint8"}}, {"name": "bn_Conv1/moving_mean", "shape": [32], "dtype": "float32", "quantization": {"min": -1.5218115974875057, "scale": 0.010011918404523064, "dtype": "uint8"}}, {"name": "bn_Conv1/moving_variance", "shape": [32], "dtype": "float32", "quantization": {"min": -0.0, "scale": 0.0026636616856444114, "dtype": "uint8"}}, {"name": "dense_1/kernel", "shape": [1280, 256], "dtype": "float32", "quantization": {"min": -0.0827300671268912, "scale": 0.0007011022637872135, "dtype": "uint8"}}, {"name": "dense_1/bias", "shape": [256], "dtype": "float32", "quantization": {"min": -0.08616942780859331, "scale": 0.0009574380867621478, "dtype": "uint8"}}, {"name": "dense_2/kernel", "shape": [256, 128], "dtype": "float32", "quantization": {"min": -0.27012642972609574, "scale": 0.0020464123464098163, "dtype": "uint8"}}, {"name": "dense_2/bias", "shape": [128], "dtype": "float32", "quantization": {"min": -0.04579559355682018, "scale": 0.0013084455301948623, "dtype": "uint8"}}, {"name": "dense_3/kernel", "shape": [128, 5], "dtype": "float32", "quantization": {"min": -0.46344453400256586, "scale": 0.0030489771973853017, "dtype": "uint8"}}, {"name": "dense_3/bias", "shape": [5], "dtype": "float32", "quantization": {"min": -0.34861034412010045, "scale": 0.0028810772241330616, "dtype": "uint8"}}, {"name": "expanded_conv_depthwise/depthwise_kernel", "shape": [3, 3, 32, 1], "dtype": "float32", "quantization": {"min": -25.55166634952321, "scale": 0.19357322992063036, "dtype": "uint8"}}, {"name": "expanded_conv_depthwise_BN/gamma", "shape": [32], "dtype": "float32", "quantization": {"min": -0.09695096857407513, "scale": 0.008079247381172928, "dtype": "uint8"}}, {"name": "expanded_conv_depthwise_BN/beta", "shape": [32], "dtype": "float32", "quantization": {"min": -1.3658699895821367, "scale": 0.018710547802495023, "dtype": "uint8"}}, {"name": "expanded_conv_depthwise_BN/moving_mean", "shape": [32], "dtype": "float32", "quantization": {"min": -13.676559291166416, "scale": 0.09910550210990157, "dtype": "uint8"}}, {"name": "expanded_conv_depthwise_BN/moving_variance", "shape": [32], "dtype": "float32", "quantization": {"min": -0.0, "scale": 1.3617684158624388, "dtype": "uint8"}}, {"name": "expanded_conv_project/kernel", "shape": [1, 1, 32, 16], "dtype": "float32", "quantization": {"min": -1.4339039704378913, "scale": 0.009754448778489057, "dtype": "uint8"}}, {"name": "expanded_conv_project_BN/gamma", "shape": [16], "dtype": "float32", "quantization": {"min": 2.63926100730896, "scale": 0.009822066624959309, "dtype": "uint8"}}, {"name": "expanded_conv_project_BN/beta", "shape": [16], "dtype": "float32", "quantization": {"min": -0.03885560184717179, "scale": 0.0004466161131858826, "dtype": "uint8"}}, {"name": "expanded_conv_project_BN/moving_mean", "shape": [16], "dtype": "float32", "quantization": {"min": -5.0893140568452715, "scale": 0.03262380805670046, "dtype": "uint8"}}, {"name": "expanded_conv_project_BN/moving_variance", "shape": [16], "dtype": "float32", "quantization": {"min": 0.39643433690071106, "scale": 0.005846665302912394, "dtype": "uint8"}}]}]} \ No newline at end of file diff --git a/server/test-nsfw.js b/server/test-nsfw.js new file mode 100644 index 0000000000000000000000000000000000000000..45dcaaffcbb820ef3724a4c5250e244b74ed82b2 --- /dev/null +++ b/server/test-nsfw.js @@ -0,0 +1,10 @@ +import * as nsfwjs from 'nsfwjs'; +import fetch from 'node-fetch'; +global.fetch = async (url, options) => { + console.log("FETCHED:", url); + return fetch(url, options); +}; +nsfwjs.load().then(() => { + console.log("Done"); + process.exit(0); +}).catch(console.error); diff --git a/server/uploads/24c331bc-c580-4b26-8b66-bd952c84ddab.jpg b/server/uploads/24c331bc-c580-4b26-8b66-bd952c84ddab.jpg new file mode 100644 index 0000000000000000000000000000000000000000..baf5b80fffcf88467e8826922f4c8d6210979243 Binary files /dev/null and b/server/uploads/24c331bc-c580-4b26-8b66-bd952c84ddab.jpg differ diff --git a/server/uploads/2eaf1e25-d636-4498-80a5-952b6f597a96.jpg b/server/uploads/2eaf1e25-d636-4498-80a5-952b6f597a96.jpg new file mode 100644 index 0000000000000000000000000000000000000000..495526e8947d7ea147eb7193d1ede86df3c5561f Binary files /dev/null and b/server/uploads/2eaf1e25-d636-4498-80a5-952b6f597a96.jpg differ diff --git a/server/uploads/2fc68f29-0051-43b5-8267-8ec386ce5a0e.jpg b/server/uploads/2fc68f29-0051-43b5-8267-8ec386ce5a0e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3dee28c1b411b4370aa9aec06bb3c23d93e2db13 Binary files /dev/null and b/server/uploads/2fc68f29-0051-43b5-8267-8ec386ce5a0e.jpg differ diff --git a/server/uploads/4104a2e9-4716-4945-8cb2-9d82314d5f46.jpg b/server/uploads/4104a2e9-4716-4945-8cb2-9d82314d5f46.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3dee28c1b411b4370aa9aec06bb3c23d93e2db13 Binary files /dev/null and b/server/uploads/4104a2e9-4716-4945-8cb2-9d82314d5f46.jpg differ diff --git a/server/uploads/445a0c5c-f518-4603-b56a-40947daf9514.jpg b/server/uploads/445a0c5c-f518-4603-b56a-40947daf9514.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2cbedd6251ff3e2328f707f8e4562bf654e14f30 Binary files /dev/null and b/server/uploads/445a0c5c-f518-4603-b56a-40947daf9514.jpg differ diff --git a/server/uploads/4df08cb1-3942-4a11-a212-729ab615e238.jpg b/server/uploads/4df08cb1-3942-4a11-a212-729ab615e238.jpg new file mode 100644 index 0000000000000000000000000000000000000000..155b007e1334898f4398ebda4625eb9bb3ecd653 Binary files /dev/null and b/server/uploads/4df08cb1-3942-4a11-a212-729ab615e238.jpg differ diff --git a/server/uploads/5275088a-59e6-49bb-b8b5-be64df4b7ed0.jpg b/server/uploads/5275088a-59e6-49bb-b8b5-be64df4b7ed0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4dd8ad40918ce23beb182541824663d1b047472b Binary files /dev/null and b/server/uploads/5275088a-59e6-49bb-b8b5-be64df4b7ed0.jpg differ diff --git a/server/uploads/61696cec-0adb-4f3d-9063-cd61412a235e.jpg b/server/uploads/61696cec-0adb-4f3d-9063-cd61412a235e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..357c5cbe02c6ba14b3e7771d42c27bcc1dfd37d1 Binary files /dev/null and b/server/uploads/61696cec-0adb-4f3d-9063-cd61412a235e.jpg differ diff --git a/server/uploads/68ecf409-8fbe-4513-9d83-a256923cc58c.jpg b/server/uploads/68ecf409-8fbe-4513-9d83-a256923cc58c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..208b91cf2b796f826bec86a741e7000ec0ae9088 Binary files /dev/null and b/server/uploads/68ecf409-8fbe-4513-9d83-a256923cc58c.jpg differ diff --git a/server/uploads/6a01ff8b-b925-49ed-97f7-e98e2c13faac.jpg b/server/uploads/6a01ff8b-b925-49ed-97f7-e98e2c13faac.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ded1bbf2dc0418ea674cff563937dad655da703 Binary files /dev/null and b/server/uploads/6a01ff8b-b925-49ed-97f7-e98e2c13faac.jpg differ diff --git a/server/uploads/6c68841c-5d0a-4033-84e6-66f792ea94fe.jpg b/server/uploads/6c68841c-5d0a-4033-84e6-66f792ea94fe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0be0e835f742f7e28892c44b5f934e333899429 Binary files /dev/null and b/server/uploads/6c68841c-5d0a-4033-84e6-66f792ea94fe.jpg differ diff --git a/server/uploads/8a05b98d-72db-400b-b506-e091c8d7d6a8.jpg b/server/uploads/8a05b98d-72db-400b-b506-e091c8d7d6a8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0aeed6bfe41684d32cd751dc80e1b90d9f2cc577 Binary files /dev/null and b/server/uploads/8a05b98d-72db-400b-b506-e091c8d7d6a8.jpg differ diff --git a/server/uploads/8bed15fe-ee0a-45f0-a649-3bc3d15e618f.jpg b/server/uploads/8bed15fe-ee0a-45f0-a649-3bc3d15e618f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd59e65ca9ff0ef3702ed0aa5e46c2953a1b0f9c Binary files /dev/null and b/server/uploads/8bed15fe-ee0a-45f0-a649-3bc3d15e618f.jpg differ diff --git a/server/uploads/8d906b44-c7f7-401d-aecf-57015bba7031.jpg b/server/uploads/8d906b44-c7f7-401d-aecf-57015bba7031.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6f94974dcb96e25038d2cda86f20c4388457d1b6 Binary files /dev/null and b/server/uploads/8d906b44-c7f7-401d-aecf-57015bba7031.jpg differ diff --git a/server/uploads/8e39ceb8-aa0a-4c2b-985e-c05aeaee9a47.jpg b/server/uploads/8e39ceb8-aa0a-4c2b-985e-c05aeaee9a47.jpg new file mode 100644 index 0000000000000000000000000000000000000000..263c67740c927141750aa841509f4395d67cf7dc Binary files /dev/null and b/server/uploads/8e39ceb8-aa0a-4c2b-985e-c05aeaee9a47.jpg differ diff --git a/server/uploads/9706a044-d954-4ea7-92bc-3ee9acb04f54.jpg b/server/uploads/9706a044-d954-4ea7-92bc-3ee9acb04f54.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d363805de2588548aa75a42b2612f9871b37257 Binary files /dev/null and b/server/uploads/9706a044-d954-4ea7-92bc-3ee9acb04f54.jpg differ diff --git a/server/uploads/aea7aa8f-f4ee-4e32-94c4-32bb9ecfc7eb.jpg b/server/uploads/aea7aa8f-f4ee-4e32-94c4-32bb9ecfc7eb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12c15fe2382778d9d45c68ff380824e362239b8c Binary files /dev/null and b/server/uploads/aea7aa8f-f4ee-4e32-94c4-32bb9ecfc7eb.jpg differ diff --git a/server/uploads/b2f36863-9274-4c31-9879-7bcd7541ac5c.jpg b/server/uploads/b2f36863-9274-4c31-9879-7bcd7541ac5c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15e0d631bfaeaf3928310e9bdb514e3ea8be7294 Binary files /dev/null and b/server/uploads/b2f36863-9274-4c31-9879-7bcd7541ac5c.jpg differ diff --git a/server/uploads/b539c7b1-e419-457b-9873-72d417966488.jpg b/server/uploads/b539c7b1-e419-457b-9873-72d417966488.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a15a9d948b5870cfec862c932aefacd31f94cf2 Binary files /dev/null and b/server/uploads/b539c7b1-e419-457b-9873-72d417966488.jpg differ diff --git a/server/uploads/c558d211-042a-4e1e-8e8d-d9e1cd41b1d6.jpg b/server/uploads/c558d211-042a-4e1e-8e8d-d9e1cd41b1d6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fdee9c7550abf4fbbe30fd2e26e982469590c197 Binary files /dev/null and b/server/uploads/c558d211-042a-4e1e-8e8d-d9e1cd41b1d6.jpg differ diff --git a/server/uploads/c56cdcbf-e2ed-4be0-8d79-88965c7664ab.jpg b/server/uploads/c56cdcbf-e2ed-4be0-8d79-88965c7664ab.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34b057dc84db4b7632ce16f377a0cc03e164de2f Binary files /dev/null and b/server/uploads/c56cdcbf-e2ed-4be0-8d79-88965c7664ab.jpg differ diff --git a/server/uploads/eb4ae4ff-89d3-44ea-a622-ff714b6780de.jpg b/server/uploads/eb4ae4ff-89d3-44ea-a622-ff714b6780de.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0aeed6bfe41684d32cd751dc80e1b90d9f2cc577 Binary files /dev/null and b/server/uploads/eb4ae4ff-89d3-44ea-a622-ff714b6780de.jpg differ diff --git a/server/uploads/ed8399fd-041c-4594-b650-bb29ee5805aa.jpg b/server/uploads/ed8399fd-041c-4594-b650-bb29ee5805aa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b20e2d2408b71bf1411e3e8d5ad4fd687f0b245 Binary files /dev/null and b/server/uploads/ed8399fd-041c-4594-b650-bb29ee5805aa.jpg differ diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000000000000000000000000000000000000..f90339d8f765fa2c69d9a341959a8ddb9fff5720 --- /dev/null +++ b/src/App.css @@ -0,0 +1,184 @@ +.counter { + font-size: 16px; + padding: 5px 10px; + border-radius: 5px; + color: var(--accent); + background: var(--accent-bg); + border: 2px solid transparent; + transition: border-color 0.3s; + margin-bottom: 24px; + + &:hover { + border-color: var(--accent-border); + } + &:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } +} + +.hero { + position: relative; + + .base, + .framework, + .vite { + inset-inline: 0; + margin: 0 auto; + } + + .base { + width: 170px; + position: relative; + z-index: 0; + } + + .framework, + .vite { + position: absolute; + } + + .framework { + z-index: 1; + top: 34px; + height: 28px; + transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) + scale(1.4); + } + + .vite { + z-index: 0; + top: 107px; + height: 26px; + width: auto; + transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) + scale(0.8); + } +} + +#center { + display: flex; + flex-direction: column; + gap: 25px; + place-content: center; + place-items: center; + flex-grow: 1; + + @media (max-width: 1024px) { + padding: 32px 20px 24px; + gap: 18px; + } +} + +#next-steps { + display: flex; + border-top: 1px solid var(--border); + text-align: left; + + & > div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: 16px; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 0000000000000000000000000000000000000000..4748cc810e6222882643f1a1699adddde579015c --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,189 @@ +import { Routes, Route, Navigate, useNavigate } from 'react-router-dom'; +import { useStore } from './store'; +import { Auth } from './components/Auth'; +import { BuyerDashboard } from './components/BuyerDashboard'; +import { SellerDashboard } from './components/SellerDashboard'; +import { AddListing } from './components/AddListing'; +import { ListingDetails } from './components/ListingDetails'; +import { CallOverlay } from './components/CallOverlay'; +import { HelpOverlay } from './components/HelpOverlay'; +import { ChatOverlay } from './components/ChatOverlay'; +import { InboxOverlay } from './components/InboxOverlay'; +import { AdminLogin } from './components/admin/AdminLogin'; +import { AdminDashboard } from './components/admin/AdminDashboard'; +import { ProtectedRoute } from './components/ProtectedRoute'; +import { LogOut, Home, KeyRound, Heart, X } from 'lucide-react'; +import { useEffect, useState } from 'react'; +import { socket } from './socket'; +import { useLocation } from 'react-router-dom'; + +export default function App() { + const { currentUser, initDevice, logout } = useStore(); + const [showQR, setShowQR] = useState(false); + const navigate = useNavigate(); + const location = useLocation(); + const isAdminRoute = location.pathname.startsWith('/admin'); + + useEffect(() => { + // Request native OS notification permissions + if ("Notification" in window && Notification.permission !== "granted" && Notification.permission !== "denied") { + Notification.requestPermission(); + } + + const id = initDevice(); + if (id) { + socket.connect(); + socket.emit('join-network', id); + } + + // Listen for global listing updates (e.g., marked sold) + socket.on('listing-updated', (data) => { + useStore.getState().updateListingStatus(data.id, data.status); + }); + + socket.on('listing-edited', (data) => { + useStore.getState().editListingDetails(data.id, { cropName: data.cropName, quantity: data.quantity, price: data.price }); + }); + + socket.on('receive-message', (data) => { + const state = useStore.getState(); + if (!state.activeChatUser || state.activeChatUser.id !== data.senderId) { + state.fetchUnreadCount(); + if ("Notification" in window && Notification.permission === "granted") { + new Notification("New Message - Meri Mandi", { + body: data.message, + icon: '/upiqr.jpeg' // Generic icon for app push + }); + } + } + }); + + return () => { + socket.off('listing-updated'); + socket.off('listing-edited'); + socket.off('receive-message'); + socket.disconnect(); + } + }, [initDevice]); + + useEffect(() => { + if (currentUser) { + useStore.getState().fetchUnreadCount(); + } + }, [currentUser]); + + const handleSwitchProfile = () => { + logout(); + navigate('/'); + }; + + return ( +
+ {/* Main Content Area */} + {isAdminRoute ? ( + + } /> + } /> + + ) : ( + <> +
+
+

navigate('/')} style={{ cursor: 'pointer', margin: 0 }}>🌾 Meri Mandi

+ +
+ {currentUser && ( +
+ + {currentUser.name} ({currentUser.role}) + + +
+ )} +
+ +
+ + : ( + currentUser.role === 'buyer' ? : + ) + } /> + + + + + } /> + + + + } /> + + + + + } /> + + + + } /> + +
+ + {/* Floating Global Overlays */} + + + + {showQR && ( +
+
+ + +

Support Meri Mandi

+

Scan the QR code below through any UPI app to fund our servers and keep Meri Mandi free for farmers!

+
+ UPI QR Code +
+
+
+ )} + + + + )} +
+ ); +} diff --git a/src/assets/hero.png b/src/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..cc51a3d20ad4bc961b596a6adfd686685cd84bb0 Binary files /dev/null and b/src/assets/hero.png differ diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000000000000000000000000000000000000..6c87de9bb3358469122cc991d5cf578927246184 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/vite.svg b/src/assets/vite.svg new file mode 100644 index 0000000000000000000000000000000000000000..5101b674df391399da71c767aa5c976426c9dc7a --- /dev/null +++ b/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/src/components/AddListing.jsx b/src/components/AddListing.jsx new file mode 100644 index 0000000000000000000000000000000000000000..615c09c8db95a6279447146f4b653f0e827d5f9f --- /dev/null +++ b/src/components/AddListing.jsx @@ -0,0 +1,438 @@ +import { useState } from 'react'; +import { useStore } from '../store'; +import { useNavigate } from 'react-router-dom'; +import { Camera, MapPin, X, Loader2, Check } from 'lucide-react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { CameraCapture } from './CameraCapture'; +import { INDIA_DATA } from '../data/india-data'; + +const INDIAN_STATES = Object.keys(INDIA_DATA); + +export function AddListing() { + const { currentUser } = useStore(); + const navigate = useNavigate(); + + const [cropName, setCropName] = useState(''); + const [quantity, setQuantity] = useState(''); + const [price, setPrice] = useState(''); + const [imageFiles, setImageFiles] = useState([]); + const [imagePreviewUrls, setImagePreviewUrls] = useState([]); + + const [showCamera, setShowCamera] = useState(false); + const [location, setLocation] = useState(null); + const [locating, setLocating] = useState(false); + + const [nearestCity, setNearestCity] = useState(''); + const [district, setDistrict] = useState(''); + const [state, setState] = useState(''); + const [pincode, setPincode] = useState(''); + + const [showStateList, setShowStateList] = useState(false); + const [filteredStates, setFilteredStates] = useState(INDIAN_STATES); + const [showDistrictList, setShowDistrictList] = useState(false); + const [filteredDistricts, setFilteredDistricts] = useState([]); + + const [error, setError] = useState(''); + const [isSubmitting, setIsSubmitting] = useState(false); + + const handleCapture = (file, dataUrl) => { + if (imageFiles.length >= 5) { + setError('You can only snap up to 5 photos.'); + setShowCamera(false); + return; + } + setImageFiles(prev => [...prev, file]); + setImagePreviewUrls(prev => [...prev, dataUrl]); + setError(''); + setShowCamera(false); + }; + + const removeImage = (index) => { + setImageFiles(prev => prev.filter((_, i) => i !== index)); + setImagePreviewUrls(prev => prev.filter((_, i) => i !== index)); + }; + + const getLocation = () => { + setLocating(true); + setError(''); + + if (!('geolocation' in navigator)) { + setError('Geolocation is not supported by your browser.'); + setLocating(false); + return; + } + + const options = { + enableHighAccuracy: true, + timeout: 15000, + maximumAge: 0 + }; + + navigator.geolocation.getCurrentPosition( + (position) => { + setLocation({ + lat: position.coords.latitude, + lng: position.coords.longitude, + address: `Precise GPS: ${position.coords.latitude.toFixed(4)}, ${position.coords.longitude.toFixed(4)}` + }); + setLocating(false); + }, + (err) => { + console.error("Location Error:", err); + let msg = 'Failed to get precise location.'; + if (err.code === 1) msg = 'Location permission denied. Please allow location access in your browser settings.'; + else if (err.code === 3) msg = 'Location request timed out. Please try again in an open area.'; + + setError(msg); + + // Fallback to a default if absolutely necessary, but notify the user + setLocation({ + lat: 23.0225, + lng: 72.5714, + address: 'Approximate Network Location' + }); + setLocating(false); + }, + options + ); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + if (imageFiles.length < 2) { + setError('Please snap at least 2 live photos of your crop.'); + return; + } + if (!location) { + setError('Please provide your location.'); + return; + } + + setIsSubmitting(true); + setError(''); + + try { + const formData = new FormData(); + formData.append('sellerId', currentUser.id); + formData.append('sellerName', currentUser.name); + formData.append('cropName', cropName); + formData.append('quantity', quantity); + formData.append('price', price); + formData.append('location', JSON.stringify(location)); + formData.append('nearestCity', nearestCity); + formData.append('district', district); + formData.append('state', state); + formData.append('pincode', pincode); + + imageFiles.forEach(file => { + formData.append('images', file); + }); + + const res = await fetch('/api/listings', { + method: 'POST', + body: formData, + }); + + const data = await res.json(); + + if (!res.ok) { + throw new Error(data.error || 'Failed to publish listing'); + } + + navigate('/seller'); + } catch (err) { + console.error(err); + setError(err.message || 'An error occurred during upload. Please try again.'); + } finally { + setIsSubmitting(false); + } + }; + + return ( + + {showCamera && ( + setShowCamera(false)} + onCapture={handleCapture} + /> + )} + +

List Your Crop

+

Take live photos directly from the app.

+ + {error && ( +
+ {error} +
+ )} + +
+
+ + setCropName(e.target.value)} + required + disabled={isSubmitting} + /> +
+ +
+ + setQuantity(e.target.value)} + required + disabled={isSubmitting} + /> +
+ +
+ + setPrice(e.target.value)} + disabled={isSubmitting} + /> +
+ +
+ +
+ + {imagePreviewUrls.map((img, idx) => ( + + preview + + + ))} + + + {imageFiles.length < 5 && ( +
!isSubmitting && setShowCamera(true)} + style={{ + border: '2px dashed var(--border-color)', borderRadius: '12px', aspectRatio: '1', + display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', + cursor: isSubmitting ? 'not-allowed' : 'pointer', background: 'var(--surface-light)', gap: '8px', + opacity: isSubmitting ? 0.5 : 1 + }} + > + + Snap Feed +
+ )} +
+
+ +
+
+ + { + const val = e.target.value; + setState(val); + setFilteredStates(INDIAN_STATES.filter(s => s.toLowerCase().includes(val.toLowerCase()))); + setShowStateList(true); + setDistrict(''); + }} + onFocus={() => setShowStateList(true)} + disabled={isSubmitting} + required + /> + + {showStateList && filteredStates.length > 0 && ( + + {filteredStates.map(s => ( +
{ + setState(s); + setShowStateList(false); + setDistrict(''); + setFilteredDistricts(INDIA_DATA[s] || []); + }} + style={{ + padding: '12px 16px', cursor: 'pointer', borderBottom: '1px solid var(--border-color)', + display: 'flex', alignItems: 'center', justifyContent: 'space-between' + }} + onMouseEnter={e => e.currentTarget.style.background = 'var(--primary-glow)'} + onMouseLeave={e => e.currentTarget.style.background = 'transparent'} + > + {s} + {state === s && } +
+ ))} +
+ )} +
+ {showStateList &&
setShowStateList(false)} style={{ position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, zIndex: 105 }} />} +
+ +
+ + { + const val = e.target.value; + setDistrict(val); + const ds = INDIA_DATA[state] || []; + setFilteredDistricts(ds.filter(d => d.toLowerCase().includes(val.toLowerCase()))); + setShowDistrictList(true); + }} + onFocus={() => { + if (state) { + const ds = INDIA_DATA[state] || []; + setFilteredDistricts(ds.filter(d => d.toLowerCase().includes(district.toLowerCase()))); + setShowDistrictList(true); + } + }} + disabled={isSubmitting || !state} + required + /> + + {showDistrictList && filteredDistricts.length > 0 && ( + + {filteredDistricts.map(d => ( +
{ + setDistrict(d); + setShowDistrictList(false); + }} + style={{ + padding: '12px 16px', cursor: 'pointer', borderBottom: '1px solid var(--border-color)', + display: 'flex', alignItems: 'center', justifyContent: 'space-between' + }} + onMouseEnter={e => e.currentTarget.style.background = 'var(--primary-glow)'} + onMouseLeave={e => e.currentTarget.style.background = 'transparent'} + > + {d} + {district === d && } +
+ ))} +
+ )} +
+ {showDistrictList &&
setShowDistrictList(false)} style={{ position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, zIndex: 105 }} />} +
+
+ +
+
+ + setNearestCity(e.target.value)} + disabled={isSubmitting} + required + /> +
+
+ + setPincode(e.target.value)} + disabled={isSubmitting} + required + /> +
+
+ +
+ +
+
+ +
+ + {location ? 'Precise Location Captured' : (locating ? 'Capturing GPS...' : 'Get Primary Location (GPS)')} + + {location && {location.address}} +
+
+ {locating && } +
+
+ + + + + ); +} diff --git a/src/components/Auth.jsx b/src/components/Auth.jsx new file mode 100644 index 0000000000000000000000000000000000000000..aa67cd87959161e8171c1a3b0986b80021a75d32 --- /dev/null +++ b/src/components/Auth.jsx @@ -0,0 +1,554 @@ +import { useState } from 'react'; +import { useStore } from '../store'; +import { useNavigate } from 'react-router-dom'; +import { Leaf, Store, User, Camera, Loader2, X, MapPin, Check } from 'lucide-react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { CameraCapture } from './CameraCapture'; +import { INDIA_DATA } from '../data/india-data'; + +const INDIAN_STATES = Object.keys(INDIA_DATA); + +export function Auth() { + const { login, deviceId, initDevice, deviceProfiles, deviceProfilesLoaded } = useStore(); + const navigate = useNavigate(); + const [name, setName] = useState(''); + const [contact, setContact] = useState(''); + const [nearestCity, setNearestCity] = useState(''); + const [district, setDistrict] = useState(''); + const [state, setState] = useState(''); + const [pincode, setPincode] = useState(''); + const [role, setRole] = useState('buyer'); + + const [showStateList, setShowStateList] = useState(false); + const [filteredStates, setFilteredStates] = useState(INDIAN_STATES); + + const [showDistrictList, setShowDistrictList] = useState(false); + const [filteredDistricts, setFilteredDistricts] = useState([]); + + const [location, setLocation] = useState(null); + const [locating, setLocating] = useState(false); + + const [selfieFile, setSelfieFile] = useState(null); + const [selfiePreview, setSelfiePreview] = useState(null); + const [showCamera, setShowCamera] = useState(false); + const [isCreating, setIsCreating] = useState(false); + const [error, setError] = useState(''); + const [isSubmitting, setIsSubmitting] = useState(false); + + // Auto-init device id just in case they hit auth directly + if (!deviceId) initDevice(); + + const removeImage = () => { + setSelfieFile(null); + setSelfiePreview(null); + }; + + const getLocation = () => { + setLocating(true); + setError(''); + + if (!('geolocation' in navigator)) { + setError('Geolocation is not supported by your browser.'); + setLocating(false); + return; + } + + const options = { + enableHighAccuracy: true, + timeout: 15000, + maximumAge: 0 + }; + + navigator.geolocation.getCurrentPosition( + (position) => { + setLocation({ + lat: position.coords.latitude, + lng: position.coords.longitude, + address: `Precise GPS: ${position.coords.latitude.toFixed(4)}, ${position.coords.longitude.toFixed(4)}` + }); + setLocating(false); + }, + (err) => { + console.error("Auth Location Error:", err); + let msg = 'Failed to get precise GPS location.'; + if (err.code === 1) msg = 'Location permission denied. Please allow location access in your browser settings.'; + else if (err.code === 3) msg = 'Location request timed out. Please try again in an open area.'; + + setError(msg); + setLocating(false); + }, + options + ); + }; + + const handleLogin = async (e) => { + e.preventDefault(); + if (!name.trim()) return; + + // Validate Indian phone number format + const phoneRegex = /^(?:\+?91[-\s]?)?[0]?(?:91)?[6789]\d{9}$/; + if (!phoneRegex.test(contact)) { + setError('Please enter a valid 10-digit Indian phone number.'); + return; + } + + if (!selfieFile) { + setError('A live selfie snapshot is strictly required to ensure network trust.'); + return; + } + + if (!location) { + setError('Please capture your primary GPS location.'); + return; + } + + if (!nearestCity || !district || !state || !pincode) { + setError('Please fill in all location details.'); + return; + } + + setIsSubmitting(true); + setError(''); + + try { + const { deviceId: currentDeviceId, deviceToken } = deviceId ? { deviceId, deviceToken: useStore.getState().deviceToken } : initDevice(); + + const formData = new FormData(); + formData.append('id', currentDeviceId); + formData.append('deviceToken', deviceToken); + formData.append('name', name); + formData.append('contact', contact); + formData.append('role', role); + formData.append('nearestCity', nearestCity); + formData.append('district', district); + formData.append('state', state); + formData.append('pincode', pincode); + formData.append('location', JSON.stringify(location)); + formData.append('selfie', selfieFile); + + const res = await fetch('/api/users', { + method: 'POST', + body: formData, + }); + + const data = await res.json(); + + if (!res.ok) { + throw new Error(data.error || 'Failed to register identity.'); + } + + console.log('REGISTRATION SUCCESS:', data); + console.log('NAVIGATING TO:', (role === 'buyer' ? '/buyer' : '/seller')); + + // Zustand handles our local user binding + login(data); + + navigate(role === 'buyer' ? '/buyer' : '/seller'); + } catch (err) { + console.error(err); + setError(err.message || 'Registration failed. Please try again.'); + } finally { + setIsSubmitting(false); + } + }; + + const handleProfileSelect = (profile) => { + login(profile); + navigate(profile.role === 'buyer' ? '/buyer' : '/seller'); + }; + + const hasProfiles = deviceProfilesLoaded && deviceProfiles.length > 0; + const isCreatingNew = !hasProfiles || isCreating; + + const hasBuyer = deviceProfiles.some(p => p.role === 'buyer'); + const hasSeller = deviceProfiles.some(p => p.role === 'seller'); + + if (!deviceProfilesLoaded) { + return ( +
+ +
+ ); + } + + return ( + + {showCamera && ( + setShowCamera(false)} + onCapture={(file, dataUrl) => { + setSelfieFile(file); + setSelfiePreview(dataUrl); + setShowCamera(false); + setError(''); + }} + /> + )} + +
+
+ +
+

Welcome to Meri Mandi

+

The smart way to buy and sell crops directly.

+
+ + {error && ( +
+ {error} +
+ )} + + {isCreatingNew ? ( +
+ + {hasProfiles && ( +
+ +
+ )} + + {/* Selfie Upload UI */} +
+

Take a Live Selfie Profile

+ + {selfiePreview ? ( +
+ Selfie + +
+ ) : ( +
setShowCamera(true)} + style={{ + width: '120px', height: '120px', borderRadius: '50%', + border: '2px dashed var(--primary-color)', + display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', + cursor: 'pointer', background: 'var(--primary-glow)', gap: '8px' + }} + > + + Snap Live +
+ )} +

We strictly ask for you to take a live photo over the network.

+
+ +
+ + setName(e.target.value)} + disabled={isSubmitting} + required + /> +
+ +
+ + setContact(e.target.value)} + disabled={isSubmitting} + required + /> +
+ + {/* New Location Fields */} +
+
+ + { + const val = e.target.value; + setState(val); + setFilteredStates(INDIAN_STATES.filter(s => s.toLowerCase().includes(val.toLowerCase()))); + setShowStateList(true); + setDistrict(''); // Reset district on state change + }} + onFocus={() => setShowStateList(true)} + disabled={isSubmitting} + required + /> + + {showStateList && filteredStates.length > 0 && ( + + {filteredStates.map(s => ( +
{ + setState(s); + setShowStateList(false); + setError(''); + setDistrict(''); + setFilteredDistricts(INDIA_DATA[s] || []); + }} + style={{ + padding: '12px 16px', cursor: 'pointer', borderBottom: '1px solid var(--border-color)', + display: 'flex', alignItems: 'center', justifyContent: 'space-between' + }} + onMouseEnter={e => e.currentTarget.style.background = 'var(--primary-glow)'} + onMouseLeave={e => e.currentTarget.style.background = 'transparent'} + > + {s} + {state === s && } +
+ ))} +
+ )} +
+ {showStateList &&
setShowStateList(false)} style={{ position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, zIndex: 105 }} />} +
+ +
+ + { + const val = e.target.value; + setDistrict(val); + const ds = INDIA_DATA[state] || []; + setFilteredDistricts(ds.filter(d => d.toLowerCase().includes(val.toLowerCase()))); + setShowDistrictList(true); + }} + onFocus={() => { + if (state) { + const ds = INDIA_DATA[state] || []; + setFilteredDistricts(ds.filter(d => d.toLowerCase().includes(district.toLowerCase()))); + setShowDistrictList(true); + } + }} + disabled={isSubmitting || !state} + required + /> + + {showDistrictList && filteredDistricts.length > 0 && ( + + {filteredDistricts.map(d => ( +
{ + setDistrict(d); + setShowDistrictList(false); + setError(''); + }} + style={{ + padding: '12px 16px', cursor: 'pointer', borderBottom: '1px solid var(--border-color)', + display: 'flex', alignItems: 'center', justifyContent: 'space-between' + }} + onMouseEnter={e => e.currentTarget.style.background = 'var(--primary-glow)'} + onMouseLeave={e => e.currentTarget.style.background = 'transparent'} + > + {d} + {district === d && } +
+ ))} +
+ )} +
+ {showDistrictList &&
setShowDistrictList(false)} style={{ position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, zIndex: 105 }} />} +
+
+ +
+
+ + setNearestCity(e.target.value)} + disabled={isSubmitting} + required + /> +
+
+ + setPincode(e.target.value)} + disabled={isSubmitting} + required + /> +
+
+ +
+ +
+
+ +
+ + {location ? 'Precise Location Captured' : 'Get Primary Location (GPS)'} + + {location && {location.address}} +
+
+ {locating && } +
+
+ +
+ +
+
!isSubmitting && !hasBuyer && setRole('buyer')} + style={{ + flex: 1, padding: '16px', borderRadius: '16px', + border: `2px solid ${role === 'buyer' ? 'var(--primary-color)' : 'var(--border-color)'}`, + background: role === 'buyer' ? 'var(--primary-glow)' : 'transparent', + cursor: isSubmitting || hasBuyer ? 'not-allowed' : 'pointer', textAlign: 'center', transition: 'all 0.2s', + display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '8px', + opacity: isSubmitting || hasBuyer ? 0.5 : 1 + }} + > + + {hasBuyer ? 'Buyer (Owned)' : 'Buyer'} +
+ +
!isSubmitting && !hasSeller && setRole('seller')} + style={{ + flex: 1, padding: '16px', borderRadius: '16px', + border: `2px solid ${role === 'seller' ? 'var(--primary-color)' : 'var(--border-color)'}`, + background: role === 'seller' ? 'var(--primary-glow)' : 'transparent', + cursor: isSubmitting || hasSeller ? 'not-allowed' : 'pointer', textAlign: 'center', transition: 'all 0.2s', + display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '8px', + opacity: isSubmitting || hasSeller ? 0.5 : 1 + }} + > + + {hasSeller ? 'Seller (Owned)' : 'Seller'} +
+
+
+ + + + ) : ( +
+

Select Profile

+
+ {deviceProfiles.map(profile => ( +
handleProfileSelect(profile)} + className="glass-panel" + style={{ + padding: '20px', display: 'flex', alignItems: 'center', gap: '16px', + cursor: 'pointer', transition: 'transform 0.2s, box-shadow 0.2s' + }} + onMouseOver={(e) => e.currentTarget.style.transform = 'translateY(-2px)'} + onMouseOut={(e) => e.currentTarget.style.transform = 'translateY(0)'} + > +
+ Selfie +
+
+

{profile.name}

+
+ {profile.role === 'buyer' ? : } + {profile.role} +
+
+
+ ))} +
+ + {deviceProfiles.length < 2 && ( + + )} +
+ )} + + ); +} diff --git a/src/components/BuyerDashboard.jsx b/src/components/BuyerDashboard.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c97ab7cbd8935a666d5a8be95de414eb1ab2c1f6 --- /dev/null +++ b/src/components/BuyerDashboard.jsx @@ -0,0 +1,149 @@ +import { useStore } from '../store'; +import { useNavigate } from 'react-router-dom'; +import { Search, MapPin, Grid, List as ListIcon, Loader2, MessageSquare } from 'lucide-react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { useState, useEffect } from 'react'; + +export function BuyerDashboard() { + const { listings, fetchListings, isLoading, toggleInbox, unreadCount } = useStore(); + const navigate = useNavigate(); + const [viewMode, setViewMode] = useState('list'); + const [searchTerm, setSearchTerm] = useState(''); + + useEffect(() => { + fetchListings(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const filteredListings = listings.filter(l => + l.status !== 'sold' && ( + l.cropName.toLowerCase().includes(searchTerm.toLowerCase()) || + l.sellerName.toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + + return ( + +
+
+

Explore Crops

+

Find fresh produce directly from farmers.

+
+ +
+ +
+
+ + setSearchTerm(e.target.value)} + style={{ paddingLeft: '48px', borderRadius: '14px', background: 'var(--surface-light)' }} + /> +
+
+ + +
+
+ + {isLoading ? ( +
+ +
+ ) : ( + + {filteredListings.length === 0 ? ( + +

No crops found matching your search.

+
+ ) : ( + + {filteredListings.map(listing => ( + navigate(`/buyer/listing/${listing.id}`)} + whileHover={{ y: -4, scale: 1.02 }} + style={{ + overflow: 'hidden', cursor: 'pointer', + display: 'flex', + flexDirection: viewMode === 'list' ? 'row' : 'column', + alignItems: viewMode === 'list' ? 'center' : 'stretch' + }} + > +
+ {listing.cropName} +
+
+
+ {new Date(listing.timestamp).toLocaleDateString()} +
+

+ {listing.cropName} {listing.quantity && ({listing.quantity})} +

+

+ {listing.price || 'Contact for price'} +

+ +
+
+ + + {listing.nearestCity ? `${listing.nearestCity}, ${listing.district}, ${listing.state}` : listing.location.address} + +
+
+
+
+ ))} +
+ )} +
+ )} +
+ ); +} diff --git a/src/components/CallOverlay.jsx b/src/components/CallOverlay.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8777d260ee40b6ce3f2f731e53c98e6ea0917882 --- /dev/null +++ b/src/components/CallOverlay.jsx @@ -0,0 +1,454 @@ +import { useStore } from '../store'; +import { Phone, PhoneOff, Mic, MicOff, Video, VideoOff } from 'lucide-react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { useState, useEffect, useRef } from 'react'; +import { socket } from '../socket'; + +export function CallOverlay() { + const { activeCall, endCall, currentUser, incrementMissedCalls } = useStore(); + + const [micMuted, setMicMuted] = useState(false); + const [videoMuted, setVideoMuted] = useState(false); + + const [stream, setStream] = useState(null); + const [callAccepted, setCallAccepted] = useState(false); + const [videoActive, setVideoActive] = useState(false); + const [incomingVideoRequest, setIncomingVideoRequest] = useState(false); + const [isRequestingVideo, setIsRequestingVideo] = useState(false); + + + const localVideoRef = useRef(null); + const remoteVideoRef = useRef(null); + const connectionRef = useRef(null); + + const leaveCall = () => { + if (connectionRef.current) connectionRef.current.close(); + + // Stop local media defensively via both state and active ref source + if (stream) { + stream.getTracks().forEach(track => track.stop()); + } + if (localVideoRef.current && localVideoRef.current.srcObject) { + localVideoRef.current.srcObject.getTracks().forEach(track => track.stop()); + localVideoRef.current.srcObject = null; + } + + // Notify peer + if (activeCall) { + const peerId = activeCall.callerId === currentUser?.id ? activeCall.receiverId : activeCall.callerId; + socket.emit('end-call', { to: peerId }); + } + + setStream(null); + setCallAccepted(false); + endCall(); + }; + + // We need to listen to incoming calls globally even if not in an active call state + useEffect(() => { + socket.on('incoming-call', (data) => { + // Setup incoming state in store manually by injecting it + useStore.setState({ + activeCall: { + callerId: data.from, + callerName: data.callerName, + callerSelfie: data.callerSelfie, + receiverId: currentUser?.id, + receiverName: currentUser?.name, + receiverSelfie: currentUser?.selfiePath, + status: 'ringing', + signalData: data.signal // Stashed for answering + } + }); + + if ("Notification" in window && Notification.permission === "granted") { + new Notification("Incoming Call \u260E\uFE0F", { + body: `${data.callerName} is calling you on Meri Mandi!`, + icon: data.callerSelfie || '/upiqr.jpeg' + }); + } + }); + + socket.on('call-ended', () => { + leaveCall(); + }); + + socket.on('missed-call', () => { + incrementMissedCalls(); + leaveCall(); + }); + + socket.on('video-requested', () => { + setIncomingVideoRequest(true); + }); + + socket.on('video-accepted', () => { + setIsRequestingVideo(false); + enableVideoTrack(); + }); + + socket.on('video-rejected', () => { + setIsRequestingVideo(false); + alert("Video call request was declined."); + }); + + return () => { + socket.off('incoming-call'); + socket.off('call-ended'); + socket.off('missed-call'); + socket.off('video-requested'); + socket.off('video-accepted'); + socket.off('video-rejected'); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currentUser]); + + // Timeout logic (60 seconds) + useEffect(() => { + let timeoutId; + if (activeCall && activeCall.status === 'ringing') { + timeoutId = setTimeout(() => { + const peerId = activeCall.callerId === currentUser?.id ? activeCall.receiverId : activeCall.callerId; + if (activeCall.receiverId === currentUser?.id) { + // I didn't answer - increment my missed calls + incrementMissedCalls(); + } + // Notify other party + socket.emit('missed-call', { to: peerId }); + leaveCall(); + }, 60000); + } + return () => clearTimeout(timeoutId); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [activeCall]); + + // When activeCall becomes truthy and we are the CALLER (initiating), setup streams. + useEffect(() => { + if (activeCall && !stream && !callAccepted && activeCall.callerId === currentUser?.id) { + navigator.mediaDevices.getUserMedia({ video: false, audio: true }).then((currentStream) => { + setStream(currentStream); + if (localVideoRef.current) localVideoRef.current.srcObject = currentStream; + + // Setup Peer Connection + const peer = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] }); + + currentStream.getTracks().forEach(track => peer.addTrack(track, currentStream)); + + peer.ontrack = (event) => { + if (remoteVideoRef.current) { + remoteVideoRef.current.srcObject = event.streams[0]; + } + }; + + peer.onicecandidate = (event) => { + if (event.candidate) { + // ICE handling omitted for simplicity in this exact demo, or bundled in offer + } + }; + + peer.createOffer().then(offer => { + peer.setLocalDescription(offer); + socket.emit('call-user', { + userToCall: activeCall.receiverId, + signalData: offer, + from: currentUser.id, + callerName: currentUser.name, + callerSelfie: currentUser.selfiePath + }); + }); + + socket.on('call-accepted', (signal) => { + setCallAccepted(true); + peer.setRemoteDescription(new RTCSessionDescription(signal)); + }); + + connectionRef.current = peer; + }).catch(err => { + console.error("Failed to get media", err); + alert("Camera and Mic permissions are required for calling"); + endCall(); + }); + } + + // Cleanup when overlay completely unmounts + return () => { + if (!activeCall) { + socket.off('call-accepted'); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [activeCall, stream, currentUser]); + + + const answerCall = () => { + if (!activeCall || !activeCall.signalData) return; + + setCallAccepted(true); + useStore.setState({ activeCall: { ...activeCall, status: 'connected' } }); + + navigator.mediaDevices.getUserMedia({ video: false, audio: true }).then((currentStream) => { + setStream(currentStream); + if (localVideoRef.current) localVideoRef.current.srcObject = currentStream; + + const peer = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] }); + + currentStream.getTracks().forEach(track => peer.addTrack(track, currentStream)); + + peer.ontrack = (event) => { + if (remoteVideoRef.current) { + remoteVideoRef.current.srcObject = event.streams[0]; + } + }; + + peer.setRemoteDescription(new RTCSessionDescription(activeCall.signalData)).then(() => { + peer.createAnswer().then(answer => { + peer.setLocalDescription(answer); + socket.emit('answer-call', { signal: answer, to: activeCall.callerId }); + }); + }); + + connectionRef.current = peer; + }); + }; + + const toggleMic = () => { + if (stream) { + stream.getAudioTracks()[0].enabled = micMuted; + setMicMuted(!micMuted); + } + }; + + const requestVideo = () => { + const peerId = activeCall.callerId === currentUser?.id ? activeCall.receiverId : activeCall.callerId; + setIsRequestingVideo(true); + socket.emit('request-video', { to: peerId, from: currentUser.id }); + }; + + const acceptVideo = () => { + const peerId = activeCall.callerId === currentUser?.id ? activeCall.receiverId : activeCall.callerId; + setIncomingVideoRequest(false); + socket.emit('accept-video', { to: peerId }); + enableVideoTrack(); + }; + + const rejectVideo = () => { + const peerId = activeCall.callerId === currentUser?.id ? activeCall.receiverId : activeCall.callerId; + setIncomingVideoRequest(false); + socket.emit('reject-video', { to: peerId }); + }; + + const enableVideoTrack = async () => { + try { + const videoStream = await navigator.mediaDevices.getUserMedia({ video: true, audio: false }); + const videoTrack = videoStream.getVideoTracks()[0]; + + if (stream) { + stream.addTrack(videoTrack); + if (localVideoRef.current) localVideoRef.current.srcObject = stream; + } + + if (connectionRef.current) { + const senders = connectionRef.current.getSenders(); + const videoSender = senders.find(s => s.track && s.track.kind === 'video'); + if (videoSender) { + videoSender.replaceTrack(videoTrack); + } else { + connectionRef.current.addTrack(videoTrack, stream); + } + } + setVideoActive(true); + setVideoMuted(false); + } catch (err) { + console.error("Failed to start video", err); + } + }; + + const toggleVideo = () => { + if (!videoActive) { + requestVideo(); + return; + } + if (stream && stream.getVideoTracks().length > 0) { + const track = stream.getVideoTracks()[0]; + track.enabled = videoMuted; + setVideoMuted(!videoMuted); + } + }; + + if (!activeCall) return null; + + const isRinging = activeCall.status === 'ringing'; + const isIncoming = activeCall.receiverId === currentUser?.id && isRinging; + const isOutgoing = activeCall.callerId === currentUser?.id; + const peerSelfie = isOutgoing ? activeCall.receiverSelfie : activeCall.callerSelfie; + + return ( + + + {/* Remote Video / Avatar Container */} +
+ +
+ {/* Live Native Video */} +
+ + + {incomingVideoRequest && ( + +

Requesting Video Call...

+
+ + +
+
+ )} + + {isRequestingVideo && ( + + Waiting for video call acceptance... + + )} +
+ +

+ {isOutgoing ? activeCall.receiverName : activeCall.callerName} +

+

+ {isRinging ? (isIncoming ? 'Incoming Call...' : 'Ringing...') : 'Connected Securely'} +

+
+ + {/* Action Controls */} +
+ {(!isRinging || callAccepted) && ( + <> + + + + + )} + + {isIncoming && isRinging && ( +
+ + +
+ )} + + {isOutgoing && isRinging && !callAccepted && ( + + )} +
+
+
+ ); +} diff --git a/src/components/CameraCapture.jsx b/src/components/CameraCapture.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c9f79f30c71c947c3757ec2c5d94a516f3572b33 --- /dev/null +++ b/src/components/CameraCapture.jsx @@ -0,0 +1,252 @@ +import { useState, useEffect, useRef, useCallback } from 'react'; +import { Camera, X, RefreshCw, Loader2 } from 'lucide-react'; +import { motion, AnimatePresence } from 'framer-motion'; + +export function CameraCapture({ onCapture, onClose, facingMode = 'user' }) { + const videoRef = useRef(null); + const canvasRef = useRef(null); + const streamRef = useRef(null); + const [error, setError] = useState(''); + const [currentFacingMode, setCurrentFacingMode] = useState(facingMode); + const [capturing, setCapturing] = useState(false); + const [videoReady, setVideoReady] = useState(false); + + // Attach stream to video element reliably (handles Android timing issues) + const attachStream = useCallback((mediaStream) => { + const video = videoRef.current; + if (!video || !mediaStream) return; + + video.srcObject = mediaStream; + + // Listen for metadata to confirm dimensions are available + const onLoadedMetadata = () => { + setVideoReady(true); + video.removeEventListener('loadedmetadata', onLoadedMetadata); + }; + video.addEventListener('loadedmetadata', onLoadedMetadata); + + // Explicitly call play() — required on Android Chrome even with autoPlay + muted + video.play().catch((err) => { + // AbortError is harmless (happens if component re-renders quickly) + if (err.name !== 'AbortError') { + console.error('Video play() failed:', err); + } + }); + }, []); + + const stopCamera = useCallback(() => { + if (streamRef.current) { + streamRef.current.getTracks().forEach(track => track.stop()); + streamRef.current = null; + } + if (videoRef.current && videoRef.current.srcObject) { + videoRef.current.srcObject.getTracks().forEach(track => track.stop()); + videoRef.current.srcObject = null; + } + setVideoReady(false); + }, []); + + const startCamera = useCallback(async () => { + stopCamera(); + try { + const mediaStream = await navigator.mediaDevices.getUserMedia({ + video: { + facingMode: currentFacingMode, + // Suggest reasonable resolution for mobile devices + width: { ideal: 1280 }, + height: { ideal: 720 }, + }, + audio: false, + }); + streamRef.current = mediaStream; + attachStream(mediaStream); + setError(''); + } catch (err) { + console.error("Camera error:", err); + if (err.name === 'NotAllowedError' || err.name === 'PermissionDeniedError') { + setError('Camera permission denied. Please allow camera access in your browser settings and reload.'); + } else if (err.name === 'NotFoundError' || err.name === 'DevicesNotFoundError') { + setError('No camera found on this device.'); + } else if (err.name === 'NotReadableError' || err.name === 'TrackStartError') { + setError('Camera is in use by another app. Please close other apps using the camera and try again.'); + } else if (err.name === 'OverconstrainedError') { + // Fallback: retry without facingMode constraint (some devices don't support it) + try { + const fallbackStream = await navigator.mediaDevices.getUserMedia({ + video: true, + audio: false, + }); + streamRef.current = fallbackStream; + attachStream(fallbackStream); + setError(''); + } catch (fallbackErr) { + setError('Camera access failed. Please ensure camera permissions are enabled.'); + } + } else { + setError('Camera access denied or unavailable. Please enable permissions.'); + } + } + }, [currentFacingMode, stopCamera, attachStream]); + + useEffect(() => { + startCamera(); + return () => stopCamera(); + }, [startCamera, stopCamera]); + + const toggleCamera = () => { + setCurrentFacingMode(prev => prev === 'user' ? 'environment' : 'user'); + }; + + const handleSnap = async () => { + const video = videoRef.current; + const canvas = canvasRef.current; + if (!video || !canvas) { + console.warn("Video or canvas ref not available"); + return; + } + + // Wait briefly for dimensions if not immediately ready + let width = video.videoWidth; + let height = video.videoHeight; + if (!width || !height) { + // Give Android a moment to report dimensions + await new Promise(resolve => setTimeout(resolve, 200)); + width = video.videoWidth; + height = video.videoHeight; + } + + if (!width || !height) { + console.warn("Video dimensions not available yet"); + setError('Camera is still initializing. Please wait a moment and try again.'); + return; + } + + setCapturing(true); + + // Set canvas dimensions to match actual video feed exactly + canvas.width = width; + canvas.height = height; + + const context = canvas.getContext('2d'); + + // Mirror the canvas for selfies to feel natural + if (currentFacingMode === 'user') { + context.translate(canvas.width, 0); + context.scale(-1, 1); + } + + context.drawImage(video, 0, 0, canvas.width, canvas.height); + + // Reset transform + context.setTransform(1, 0, 0, 1, 0, 0); + + const dataUrl = canvas.toDataURL('image/jpeg', 0.9); + + // Release camera immediately after capturing the pixels + stopCamera(); + + // Convert base64 to File object for the backend Multer pipeline + canvas.toBlob((blob) => { + if (!blob) { + setCapturing(false); + setError('Failed to capture image. Please try again.'); + return; + } + const file = new File([blob], `live_snap_${Date.now()}.jpg`, { type: 'image/jpeg' }); + onCapture(file, dataUrl); + setCapturing(false); + }, 'image/jpeg', 0.9); + }; + + const handleClose = () => { + stopCamera(); + onClose(); + }; + + return ( + + + {/* Header Bar */} +
+ + Live Capture + +
+ + {/* Video Viewer */} +
+ {error ? ( +
+

{error}

+ +
+ ) : ( + <> +
+ + {/* Action Bottom Bar */} +
+ +
+
+
+ ); +} diff --git a/src/components/ChatOverlay.jsx b/src/components/ChatOverlay.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ca2c4fa73157f5969f8e1205db65a6f007adcbb7 --- /dev/null +++ b/src/components/ChatOverlay.jsx @@ -0,0 +1,172 @@ +import { useState, useEffect, useRef } from 'react'; +import { useStore } from '../store'; +import { socket } from '../socket'; +import { motion, AnimatePresence } from 'framer-motion'; +import { X, Send, User } from 'lucide-react'; +import { v4 as uuidv4 } from 'uuid'; + +export function ChatOverlay() { + const { activeChatUser, closeChat, currentUser } = useStore(); + const [messages, setMessages] = useState([]); + const [inputText, setInputText] = useState(''); + const messagesEndRef = useRef(null); + + useEffect(() => { + if (!activeChatUser || !currentUser) return; + + // Fetch History + fetch(`/api/messages/history/${currentUser.id}/${activeChatUser.id}`) + .then(res => res.json()) + .then(data => { + setMessages(data); + return fetch(`/api/messages/read/${activeChatUser.id}/${currentUser.id}`, { method: 'PATCH' }); + }) + .then(() => useStore.getState().fetchUnreadCount()) + .catch(console.error); + + const handleReceiveMessage = (msg) => { + // Only append if it belongs to this conversation + if (msg.senderId === activeChatUser.id || msg.receiverId === activeChatUser.id) { + setMessages(prev => { + if (prev.some(m => m.id === msg.id)) return prev; + return [...prev, msg]; + }); + } + }; + + socket.on('receive-message', handleReceiveMessage); + + return () => { + socket.off('receive-message', handleReceiveMessage); + }; + }, [activeChatUser, currentUser]); + + useEffect(() => { + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }, [messages]); + + const sendMessage = async (e) => { + e.preventDefault(); + if (!inputText.trim() || !activeChatUser) return; + + const newMsg = { + id: uuidv4(), + senderId: currentUser.id, + receiverId: activeChatUser.id, + message: inputText.trim(), + timestamp: Date.now() + }; + + // Optimistically update UI + setMessages(prev => [...prev, newMsg]); + setInputText(''); + + // Emit via socket purely for live relay + socket.emit('send-message', newMsg); + + // Save strictly to database + try { + await fetch(`/api/messages`, { + method: 'POST', + headers: { 'Content-Type': 'application/json', 'x-socket-id': socket.id }, + body: JSON.stringify(newMsg) + }); + } catch(err) { console.error("Failed to send message", err); } + }; + + if (!activeChatUser) return null; + + return ( + +
+ e.stopPropagation()} // Prevent closing when clicking inside + > + {/* Chat Header */} +
+ + +
+ {activeChatUser.selfiePath ? ( + Avatar + ) : ( + + )} +
+
+

{activeChatUser.name}

+

Active Now

+
+
+ + {/* Chat Transcript Log */} +
+ {messages.length === 0 ? ( +
+ Start your conversation!
Messages are end-to-end direct. +
+ ) : ( + messages.map(msg => { + const isMe = msg.senderId === currentUser?.id; + return ( +
+
+ {msg.message} +
+
+ {new Date(msg.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} +
+
+ ); + }) + )} +
+
+ + {/* Chat Input Dock */} +
+ setInputText(e.target.value)} + placeholder="Type your message..." + style={{ flex: 1, background: 'var(--surface-light)', border: '1px solid var(--border-color)', color: 'white', padding: '12px 16px', borderRadius: '24px', fontSize: '15px', outline: 'none' }} + /> + +
+ +
+ + ); +} diff --git a/src/components/HelpOverlay.jsx b/src/components/HelpOverlay.jsx new file mode 100644 index 0000000000000000000000000000000000000000..443e3b79a4f1a486fa5db6999c49522c1e05b1d4 --- /dev/null +++ b/src/components/HelpOverlay.jsx @@ -0,0 +1,198 @@ +import { useState, useEffect } from 'react'; +import { MessageSquare, X, Send } from 'lucide-react'; +import { useStore } from '../store'; +import { motion, AnimatePresence } from 'framer-motion'; + +export function HelpOverlay() { + const [isOpen, setIsOpen] = useState(false); + const [message, setMessage] = useState(''); + const [history, setHistory] = useState([]); + const [unreadCount, setUnreadCount] = useState(0); + const { currentUser, deviceId } = useStore(); + + const fetchUnreadCount = async () => { + const id = currentUser ? currentUser.id.split('_')[0] : deviceId; + if (!id) return; + try { + const res = await fetch(`/api/support/unread/${id}`); + if (res.ok) setUnreadCount((await res.json()).count); + } catch {} + }; + + const markAsRead = async () => { + const id = currentUser ? currentUser.id.split('_')[0] : deviceId; + if (!id) return; + try { + await fetch(`/api/support/read/${id}`, { method: 'PATCH' }); + setUnreadCount(0); + } catch {} + }; + + useEffect(() => { + if (isOpen) { + if (currentUser || deviceId) { + fetchHistory(); + markAsRead(); + } + } else if (currentUser || deviceId) { + fetchUnreadCount(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, currentUser, deviceId]); + + useEffect(() => { + if (!currentUser && !deviceId) return; + import('../socket').then(({ socket }) => { + const handler = () => { + if (isOpen) { + fetchHistory(); + markAsRead(); + } else { + fetchUnreadCount(); + } + }; + socket.on('support-ticket-updated', handler); + return () => socket.off('support-ticket-updated', handler); + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, currentUser, deviceId]); + + const fetchHistory = async () => { + try { + const id = currentUser ? currentUser.id.split('_')[0] : deviceId; + if (!id) return; + const res = await fetch(`/api/support/history/${id}`); + if (res.ok) { + const data = await res.json(); + setHistory(data); + } + } catch (err) { + console.error(err); + } + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + const senderId = currentUser ? currentUser.id : deviceId; + if (!message.trim() || !senderId) return; + + try { + const res = await fetch(`/api/support`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ senderId, message }) + }); + if (res.ok) { + setMessage(''); + fetchHistory(); + } + } catch (err) { + console.error(err); + } + }; + + + return ( + <> + + + + {isOpen && ( + +
+

Support

+ +
+ +
+ {history.length === 0 ? ( +
No previous tickets.
How can we help you today?
+ ) : ( + history.map(msg => ( +
+
{msg.message}
+ {msg.adminReply && ( +
+ Admin: {msg.adminReply} +
+ )} +
+ {new Date(msg.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} + {msg.isResolved ? 'Resolved' : 'Pending'} +
+
+ )) + )} +
+ +
+ setMessage(e.target.value)} + style={{ flex: 1, padding: '10px 12px', borderRadius: '20px', border: '1px solid #333', background: '#111', color: 'white', outline: 'none' }} + required + /> + +
+
+ )} +
+ + ); +} diff --git a/src/components/InboxOverlay.jsx b/src/components/InboxOverlay.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7a1a217ce76aefae1066defda3a3d64273d62f06 --- /dev/null +++ b/src/components/InboxOverlay.jsx @@ -0,0 +1,117 @@ +import { useState, useEffect } from 'react'; +import { useStore } from '../store'; +import { motion, AnimatePresence } from 'framer-motion'; +import { X, MessageSquare, User } from 'lucide-react'; + +export function InboxOverlay() { + const { currentUser, showInbox, toggleInbox, startChat } = useStore(); + const [inbox, setInbox] = useState([]); + const [loading, setLoading] = useState(false); + + useEffect(() => { + if (!showInbox || !currentUser) return; + + const fetchInbox = async () => { + setLoading(true); + try { + const res = await fetch(`/api/messages/inbox/${currentUser.id}`); + const data = await res.json(); + setInbox(data || []); + } catch (error) { + console.error(error); + } finally { + setLoading(false); + } + }; + + fetchInbox(); + }, [showInbox, currentUser]); + + if (!showInbox) return null; + + return ( + +
+ e.stopPropagation()} + > + {/* Header */} +
+
+ +

Your Messages

+
+ +
+ + {/* List */} +
+ {loading ? ( +

Loading messages...

+ ) : inbox.length === 0 ? ( +
+ +

No messages yet.

+

Conversations with buyers or sellers will appear here.

+
+ ) : ( +
+ {inbox.map(chat => ( + + ))} +
+ )} +
+
+
+
+ ); +} diff --git a/src/components/ListingDetails.jsx b/src/components/ListingDetails.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c80c4664f12e10cb937cc50f107007f3fa6da147 --- /dev/null +++ b/src/components/ListingDetails.jsx @@ -0,0 +1,128 @@ +import { useStore } from '../store'; +import { useParams, useNavigate } from 'react-router-dom'; +import { Phone, MessageSquare, MapPin, ChevronLeft, Calendar } from 'lucide-react'; +import { motion } from 'framer-motion'; +import { useEffect } from 'react'; + +export function ListingDetails() { + const { id } = useParams(); + const { listings, fetchListings, isLoading, startCall, currentUser, startChat } = useStore(); + const navigate = useNavigate(); + + useEffect(() => { + if (listings.length === 0) { + fetchListings(); + } + }, [listings.length, fetchListings]); + + const listing = listings.find(l => l.id === id); + + useEffect(() => { + if (listing?.status === 'sold' && currentUser?.role === 'buyer') { + navigate('/buyer'); // Kicks them out if someone bought it while they were looking + } + }, [listing, navigate, currentUser]); + + if (isLoading) return
Loading...
; + if (!listing) return
Listing not found.
; + + return ( + + {/* Back Button */} + + + {/* Image Carousel (Simplified) */} +
+ {listing.images.map((img, idx) => ( +
+ {`Crop +
+ ))} +
+ +
+

+ {listing.cropName} {listing.quantity && ({listing.quantity})} +

+

+ {listing.price || 'Contact for price'} +

+ +
+
+
+ +
+
+

Location

+

+ {listing.nearestCity ? `${listing.nearestCity}, ${listing.district}, ${listing.state}` : listing.location.address} +

+
+
+ +
+
+ +
+
+

Listed On

+

{new Date(listing.timestamp).toLocaleDateString()}

+
+
+
+
+ +
+

Seller Info

+
+
+
+ {listing.sellerSelfie ? ( + {listing.sellerName} + ) : ( + {listing.sellerName.charAt(0)} + )} +
+
+

{listing.sellerName}

+

Meri Mandi Seller

+
+
+
+
+ + {/* Action Buttons */} +
+ + +
+
+ ); +} diff --git a/src/components/ProtectedRoute.jsx b/src/components/ProtectedRoute.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8a84ebbc04e600435dd7280291cb07e8b8a53149 --- /dev/null +++ b/src/components/ProtectedRoute.jsx @@ -0,0 +1,18 @@ +import { Navigate } from 'react-router-dom'; +import { useStore } from '../store'; + +export function ProtectedRoute({ children, requiredRole }) { + const { currentUser } = useStore(); + + if (!currentUser) { + // Redirect to the registration/auth page if not logged in + return ; + } + + if (requiredRole && currentUser.role !== requiredRole) { + // If they have the wrong role, redirect back to their appropriate dashboard + return ; + } + + return children; +} diff --git a/src/components/SellerDashboard.jsx b/src/components/SellerDashboard.jsx new file mode 100644 index 0000000000000000000000000000000000000000..1b37e18cfe533ecf65260ec33874a98cbbabed67 --- /dev/null +++ b/src/components/SellerDashboard.jsx @@ -0,0 +1,232 @@ +import { useStore } from '../store'; +import { useNavigate } from 'react-router-dom'; +import { PlusCircle, MapPin, Search, Loader2, MessageSquare } from 'lucide-react'; +import { motion } from 'framer-motion'; +import { useEffect, useState } from 'react'; + +export function SellerDashboard() { + const { listings, fetchListings, currentUser, isLoading, toggleInbox, unreadCount, missedCalls, resetMissedCalls } = useStore(); + const navigate = useNavigate(); + + const handleMessageClick = () => { + resetMissedCalls(); + toggleInbox(); + }; + + useEffect(() => { + fetchListings(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const [editingListing, setEditingListing] = useState(null); + const [editForm, setEditForm] = useState({ cropName: '', quantity: '', price: '' }); + + const myListings = listings.filter(l => l.sellerId === currentUser?.id && l.status !== 'sold'); + + const handleMarkSold = async (e, id) => { + e.stopPropagation(); + try { + await fetch(`/api/listings/${id}/sold`, { method: 'PATCH' }); + } catch (err) { + console.error("Failed to mark sold", err); + } + }; + + const startEditing = (e, listing) => { + e.stopPropagation(); + setEditingListing(listing); + setEditForm({ cropName: listing.cropName, quantity: listing.quantity || '', price: listing.price || '' }); + }; + + const handleEditSubmit = async (e) => { + e.preventDefault(); + try { + await fetch(`/api/listings/${editingListing.id}/edit`, { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(editForm) + }); + setEditingListing(null); + } catch (err) { + console.error("Failed to edit", err); + } + }; + + return ( + +
+
+

My Listings

+

Manage your crops and produce.

+
+
+
+ + {missedCalls > 0 && ( +
+ {missedCalls} +
+ )} +
+ +
+
+ + {isLoading ? ( +
+ +
+ ) : myListings.length === 0 ? ( +
+
+ +
+

No Listings Yet

+

List your first crop to connect with buyers.

+
+ ) : ( +
+ {myListings.map(listing => { + const isSold = listing.status === 'sold'; + return ( + +
+ {listing.cropName} + {isSold && ( +
+ SOLD +
+ )} +
+
+

+ {listing.cropName} {listing.quantity && ({listing.quantity})} +

+

+ {listing.price || 'Contact for price'} +

+
+ + + {listing.nearestCity ? `${listing.nearestCity}, ${listing.district}, ${listing.state}` : 'Location based'} + +
+
+ {!isSold && ( +
+ + +
+ )} +
+ ) + })} +
+ )} + + {editingListing && ( +
+ +

Edit Listing

+
+
+ + setEditForm(prev => ({ ...prev, cropName: e.target.value }))} + required + /> +
+
+ + setEditForm(prev => ({ ...prev, quantity: e.target.value }))} + required + /> +
+
+ + setEditForm(prev => ({ ...prev, price: e.target.value }))} + /> +
+
+ + +
+
+
+
+ )} +
+ ); +} diff --git a/src/components/admin/AdminDashboard.jsx b/src/components/admin/AdminDashboard.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8951885e8031c3c76ee2ac34faa094ca805dbc77 --- /dev/null +++ b/src/components/admin/AdminDashboard.jsx @@ -0,0 +1,393 @@ +import { useState, useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { LogOut, Users, ShoppingBag, Trash2, Ban, UserCheck, RefreshCw, LifeBuoy } from 'lucide-react'; + +export function AdminDashboard() { + const [activeTab, setActiveTab] = useState('users'); + const [users, setUsers] = useState([]); + const [listings, setListings] = useState([]); + const [supportTickets, setSupportTickets] = useState([]); + const [stats, setStats] = useState({ pendingSupport: 0 }); + const [loading, setLoading] = useState(true); + const [replyingTo, setReplyingTo] = useState(null); + const [replyText, setReplyText] = useState(''); + const navigate = useNavigate(); + + const token = sessionStorage.getItem('adminToken'); + + useEffect(() => { + if (!token) { + navigate('/admin'); + return; + } + fetchData(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [activeTab, token, navigate]); + + useEffect(() => { + if (!token) return; + import('../../socket').then(({ socket }) => { + const handler = () => { + if (activeTab === 'support') { + fetchData(); // This also fetches stats + } else { + fetch(`/api/admin/stats`, { + headers: { 'x-admin-key': token } + }).then(r => r.json()).then(data => setStats(data)).catch(()=>{}); + } + }; + socket.on('support-ticket-updated', handler); + return () => socket.off('support-ticket-updated', handler); + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [activeTab, token]); + + const fetchData = async () => { + setLoading(true); + try { + const statsRes = await fetch(`/api/admin/stats`, { + headers: { 'x-admin-key': token } + }); + if (statsRes.status === 403) { + sessionStorage.removeItem('adminToken'); + navigate('/admin'); + return; + } + if (statsRes.ok) { + setStats(await statsRes.json()); + } + + let endpoint = ''; + if (activeTab === 'users') endpoint = '/api/admin/users'; + else if (activeTab === 'listings') endpoint = '/api/admin/listings'; + else if (activeTab === 'support') endpoint = '/api/admin/support'; + + const res = await fetch(`${endpoint}`, { + headers: { 'x-admin-key': token } + }); + if (res.status === 403) { + sessionStorage.removeItem('adminToken'); + navigate('/admin'); + return; + } + const data = await res.json(); + if (activeTab === 'users') setUsers(data); + else if (activeTab === 'listings') setListings(data); + else if (activeTab === 'support') setSupportTickets(data); + } catch (err) { + console.error(err); + } finally { + setLoading(false); + } + }; + + const handleBlockUser = async (id, currentStatus) => { + if (!window.confirm(`Are you sure you want to ${currentStatus ? 'unblock' : 'block'} this user?`)) return; + try { + const res = await fetch(`/api/admin/users/${id}/block`, { + method: 'PATCH', + headers: { 'Content-Type': 'application/json', 'x-admin-key': token }, + body: JSON.stringify({ isBlocked: !currentStatus }) + }); + if (res.ok) { + setUsers(users.map(u => u.id === id ? { ...u, isBlocked: currentStatus ? 0 : 1 } : u)); + } + } catch (err) { console.error(err); } + }; + + const handleDeleteUser = async (id) => { + if (!window.confirm('CRITICAL WARING: Deleting a user will permanently wipe their profile and all active listings. Proceed?')) return; + try { + const res = await fetch(`/api/admin/users/${id}`, { + method: 'DELETE', + headers: { 'x-admin-key': token } + }); + if (res.ok) setUsers(users.filter(u => u.id !== id)); + } catch (err) { console.error(err); } + }; + + const handleDeleteListing = async (id) => { + if (!window.confirm('Delete this listing permanently?')) return; + try { + const res = await fetch(`/api/admin/listings/${id}`, { + method: 'DELETE', + headers: { 'x-admin-key': token } + }); + if (res.ok) setListings(listings.filter(l => l.id !== id)); + } catch (err) { console.error(err); } + }; + + const handleResolveTicket = async (id) => { + try { + const res = await fetch(`/api/admin/support/${id}/resolve`, { + method: 'PATCH', + headers: { 'x-admin-key': token } + }); + if (res.ok) { + setSupportTickets(supportTickets.map(t => t.id === id ? { ...t, isResolved: 1 } : t)); + setStats(prev => ({ ...prev, pendingSupport: Math.max(0, prev.pendingSupport - 1) })); + } + } catch (err) { console.error(err); } + }; + + const handleReplyTicket = async (id, reply) => { + if (!reply || !reply.trim()) return; + try { + const res = await fetch(`/api/admin/support/${id}/reply`, { + method: 'PATCH', + headers: { 'Content-Type': 'application/json', 'x-admin-key': token }, + body: JSON.stringify({ reply }) + }); + if (res.ok) { + setSupportTickets(supportTickets.map(t => t.id === id ? { ...t, adminReply: reply } : t)); + setReplyingTo(null); + setReplyText(''); + } else { + const errorData = await res.json(); + alert(`Failed to send reply: ${errorData.error || 'Server error'}`); + } + } catch (err) { + console.error(err); + alert('Network error: Could not connect to support server.'); + } + }; + + if (!token) return null; + + return ( +
+ + {/* Sidebar */} +
+
+

Meri Mandi Admin

+
+ + + +
+ +
+
+ + {/* Main Content Area */} +
+
+

+ {activeTab === 'users' ? 'User Management' : activeTab === 'listings' ? 'Listings Moderation' : 'Support Inbox'} +

+ +
+ + {loading ? ( +
Loading data...
+ ) : ( +
+ + {activeTab === 'users' && ( + + + + + + + + + + + + {users.length === 0 ? : users.map(user => ( + + + + + + + + ))} + +
UserRoleContactStatusActions
No users found.
+ Selfie + {user.name} + {user.role}{user.contact || 'N/A'} + {user.isBlocked ? + Blocked : + Active + } + +
+ + +
+
+ )} + + {activeTab === 'listings' && ( + + + + + + + + + + + + {listings.length === 0 ? : listings.map(listing => ( + + + + + + + + ))} + +
Crop DetailsSellerLocationPrice InfoActions
No listings found.
+ {listing.images && listing.images.length > 0 ? ( + Crop + ) : ( +
+ )} +
+
{listing.cropName}
+
Qty: {listing.quantity} • {listing.status === 'sold' ? Sold : Live}
+
+
+
{listing.sellerNameDisplay || listing.sellerName}
+
Phone: {listing.sellerContact || 'N/A'}
+
+ {(() => { + try { const loc = JSON.parse(listing.location); return `${loc.lat.toFixed(4)}, ${loc.lng.toFixed(4)}`; } catch { return listing.location; } + })()} + {listing.price ? `₹${listing.price}` : 'Offer'} + +
+ )} + + {activeTab === 'support' && ( +
+ {supportTickets.length === 0 ?
No support tickets found.
: supportTickets.map(ticket => ( +
+
+ {ticket.selfiePath ? ( + User + ) : ( +
+ +
+ )} +
+
+ {ticket.name || 'Guest Farmer'} {ticket.role || 'Unregistered'} +
+
+ Contact: {ticket.contact || 'N/A'} • {new Date(ticket.timestamp).toLocaleString()} +
+
+ {ticket.message} + {ticket.adminReply && ( +
+ Admin Reply: {ticket.adminReply} +
+ )} +
+
+
+
+ {!ticket.isResolved && !ticket.adminReply && replyingTo !== ticket.id && ( + + )} + {!ticket.isResolved ? ( + + ) : ( +
Resolved ✓
+ )} +
+ + {replyingTo === ticket.id && ( +
+