From ca115c6e0d2ae8aa895a609f6c1c9b84dc97329c Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 19:08:54 +0100 Subject: [PATCH 01/59] feat(v2): bootstrap modern Fastify rewrite with game resource API --- v2/README.md | 55 ++++ v2/package-lock.json | 629 +++++++++++++++++++++++++++++++++++++++++++ v2/package.json | 15 ++ v2/src/server.mjs | 66 +++++ v2/src/store.mjs | 44 +++ 5 files changed, 809 insertions(+) create mode 100644 v2/README.md create mode 100644 v2/package-lock.json create mode 100644 v2/package.json create mode 100644 v2/src/server.mjs create mode 100644 v2/src/store.mjs diff --git a/v2/README.md b/v2/README.md new file mode 100644 index 0000000..5c62b84 --- /dev/null +++ b/v2/README.md @@ -0,0 +1,55 @@ +# chess-api v2 (alpha) + +Modern rewrite of `anzemur/chess-api`. + +## Why v2 + +- cleaner resource model (`/v2/games`) +- modern runtime (Node + Fastify + chess.js 1.x) +- explicit game state payloads +- easier to extend for auth, persistence, multiplayer rooms, ratings + +## Run + +```bash +cd v2 +npm install +npm run dev +``` + +## API + +### Create game +`POST /v2/games` + +Body (optional): +```json +{ "mode": "pvp", "fen": "..." } +``` + +### Get state +`GET /v2/games/:id` + +### List legal moves +`GET /v2/games/:id/moves` +`GET /v2/games/:id/moves?from=e2` + +### Make move +`POST /v2/games/:id/moves` + +Body: +```json +{ "from": "e2", "to": "e4" } +``` +or +```json +{ "san": "Nf3" } +``` + +## Next steps to ship beta + +1. persistence (Redis/Postgres) +2. auth + rate limiting +3. one-player engine endpoint +4. tests + OpenAPI + CI +5. migration shim from v1 routes diff --git a/v2/package-lock.json b/v2/package-lock.json new file mode 100644 index 0000000..c4626fe --- /dev/null +++ b/v2/package-lock.json @@ -0,0 +1,629 @@ +{ + "name": "chess-api-v2", + "version": "2.0.0-alpha.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "chess-api-v2", + "version": "2.0.0-alpha.1", + "dependencies": { + "chess.js": "^1.4.0", + "fastify": "^5.0.0" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", + "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0" + } + }, + "node_modules/@fastify/error": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", + "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", + "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^6.0.0" + } + }, + "node_modules/@fastify/forwarded": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", + "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", + "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@fastify/proxy-addr": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", + "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/forwarded": "^3.0.0", + "ipaddr.js": "^2.1.0" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", + "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/error": "^4.0.0", + "fastq": "^1.17.1" + } + }, + "node_modules/chess.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.4.0.tgz", + "integrity": "sha512-BBJgrrtKQOzFLonR0l+k64A98NLemPwNsCskwb+29bRwobUa4iTm51E1kwGPbWXAcfdDa18nad6vpPPKPWarqw==", + "license": "BSD-2-Clause" + }, + "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/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-json-stringify": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.3.0.tgz", + "integrity": "sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.2.0", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0", + "json-schema-ref-resolver": "^3.0.0", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastify": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.7.4.tgz", + "integrity": "sha512-e6l5NsRdaEP8rdD8VR0ErJASeyaRbzXYpmkrpr2SuvuMq6Si3lvsaVy5C+7gLanEkvjpMDzBXWE5HPeb/hgTxA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^4.0.5", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "@fastify/proxy-addr": "^5.0.0", + "abstract-logging": "^2.0.1", + "avvio": "^9.0.0", + "fast-json-stringify": "^6.0.0", + "find-my-way": "^9.0.0", + "light-my-request": "^6.0.0", + "pino": "^10.1.0", + "process-warning": "^5.0.0", + "rfdc": "^1.3.1", + "secure-json-parse": "^4.0.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/find-my-way": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.5.0.tgz", + "integrity": "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^5.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/ipaddr.js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/json-schema-ref-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", + "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/light-my-request": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", + "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "cookie": "^1.0.1", + "process-warning": "^4.0.0", + "set-cookie-parser": "^2.6.0" + } + }, + "node_modules/light-my-request/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/pino": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", + "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/safe-regex2": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", + "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ret": "~0.5.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/secure-json-parse": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", + "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "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/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/sonic-boom": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.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/thread-stream": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", + "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/v2/package.json b/v2/package.json new file mode 100644 index 0000000..d07e939 --- /dev/null +++ b/v2/package.json @@ -0,0 +1,15 @@ +{ + "name": "chess-api-v2", + "version": "2.0.0-alpha.1", + "private": true, + "type": "module", + "description": "Modern rewrite of chess-api", + "scripts": { + "dev": "node src/server.mjs", + "start": "node src/server.mjs" + }, + "dependencies": { + "chess.js": "^1.4.0", + "fastify": "^5.0.0" + } +} diff --git a/v2/src/server.mjs b/v2/src/server.mjs new file mode 100644 index 0000000..c2f822c --- /dev/null +++ b/v2/src/server.mjs @@ -0,0 +1,66 @@ +import Fastify from 'fastify'; +import { createGame, getGame, toState } from './store.mjs'; + +const app = Fastify({ logger: true }); + +app.get('/', async () => ({ + ok: true, + service: 'chess-api-v2', + docs: '/v2' +})); + +app.get('/v2', async () => ({ + message: 'chess-api v2', + endpoints: [ + 'POST /v2/games', + 'GET /v2/games/:id', + 'POST /v2/games/:id/moves', + 'GET /v2/games/:id/moves?from=e2' + ] +})); + +app.post('/v2/games', async (req, reply) => { + const body = req.body || {}; + const game = createGame({ fen: body.fen, mode: body.mode || 'pvp' }); + reply.code(201); + return toState(game); +}); + +app.get('/v2/games/:id', async (req, reply) => { + const game = getGame(req.params.id); + if (!game) return reply.code(404).send({ error: 'Game not found' }); + return toState(game); +}); + +app.get('/v2/games/:id/moves', async (req, reply) => { + const game = getGame(req.params.id); + if (!game) return reply.code(404).send({ error: 'Game not found' }); + + const from = req.query?.from; + const moves = game.chess.moves(from ? { square: from, verbose: true } : { verbose: true }); + return { gameId: game.id, count: moves.length, moves }; +}); + +app.post('/v2/games/:id/moves', async (req, reply) => { + const game = getGame(req.params.id); + if (!game) return reply.code(404).send({ error: 'Game not found' }); + + const { from, to, promotion = 'q', san } = req.body || {}; + if (!san && (!from || !to)) { + return reply.code(400).send({ error: 'Provide san OR from+to' }); + } + + const move = san + ? game.chess.move(san) + : game.chess.move({ from, to, promotion }); + + if (!move) return reply.code(422).send({ error: 'Illegal move' }); + + game.updatedAt = new Date().toISOString(); + return { move, state: toState(game) }; +}); + +const port = Number(process.env.PORT || 3000); +app.listen({ port, host: '0.0.0.0' }).then(() => { + app.log.info(`chess-api-v2 listening on ${port}`); +}); diff --git a/v2/src/store.mjs b/v2/src/store.mjs new file mode 100644 index 0000000..c23be2c --- /dev/null +++ b/v2/src/store.mjs @@ -0,0 +1,44 @@ +import { Chess } from 'chess.js'; +import crypto from 'node:crypto'; + +const games = new Map(); + +export function createGame({ fen, mode = 'pvp' } = {}) { + const chess = new Chess(); + if (fen) chess.load(fen); + + const id = crypto.randomUUID(); + const game = { + id, + mode, + chess, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString() + }; + + games.set(id, game); + return game; +} + +export function getGame(id) { + return games.get(id); +} + +export function toState(game) { + const { chess, id, mode, createdAt, updatedAt } = game; + return { + id, + mode, + createdAt, + updatedAt, + fen: chess.fen(), + pgn: chess.pgn(), + turn: chess.turn(), + isGameOver: chess.isGameOver(), + isCheckmate: chess.isCheckmate(), + isDraw: chess.isDraw(), + isStalemate: chess.isStalemate(), + isThreefoldRepetition: chess.isThreefoldRepetition(), + history: chess.history({ verbose: true }) + }; +} From 1477fae0bcaba87c8f04d874bf16408d94105a98 Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 19:11:05 +0100 Subject: [PATCH 02/59] refactor(v2): migrate rewrite bootstrap to TypeScript --- v2/dist/server.js | 63 ++++ v2/dist/store.js | 39 +++ v2/package-lock.json | 578 +++++++++++++++++++++++++++++++ v2/package.json | 12 +- v2/src/{server.mjs => server.ts} | 26 +- v2/src/{store.mjs => store.ts} | 20 +- v2/tsconfig.json | 14 + 7 files changed, 734 insertions(+), 18 deletions(-) create mode 100644 v2/dist/server.js create mode 100644 v2/dist/store.js rename v2/src/{server.mjs => server.ts} (61%) rename v2/src/{store.mjs => store.ts} (65%) create mode 100644 v2/tsconfig.json diff --git a/v2/dist/server.js b/v2/dist/server.js new file mode 100644 index 0000000..ce21711 --- /dev/null +++ b/v2/dist/server.js @@ -0,0 +1,63 @@ +import Fastify from 'fastify'; +import { createGame, getGame, toState } from './store.js'; +const app = Fastify({ logger: true }); +app.get('/', async () => ({ + ok: true, + service: 'chess-api-v2', + docs: '/v2' +})); +app.get('/v2', async () => ({ + message: 'chess-api v2', + endpoints: [ + 'POST /v2/games', + 'GET /v2/games/:id', + 'POST /v2/games/:id/moves', + 'GET /v2/games/:id/moves?from=e2' + ] +})); +app.post('/v2/games', async (req, reply) => { + const body = (req.body ?? {}); + const game = createGame({ fen: body.fen, mode: body.mode ?? 'pvp' }); + reply.code(201); + return toState(game); +}); +app.get('/v2/games/:id', async (req, reply) => { + const params = req.params; + const game = getGame(params.id); + if (!game) + return reply.code(404).send({ error: 'Game not found' }); + return toState(game); +}); +app.get('/v2/games/:id/moves', async (req, reply) => { + const params = req.params; + const query = (req.query ?? {}); + const game = getGame(params.id); + if (!game) + return reply.code(404).send({ error: 'Game not found' }); + const moves = query.from + ? game.chess.moves({ square: query.from }) + : game.chess.moves(); + return { gameId: game.id, count: moves.length, moves }; +}); +app.post('/v2/games/:id/moves', async (req, reply) => { + const params = req.params; + const body = (req.body ?? {}); + const game = getGame(params.id); + if (!game) + return reply.code(404).send({ error: 'Game not found' }); + const { from, to, promotion = 'q', san } = body; + if (!san && (!from || !to)) { + return reply.code(400).send({ error: 'Provide san OR from+to' }); + } + const move = san + ? game.chess.move(san) + : game.chess.move({ from: from, to: to, promotion: promotion }); + if (!move) + return reply.code(422).send({ error: 'Illegal move' }); + game.updatedAt = new Date().toISOString(); + return { move, state: toState(game) }; +}); +const port = Number(process.env.PORT || 3000); +app.listen({ port, host: '0.0.0.0' }).then(() => { + app.log.info(`chess-api-v2 listening on ${port}`); +}); diff --git a/v2/dist/store.js b/v2/dist/store.js new file mode 100644 index 0000000..6a0a157 --- /dev/null +++ b/v2/dist/store.js @@ -0,0 +1,39 @@ +import { Chess } from 'chess.js'; +import crypto from 'node:crypto'; +const games = new Map(); +export function createGame({ fen, mode = 'pvp' } = {}) { + const chess = new Chess(); + if (fen) + chess.load(fen); + const id = crypto.randomUUID(); + const game = { + id, + mode, + chess, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString() + }; + games.set(id, game); + return game; +} +export function getGame(id) { + return games.get(id); +} +export function toState(game) { + const { chess, id, mode, createdAt, updatedAt } = game; + return { + id, + mode, + createdAt, + updatedAt, + fen: chess.fen(), + pgn: chess.pgn(), + turn: chess.turn(), + isGameOver: chess.isGameOver(), + isCheckmate: chess.isCheckmate(), + isDraw: chess.isDraw(), + isStalemate: chess.isStalemate(), + isThreefoldRepetition: chess.isThreefoldRepetition(), + history: chess.history({ verbose: true }) + }; +} diff --git a/v2/package-lock.json b/v2/package-lock.json index c4626fe..0110335 100644 --- a/v2/package-lock.json +++ b/v2/package-lock.json @@ -10,6 +10,453 @@ "dependencies": { "chess.js": "^1.4.0", "fastify": "^5.0.0" + }, + "devDependencies": { + "@types/node": "^22.10.2", + "tsx": "^4.19.2", + "typescript": "^5.7.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, "node_modules/@fastify/ajv-compiler": { @@ -129,6 +576,16 @@ "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", "license": "MIT" }, + "node_modules/@types/node": { + "version": "22.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.11.tgz", + "integrity": "sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, "node_modules/abstract-logging": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", @@ -225,6 +682,48 @@ "node": ">=6" } }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", @@ -342,6 +841,34 @@ "node": ">=20" } }, + "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/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/ipaddr.js": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", @@ -499,6 +1026,16 @@ "node": ">=0.10.0" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/ret": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", @@ -624,6 +1161,47 @@ "engines": { "node": ">=12" } + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" } } } diff --git a/v2/package.json b/v2/package.json index d07e939..ad0c1da 100644 --- a/v2/package.json +++ b/v2/package.json @@ -5,11 +5,17 @@ "type": "module", "description": "Modern rewrite of chess-api", "scripts": { - "dev": "node src/server.mjs", - "start": "node src/server.mjs" + "dev": "tsx src/server.ts", + "build": "tsc -p tsconfig.json", + "start": "node dist/server.js" }, "dependencies": { "chess.js": "^1.4.0", "fastify": "^5.0.0" + }, + "devDependencies": { + "typescript": "^5.7.3", + "tsx": "^4.19.2", + "@types/node": "^22.10.2" } -} +} \ No newline at end of file diff --git a/v2/src/server.mjs b/v2/src/server.ts similarity index 61% rename from v2/src/server.mjs rename to v2/src/server.ts index c2f822c..744d665 100644 --- a/v2/src/server.mjs +++ b/v2/src/server.ts @@ -1,5 +1,5 @@ import Fastify from 'fastify'; -import { createGame, getGame, toState } from './store.mjs'; +import { createGame, getGame, toState } from './store.js'; const app = Fastify({ logger: true }); @@ -20,39 +20,45 @@ app.get('/v2', async () => ({ })); app.post('/v2/games', async (req, reply) => { - const body = req.body || {}; - const game = createGame({ fen: body.fen, mode: body.mode || 'pvp' }); + const body = (req.body ?? {}) as { fen?: string; mode?: 'pvp' | 'pve' }; + const game = createGame({ fen: body.fen, mode: body.mode ?? 'pvp' }); reply.code(201); return toState(game); }); app.get('/v2/games/:id', async (req, reply) => { - const game = getGame(req.params.id); + const params = req.params as { id: string }; + const game = getGame(params.id); if (!game) return reply.code(404).send({ error: 'Game not found' }); return toState(game); }); app.get('/v2/games/:id/moves', async (req, reply) => { - const game = getGame(req.params.id); + const params = req.params as { id: string }; + const query = (req.query ?? {}) as { from?: string }; + const game = getGame(params.id); if (!game) return reply.code(404).send({ error: 'Game not found' }); - const from = req.query?.from; - const moves = game.chess.moves(from ? { square: from, verbose: true } : { verbose: true }); + const moves = query.from + ? game.chess.moves({ square: query.from as never }) + : game.chess.moves(); return { gameId: game.id, count: moves.length, moves }; }); app.post('/v2/games/:id/moves', async (req, reply) => { - const game = getGame(req.params.id); + const params = req.params as { id: string }; + const body = (req.body ?? {}) as { from?: string; to?: string; promotion?: string; san?: string }; + const game = getGame(params.id); if (!game) return reply.code(404).send({ error: 'Game not found' }); - const { from, to, promotion = 'q', san } = req.body || {}; + const { from, to, promotion = 'q', san } = body; if (!san && (!from || !to)) { return reply.code(400).send({ error: 'Provide san OR from+to' }); } const move = san ? game.chess.move(san) - : game.chess.move({ from, to, promotion }); + : game.chess.move({ from: from!, to: to!, promotion: promotion as 'q' | 'r' | 'b' | 'n' }); if (!move) return reply.code(422).send({ error: 'Illegal move' }); diff --git a/v2/src/store.mjs b/v2/src/store.ts similarity index 65% rename from v2/src/store.mjs rename to v2/src/store.ts index c23be2c..ea5204c 100644 --- a/v2/src/store.mjs +++ b/v2/src/store.ts @@ -1,14 +1,24 @@ import { Chess } from 'chess.js'; import crypto from 'node:crypto'; -const games = new Map(); +export type GameMode = 'pvp' | 'pve'; -export function createGame({ fen, mode = 'pvp' } = {}) { +export interface Game { + id: string; + mode: GameMode; + chess: Chess; + createdAt: string; + updatedAt: string; +} + +const games = new Map(); + +export function createGame({ fen, mode = 'pvp' }: { fen?: string; mode?: GameMode } = {}): Game { const chess = new Chess(); if (fen) chess.load(fen); const id = crypto.randomUUID(); - const game = { + const game: Game = { id, mode, chess, @@ -20,11 +30,11 @@ export function createGame({ fen, mode = 'pvp' } = {}) { return game; } -export function getGame(id) { +export function getGame(id: string): Game | undefined { return games.get(id); } -export function toState(game) { +export function toState(game: Game) { const { chess, id, mode, createdAt, updatedAt } = game; return { id, diff --git a/v2/tsconfig.json b/v2/tsconfig.json new file mode 100644 index 0000000..87e9440 --- /dev/null +++ b/v2/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "outDir": "dist", + "types": ["node"] + }, + "include": ["src/**/*.ts"] +} From 4778b672d4324d1cab89af93558f585b97dd3dfd Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 19:13:18 +0100 Subject: [PATCH 03/59] refactor(v1): remove highscore routes and clean legacy route wiring --- api/routes/apiRoutes.js | 176 ++++++++++------------------------------ index.js | 37 ++------- 2 files changed, 52 insertions(+), 161 deletions(-) diff --git a/api/routes/apiRoutes.js b/api/routes/apiRoutes.js index 9ef16e6..0268f4d 100644 --- a/api/routes/apiRoutes.js +++ b/api/routes/apiRoutes.js @@ -3,135 +3,49 @@ var express = require('express'); module.exports = function(app) { - var highScoresController = require('../controllers/highScoresController'); - var chessOnePlayerController = require('../controllers/chessOnePlayerController'); - var chessTwoPlayersController = require('../controllers/chessTwoPlayersController'); - - var apiRouter = express.Router(); - var versionRouter = express.Router(); - - app.use('/api', apiRouter); - apiRouter.use("/v1", versionRouter); - - - /** Chess routes **/ - - /** Player vs. Computer game mode **/ - versionRouter.route('/chess/one') - .get(chessOnePlayerController.startNewGame); - - versionRouter.route('/chess/one/moves') - .post(chessOnePlayerController.listPosibleMoves); - - versionRouter.route('/chess/one/move/player') - .post(chessOnePlayerController.move); - - versionRouter.route('/chess/one/move/ai') - .post(chessOnePlayerController.moveAI); - - versionRouter.route('/chess/one/check') - .post(chessOnePlayerController.checkGameOver); - - versionRouter.route('/chess/one/check-position') - .post(chessOnePlayerController.checkPosition); - - versionRouter.route('/chess/one/fen') - .post(chessOnePlayerController.returnFEN); - - versionRouter.route('/chess/one/turn') - .post(chessOnePlayerController.returnTurn); - - versionRouter.route('/chess/one/ascii') - .post(chessOnePlayerController.returnAscii); - - versionRouter.route('/chess/one/pgn') - .post(chessOnePlayerController.returnPgn); - - versionRouter.route('/chess/one/load/over/fen') - .post(chessOnePlayerController.loadFenOverCurrent); - - versionRouter.route('/chess/one/load/over/pgn') - .post(chessOnePlayerController.loadPgnOverCurrent); - - versionRouter.route('/chess/one/clear') - .post(chessOnePlayerController.clearBoard); - - versionRouter.route('/chess/one/reset') - .post(chessOnePlayerController.resetBoard); - - versionRouter.route('/chess/one/undo') - .post(chessOnePlayerController.undoLastMove); - - versionRouter.route('/chess/one/start/fen') - .post(chessOnePlayerController.startNewGameWithFEN); - - versionRouter.route('/chess/one/start/pgn') - .post(chessOnePlayerController.startNewGameWithFEN); - - - - - - - /** Player vs. Player game mode **/ - versionRouter.route('/chess/two') - .get(chessTwoPlayersController.startNewGame); - - versionRouter.route('/chess/two/moves') - .post(chessTwoPlayersController.listPosibleMoves); - - versionRouter.route('/chess/two/move') - .post(chessTwoPlayersController.move); - - versionRouter.route('/chess/two/check') - .post(chessTwoPlayersController.checkGameOver); - - versionRouter.route('/chess/two/check-position') - .post(chessTwoPlayersController.checkPosition); - - versionRouter.route('/chess/two/fen') - .post(chessTwoPlayersController.returnFEN); - - versionRouter.route('/chess/two/turn') - .post(chessTwoPlayersController.returnTurn); - - versionRouter.route('/chess/two/ascii') - .post(chessTwoPlayersController.returnAscii); - - versionRouter.route('/chess/two/pgn') - .post(chessTwoPlayersController.returnPgn); - - versionRouter.route('/chess/two/load/over/fen') - .post(chessTwoPlayersController.loadFenOverCurrent); - - versionRouter.route('/chess/two/load/over/pgn') - .post(chessTwoPlayersController.loadPgnOverCurrent); - - versionRouter.route('/chess/two/clear') - .post(chessTwoPlayersController.clearBoard); - - versionRouter.route('/chess/two/reset') - .post(chessTwoPlayersController.resetBoard); - - versionRouter.route('/chess/two/undo') - .post(chessTwoPlayersController.undoLastMove); - - versionRouter.route('/chess/two/start/fen') - .post(chessTwoPlayersController.startNewGameWithFEN); - - versionRouter.route('/chess/two/start/pgn') - .post(chessTwoPlayersController.startNewGameWithFEN); - - - /** Highscores routes **/ - - versionRouter.route('/scoreboard') - .get(highScoresController.createNewLocalScoreboard); - - versionRouter.route('/highscores') - .post(highScoresController.lisTopHighScores); - - versionRouter.route('/highscores/add') - .post(highScoresController.addNewPlayer); - + var chessOnePlayerController = require('../controllers/chessOnePlayerController'); + var chessTwoPlayersController = require('../controllers/chessTwoPlayersController'); + + var apiRouter = express.Router(); + var versionRouter = express.Router(); + + app.use('/api', apiRouter); + apiRouter.use('/v1', versionRouter); + + // --- Player vs Computer --- + versionRouter.route('/chess/one').get(chessOnePlayerController.startNewGame); + versionRouter.route('/chess/one/moves').post(chessOnePlayerController.listPosibleMoves); + versionRouter.route('/chess/one/move/player').post(chessOnePlayerController.move); + versionRouter.route('/chess/one/move/ai').post(chessOnePlayerController.moveAI); + versionRouter.route('/chess/one/check').post(chessOnePlayerController.checkGameOver); + versionRouter.route('/chess/one/check-position').post(chessOnePlayerController.checkPosition); + versionRouter.route('/chess/one/fen').post(chessOnePlayerController.returnFEN); + versionRouter.route('/chess/one/turn').post(chessOnePlayerController.returnTurn); + versionRouter.route('/chess/one/ascii').post(chessOnePlayerController.returnAscii); + versionRouter.route('/chess/one/pgn').post(chessOnePlayerController.returnPgn); + versionRouter.route('/chess/one/load/over/fen').post(chessOnePlayerController.loadFenOverCurrent); + versionRouter.route('/chess/one/load/over/pgn').post(chessOnePlayerController.loadPgnOverCurrent); + versionRouter.route('/chess/one/clear').post(chessOnePlayerController.clearBoard); + versionRouter.route('/chess/one/reset').post(chessOnePlayerController.resetBoard); + versionRouter.route('/chess/one/undo').post(chessOnePlayerController.undoLastMove); + versionRouter.route('/chess/one/start/fen').post(chessOnePlayerController.startNewGameWithFEN); + versionRouter.route('/chess/one/start/pgn').post(chessOnePlayerController.startNewGameWithPgn); + + // --- Player vs Player --- + versionRouter.route('/chess/two').get(chessTwoPlayersController.startNewGame); + versionRouter.route('/chess/two/moves').post(chessTwoPlayersController.listPosibleMoves); + versionRouter.route('/chess/two/move').post(chessTwoPlayersController.move); + versionRouter.route('/chess/two/check').post(chessTwoPlayersController.checkGameOver); + versionRouter.route('/chess/two/check-position').post(chessTwoPlayersController.checkPosition); + versionRouter.route('/chess/two/fen').post(chessTwoPlayersController.returnFEN); + versionRouter.route('/chess/two/turn').post(chessTwoPlayersController.returnTurn); + versionRouter.route('/chess/two/ascii').post(chessTwoPlayersController.returnAscii); + versionRouter.route('/chess/two/pgn').post(chessTwoPlayersController.returnPgn); + versionRouter.route('/chess/two/load/over/fen').post(chessTwoPlayersController.loadFenOverCurrent); + versionRouter.route('/chess/two/load/over/pgn').post(chessTwoPlayersController.loadPgnOverCurrent); + versionRouter.route('/chess/two/clear').post(chessTwoPlayersController.clearBoard); + versionRouter.route('/chess/two/reset').post(chessTwoPlayersController.resetBoard); + versionRouter.route('/chess/two/undo').post(chessTwoPlayersController.undoLastMove); + versionRouter.route('/chess/two/start/fen').post(chessTwoPlayersController.startNewGameWithFEN); + versionRouter.route('/chess/two/start/pgn').post(chessTwoPlayersController.startNewGameWithPgn); }; diff --git a/index.js b/index.js index 813e91d..737c64d 100644 --- a/index.js +++ b/index.js @@ -2,27 +2,13 @@ var express = require('express'); var bodyParser = require('body-parser'); -var dataBase = require('./api/models/db'); +require('./api/models/db'); + var routesApi = require('./api/routes/apiRoutes'); var app = express(); -var player = require('./api/models/playerModel'); -var status = require('./api/models/chessboardModel'); var port = process.env.PORT || 3000; - -// var server = app.listen(3000, function () { -// var host = server.address().address; -// host = (host === '::' ? 'localhost' : host); -// var port = server.address().port; -// -// console.log('Listening at: http://%s:%s', host, port); -// -// }); - - - - -app.get('/', function (req, res) { +app.get('/', function(req, res) { res.send('

Up and running.

'); }); @@ -31,18 +17,9 @@ app.use(bodyParser.json()); routesApi(app); -app.listen(port); -console.log("Up and running on port: " + port); - - - - - - - -/** Error handling **/ - app.use(function(req, res) { - res.status(404).send({error: 'Url not found!', url: req.originalUrl}) - + res.status(404).send({ error: 'Url not found!', url: req.originalUrl }); }); + +app.listen(port); +console.log('Up and running on port: ' + port); From 1d8d8ade947de4c374d7f1b3a98c73f7c1ebe232 Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 19:18:47 +0100 Subject: [PATCH 04/59] feat(v2): redesign clean game API and add timed chess clocks --- v2/README.md | 64 ++++++++++----- v2/dist/server.js | 88 ++++++++++++-------- v2/dist/store.js | 159 +++++++++++++++++++++++++++++++----- v2/src/server.ts | 117 +++++++++++++++++++-------- v2/src/store.ts | 200 +++++++++++++++++++++++++++++++++++++++++----- 5 files changed, 501 insertions(+), 127 deletions(-) diff --git a/v2/README.md b/v2/README.md index 5c62b84..5e821ff 100644 --- a/v2/README.md +++ b/v2/README.md @@ -1,13 +1,13 @@ -# chess-api v2 (alpha) +# chess-api v2 (TypeScript) -Modern rewrite of `anzemur/chess-api`. +Modern general-purpose chess API rewrite. -## Why v2 +## Goals -- cleaner resource model (`/v2/games`) -- modern runtime (Node + Fastify + chess.js 1.x) -- explicit game state payloads -- easier to extend for auth, persistence, multiplayer rooms, ratings +- clean, minimal routes for external users +- player-vs-player and player-vs-engine support +- timed games with clocks + increment +- easy path to persistence/auth later ## Run @@ -17,19 +17,29 @@ npm install npm run dev ``` -## API +## Core API ### Create game `POST /v2/games` -Body (optional): +Example body: ```json -{ "mode": "pvp", "fen": "..." } +{ + "mode": "pve", + "aiColor": "b", + "timeControl": { + "initialSeconds": 300, + "incrementSeconds": 2 + } +} ``` -### Get state +### Get game state `GET /v2/games/:id` +### Delete game +`DELETE /v2/games/:id` + ### List legal moves `GET /v2/games/:id/moves` `GET /v2/games/:id/moves?from=e2` @@ -37,19 +47,35 @@ Body (optional): ### Make move `POST /v2/games/:id/moves` -Body: +Body (one of): ```json { "from": "e2", "to": "e4" } ``` -or ```json { "san": "Nf3" } ``` -## Next steps to ship beta +### Ask engine to move (pve mode) +`POST /v2/games/:id/ai-move` + +### Resign +`POST /v2/games/:id/resign` + +```json +{ "color": "w" } +``` + +## Time controls + +When enabled, each game tracks: +- white and black remaining time +- running side clock +- increment per move +- timeout result when a clock reaches 0 + +## Next -1. persistence (Redis/Postgres) -2. auth + rate limiting -3. one-player engine endpoint -4. tests + OpenAPI + CI -5. migration shim from v1 routes +- add persistence (Redis/Postgres) +- add OpenAPI schema + validation +- add tests + CI +- add stronger chess engine for pve mode diff --git a/v2/dist/server.js b/v2/dist/server.js index ce21711..d918bfb 100644 --- a/v2/dist/server.js +++ b/v2/dist/server.js @@ -1,61 +1,85 @@ import Fastify from 'fastify'; -import { createGame, getGame, toState } from './store.js'; +import { aiMove, createGame, deleteGame, getGame, legalMoves, makeMove, resign, state } from './store.js'; const app = Fastify({ logger: true }); -app.get('/', async () => ({ - ok: true, - service: 'chess-api-v2', - docs: '/v2' -})); +app.get('/', async () => ({ ok: true, service: 'chess-api-v2', docs: '/v2' })); app.get('/v2', async () => ({ - message: 'chess-api v2', + message: 'General Chess API v2', endpoints: [ 'POST /v2/games', 'GET /v2/games/:id', + 'DELETE /v2/games/:id', + 'GET /v2/games/:id/moves?from=e2', 'POST /v2/games/:id/moves', - 'GET /v2/games/:id/moves?from=e2' + 'POST /v2/games/:id/ai-move', + 'POST /v2/games/:id/resign' ] })); app.post('/v2/games', async (req, reply) => { const body = (req.body ?? {}); - const game = createGame({ fen: body.fen, mode: body.mode ?? 'pvp' }); + const game = createGame({ + mode: body.mode ?? 'pvp', + fen: body.fen, + aiColor: body.aiColor, + timeControl: body.timeControl + }); reply.code(201); - return toState(game); + return state(game); }); app.get('/v2/games/:id', async (req, reply) => { - const params = req.params; - const game = getGame(params.id); + const { id } = req.params; + const game = getGame(id); if (!game) return reply.code(404).send({ error: 'Game not found' }); - return toState(game); + return state(game); +}); +app.delete('/v2/games/:id', async (req, reply) => { + const { id } = req.params; + const ok = deleteGame(id); + if (!ok) + return reply.code(404).send({ error: 'Game not found' }); + return reply.code(204).send(); }); app.get('/v2/games/:id/moves', async (req, reply) => { - const params = req.params; - const query = (req.query ?? {}); - const game = getGame(params.id); + const { id } = req.params; + const { from } = (req.query ?? {}); + const game = getGame(id); if (!game) return reply.code(404).send({ error: 'Game not found' }); - const moves = query.from - ? game.chess.moves({ square: query.from }) - : game.chess.moves(); - return { gameId: game.id, count: moves.length, moves }; + const moves = legalMoves(game, from); + return { gameId: id, from: from ?? null, count: moves.length, moves }; }); app.post('/v2/games/:id/moves', async (req, reply) => { - const params = req.params; + const { id } = req.params; + const body = (req.body ?? {}); + const game = getGame(id); + if (!game) + return reply.code(404).send({ error: 'Game not found' }); + const result = makeMove(game, body); + if ('error' in result) + return reply.code(422).send(result); + return { move: result.move, state: state(game) }; +}); +app.post('/v2/games/:id/ai-move', async (req, reply) => { + const { id } = req.params; + const game = getGame(id); + if (!game) + return reply.code(404).send({ error: 'Game not found' }); + const result = aiMove(game); + if ('error' in result) + return reply.code(422).send(result); + return { move: result.move, state: state(game) }; +}); +app.post('/v2/games/:id/resign', async (req, reply) => { + const { id } = req.params; const body = (req.body ?? {}); - const game = getGame(params.id); + const game = getGame(id); if (!game) return reply.code(404).send({ error: 'Game not found' }); - const { from, to, promotion = 'q', san } = body; - if (!san && (!from || !to)) { - return reply.code(400).send({ error: 'Provide san OR from+to' }); + if (!body.color || !['w', 'b'].includes(body.color)) { + return reply.code(400).send({ error: 'color must be w or b' }); } - const move = san - ? game.chess.move(san) - : game.chess.move({ from: from, to: to, promotion: promotion }); - if (!move) - return reply.code(422).send({ error: 'Illegal move' }); - game.updatedAt = new Date().toISOString(); - return { move, state: toState(game) }; + resign(game, body.color); + return state(game); }); const port = Number(process.env.PORT || 3000); app.listen({ port, host: '0.0.0.0' }).then(() => { diff --git a/v2/dist/store.js b/v2/dist/store.js index 6a0a157..a02f9fc 100644 --- a/v2/dist/store.js +++ b/v2/dist/store.js @@ -1,17 +1,41 @@ import { Chess } from 'chess.js'; import crypto from 'node:crypto'; const games = new Map(); -export function createGame({ fen, mode = 'pvp' } = {}) { +function nowIso() { + return new Date().toISOString(); +} +function nowMs() { + return Date.now(); +} +function opposite(c) { + return c === 'w' ? 'b' : 'w'; +} +export function createGame(input = {}) { const chess = new Chess(); - if (fen) - chess.load(fen); + if (input.fen) + chess.load(input.fen); const id = crypto.randomUUID(); + const turn = chess.turn(); const game = { id, - mode, + mode: input.mode ?? 'pvp', chess, - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString() + createdAt: nowIso(), + updatedAt: nowIso(), + status: 'active', + timeControl: input.timeControl + ? { + initialMs: Math.max(1, input.timeControl.initialSeconds) * 1000, + incrementMs: Math.max(0, input.timeControl.incrementSeconds ?? 0) * 1000, + remaining: { + w: Math.max(1, input.timeControl.initialSeconds) * 1000, + b: Math.max(1, input.timeControl.initialSeconds) * 1000 + }, + running: turn, + lastTickAt: nowMs() + } + : null, + aiColor: (input.mode ?? 'pvp') === 'pve' ? input.aiColor ?? 'b' : null }; games.set(id, game); return game; @@ -19,21 +43,114 @@ export function createGame({ fen, mode = 'pvp' } = {}) { export function getGame(id) { return games.get(id); } -export function toState(game) { - const { chess, id, mode, createdAt, updatedAt } = game; +export function deleteGame(id) { + return games.delete(id); +} +function finishIfGameOver(game) { + if (!game.chess.isGameOver()) + return; + game.status = 'finished'; + if (game.chess.isCheckmate()) { + game.result = { reason: 'checkmate', winner: opposite(game.chess.turn()) }; + return; + } + game.result = { reason: 'draw', winner: null }; +} +function applyClockTick(game) { + if (!game.timeControl || game.status !== 'active') + return; + const tc = game.timeControl; + const now = nowMs(); + const elapsed = Math.max(0, now - tc.lastTickAt); + tc.remaining[tc.running] = Math.max(0, tc.remaining[tc.running] - elapsed); + tc.lastTickAt = now; + if (tc.remaining[tc.running] <= 0) { + game.status = 'finished'; + game.result = { reason: 'timeout', winner: opposite(tc.running) }; + } +} +function afterMove(game, mover) { + if (game.timeControl) { + const tc = game.timeControl; + tc.remaining[mover] += tc.incrementMs; + tc.running = game.chess.turn(); + tc.lastTickAt = nowMs(); + } + finishIfGameOver(game); + game.updatedAt = nowIso(); +} +export function legalMoves(game, from) { + applyClockTick(game); + if (game.status !== 'active') + return []; + if (from) + return game.chess.moves({ square: from }); + return game.chess.moves(); +} +export function makeMove(game, payload) { + applyClockTick(game); + if (game.status !== 'active') + return { error: 'Game is already finished' }; + const mover = game.chess.turn(); + const move = payload.san + ? game.chess.move(payload.san) + : payload.from && payload.to + ? game.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) + : null; + if (!move) + return { error: 'Illegal move' }; + afterMove(game, mover); + return { move }; +} +export function aiMove(game) { + applyClockTick(game); + if (game.status !== 'active') + return { error: 'Game is already finished' }; + if (game.mode !== 'pve') + return { error: 'AI move only supported for pve games' }; + if (game.aiColor !== game.chess.turn()) + return { error: 'Not AI turn' }; + const mover = game.chess.turn(); + const moves = game.chess.moves(); + if (!moves.length) { + finishIfGameOver(game); + return { error: 'No legal AI moves' }; + } + const pick = moves[Math.floor(Math.random() * moves.length)]; + const move = game.chess.move(pick); + if (!move) + return { error: 'AI failed to move' }; + afterMove(game, mover); + return { move }; +} +export function resign(game, color) { + if (game.status !== 'active') + return; + game.status = 'finished'; + game.result = { reason: 'resign', winner: opposite(color) }; + game.updatedAt = nowIso(); +} +export function state(game) { + applyClockTick(game); return { - id, - mode, - createdAt, - updatedAt, - fen: chess.fen(), - pgn: chess.pgn(), - turn: chess.turn(), - isGameOver: chess.isGameOver(), - isCheckmate: chess.isCheckmate(), - isDraw: chess.isDraw(), - isStalemate: chess.isStalemate(), - isThreefoldRepetition: chess.isThreefoldRepetition(), - history: chess.history({ verbose: true }) + id: game.id, + mode: game.mode, + status: game.status, + result: game.result ?? null, + createdAt: game.createdAt, + updatedAt: game.updatedAt, + fen: game.chess.fen(), + pgn: game.chess.pgn(), + turn: game.chess.turn(), + legalMoveCount: game.chess.moves().length, + history: game.chess.history({ verbose: true }), + timeControl: game.timeControl + ? { + initialMs: game.timeControl.initialMs, + incrementMs: game.timeControl.incrementMs, + remaining: game.timeControl.remaining, + running: game.timeControl.running + } + : null }; } diff --git a/v2/src/server.ts b/v2/src/server.ts index 744d665..4caebab 100644 --- a/v2/src/server.ts +++ b/v2/src/server.ts @@ -1,69 +1,118 @@ import Fastify from 'fastify'; -import { createGame, getGame, toState } from './store.js'; +import { + aiMove, + createGame, + deleteGame, + getGame, + legalMoves, + makeMove, + resign, + state, + type Color, + type GameMode +} from './store.js'; const app = Fastify({ logger: true }); -app.get('/', async () => ({ - ok: true, - service: 'chess-api-v2', - docs: '/v2' -})); +app.get('/', async () => ({ ok: true, service: 'chess-api-v2', docs: '/v2' })); app.get('/v2', async () => ({ - message: 'chess-api v2', + message: 'General Chess API v2', endpoints: [ 'POST /v2/games', 'GET /v2/games/:id', + 'DELETE /v2/games/:id', + 'GET /v2/games/:id/moves?from=e2', 'POST /v2/games/:id/moves', - 'GET /v2/games/:id/moves?from=e2' + 'POST /v2/games/:id/ai-move', + 'POST /v2/games/:id/resign' ] })); app.post('/v2/games', async (req, reply) => { - const body = (req.body ?? {}) as { fen?: string; mode?: 'pvp' | 'pve' }; - const game = createGame({ fen: body.fen, mode: body.mode ?? 'pvp' }); + const body = (req.body ?? {}) as { + mode?: GameMode; + fen?: string; + aiColor?: Color; + timeControl?: { initialSeconds: number; incrementSeconds?: number }; + }; + + const game = createGame({ + mode: body.mode ?? 'pvp', + fen: body.fen, + aiColor: body.aiColor, + timeControl: body.timeControl + }); + reply.code(201); - return toState(game); + return state(game); }); app.get('/v2/games/:id', async (req, reply) => { - const params = req.params as { id: string }; - const game = getGame(params.id); + const { id } = req.params as { id: string }; + const game = getGame(id); if (!game) return reply.code(404).send({ error: 'Game not found' }); - return toState(game); + return state(game); +}); + +app.delete('/v2/games/:id', async (req, reply) => { + const { id } = req.params as { id: string }; + const ok = deleteGame(id); + if (!ok) return reply.code(404).send({ error: 'Game not found' }); + return reply.code(204).send(); }); app.get('/v2/games/:id/moves', async (req, reply) => { - const params = req.params as { id: string }; - const query = (req.query ?? {}) as { from?: string }; - const game = getGame(params.id); + const { id } = req.params as { id: string }; + const { from } = (req.query ?? {}) as { from?: string }; + const game = getGame(id); if (!game) return reply.code(404).send({ error: 'Game not found' }); - const moves = query.from - ? game.chess.moves({ square: query.from as never }) - : game.chess.moves(); - return { gameId: game.id, count: moves.length, moves }; + const moves = legalMoves(game, from); + return { gameId: id, from: from ?? null, count: moves.length, moves }; }); app.post('/v2/games/:id/moves', async (req, reply) => { - const params = req.params as { id: string }; - const body = (req.body ?? {}) as { from?: string; to?: string; promotion?: string; san?: string }; - const game = getGame(params.id); + const { id } = req.params as { id: string }; + const body = (req.body ?? {}) as { + san?: string; + from?: string; + to?: string; + promotion?: 'q' | 'r' | 'b' | 'n'; + }; + + const game = getGame(id); if (!game) return reply.code(404).send({ error: 'Game not found' }); - const { from, to, promotion = 'q', san } = body; - if (!san && (!from || !to)) { - return reply.code(400).send({ error: 'Provide san OR from+to' }); - } + const result = makeMove(game, body); + if ('error' in result) return reply.code(422).send(result); + + return { move: result.move, state: state(game) }; +}); + +app.post('/v2/games/:id/ai-move', async (req, reply) => { + const { id } = req.params as { id: string }; + const game = getGame(id); + if (!game) return reply.code(404).send({ error: 'Game not found' }); + + const result = aiMove(game); + if ('error' in result) return reply.code(422).send(result); - const move = san - ? game.chess.move(san) - : game.chess.move({ from: from!, to: to!, promotion: promotion as 'q' | 'r' | 'b' | 'n' }); + return { move: result.move, state: state(game) }; +}); + +app.post('/v2/games/:id/resign', async (req, reply) => { + const { id } = req.params as { id: string }; + const body = (req.body ?? {}) as { color?: Color }; + const game = getGame(id); + if (!game) return reply.code(404).send({ error: 'Game not found' }); - if (!move) return reply.code(422).send({ error: 'Illegal move' }); + if (!body.color || !['w', 'b'].includes(body.color)) { + return reply.code(400).send({ error: 'color must be w or b' }); + } - game.updatedAt = new Date().toISOString(); - return { move, state: toState(game) }; + resign(game, body.color); + return state(game); }); const port = Number(process.env.PORT || 3000); diff --git a/v2/src/store.ts b/v2/src/store.ts index ea5204c..5b5a652 100644 --- a/v2/src/store.ts +++ b/v2/src/store.ts @@ -1,7 +1,16 @@ -import { Chess } from 'chess.js'; +import { Chess, type Square } from 'chess.js'; import crypto from 'node:crypto'; export type GameMode = 'pvp' | 'pve'; +export type Color = 'w' | 'b'; + +export interface TimeControl { + initialMs: number; + incrementMs: number; + remaining: Record; + running: Color; + lastTickAt: number; +} export interface Game { id: string; @@ -9,21 +18,65 @@ export interface Game { chess: Chess; createdAt: string; updatedAt: string; + status: 'active' | 'finished'; + result?: { + reason: 'checkmate' | 'draw' | 'timeout' | 'resign'; + winner: Color | null; + }; + timeControl: TimeControl | null; + aiColor: Color | null; +} + +export interface CreateGameInput { + fen?: string; + mode?: GameMode; + aiColor?: Color; + timeControl?: { + initialSeconds: number; + incrementSeconds?: number; + }; } const games = new Map(); -export function createGame({ fen, mode = 'pvp' }: { fen?: string; mode?: GameMode } = {}): Game { +function nowIso() { + return new Date().toISOString(); +} + +function nowMs() { + return Date.now(); +} + +function opposite(c: Color): Color { + return c === 'w' ? 'b' : 'w'; +} + +export function createGame(input: CreateGameInput = {}): Game { const chess = new Chess(); - if (fen) chess.load(fen); + if (input.fen) chess.load(input.fen); const id = crypto.randomUUID(); + const turn = chess.turn(); const game: Game = { id, - mode, + mode: input.mode ?? 'pvp', chess, - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString() + createdAt: nowIso(), + updatedAt: nowIso(), + status: 'active', + timeControl: input.timeControl + ? { + initialMs: Math.max(1, input.timeControl.initialSeconds) * 1000, + incrementMs: Math.max(0, input.timeControl.incrementSeconds ?? 0) * 1000, + remaining: { + w: Math.max(1, input.timeControl.initialSeconds) * 1000, + b: Math.max(1, input.timeControl.initialSeconds) * 1000 + }, + running: turn, + lastTickAt: nowMs() + } + : null, + aiColor: (input.mode ?? 'pvp') === 'pve' ? input.aiColor ?? 'b' : null }; games.set(id, game); @@ -34,21 +87,126 @@ export function getGame(id: string): Game | undefined { return games.get(id); } -export function toState(game: Game) { - const { chess, id, mode, createdAt, updatedAt } = game; +export function deleteGame(id: string): boolean { + return games.delete(id); +} + +function finishIfGameOver(game: Game) { + if (!game.chess.isGameOver()) return; + + game.status = 'finished'; + if (game.chess.isCheckmate()) { + game.result = { reason: 'checkmate', winner: opposite(game.chess.turn()) }; + return; + } + + game.result = { reason: 'draw', winner: null }; +} + +function applyClockTick(game: Game) { + if (!game.timeControl || game.status !== 'active') return; + + const tc = game.timeControl; + const now = nowMs(); + const elapsed = Math.max(0, now - tc.lastTickAt); + tc.remaining[tc.running] = Math.max(0, tc.remaining[tc.running] - elapsed); + tc.lastTickAt = now; + + if (tc.remaining[tc.running] <= 0) { + game.status = 'finished'; + game.result = { reason: 'timeout', winner: opposite(tc.running) }; + } +} + +function afterMove(game: Game, mover: Color) { + if (game.timeControl) { + const tc = game.timeControl; + tc.remaining[mover] += tc.incrementMs; + tc.running = game.chess.turn(); + tc.lastTickAt = nowMs(); + } + + finishIfGameOver(game); + game.updatedAt = nowIso(); +} + +export function legalMoves(game: Game, from?: string) { + applyClockTick(game); + if (game.status !== 'active') return []; + + if (from) return game.chess.moves({ square: from as Square }); + return game.chess.moves(); +} + +export function makeMove( + game: Game, + payload: { san?: string; from?: string; to?: string; promotion?: 'q' | 'r' | 'b' | 'n' } +) { + applyClockTick(game); + if (game.status !== 'active') return { error: 'Game is already finished' } as const; + + const mover = game.chess.turn(); + const move = payload.san + ? game.chess.move(payload.san) + : payload.from && payload.to + ? game.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) + : null; + + if (!move) return { error: 'Illegal move' } as const; + + afterMove(game, mover); + return { move } as const; +} + +export function aiMove(game: Game) { + applyClockTick(game); + if (game.status !== 'active') return { error: 'Game is already finished' } as const; + if (game.mode !== 'pve') return { error: 'AI move only supported for pve games' } as const; + if (game.aiColor !== game.chess.turn()) return { error: 'Not AI turn' } as const; + + const mover = game.chess.turn(); + const moves = game.chess.moves(); + if (!moves.length) { + finishIfGameOver(game); + return { error: 'No legal AI moves' } as const; + } + + const pick = moves[Math.floor(Math.random() * moves.length)]!; + const move = game.chess.move(pick); + if (!move) return { error: 'AI failed to move' } as const; + + afterMove(game, mover); + return { move } as const; +} + +export function resign(game: Game, color: Color) { + if (game.status !== 'active') return; + game.status = 'finished'; + game.result = { reason: 'resign', winner: opposite(color) }; + game.updatedAt = nowIso(); +} + +export function state(game: Game) { + applyClockTick(game); return { - id, - mode, - createdAt, - updatedAt, - fen: chess.fen(), - pgn: chess.pgn(), - turn: chess.turn(), - isGameOver: chess.isGameOver(), - isCheckmate: chess.isCheckmate(), - isDraw: chess.isDraw(), - isStalemate: chess.isStalemate(), - isThreefoldRepetition: chess.isThreefoldRepetition(), - history: chess.history({ verbose: true }) + id: game.id, + mode: game.mode, + status: game.status, + result: game.result ?? null, + createdAt: game.createdAt, + updatedAt: game.updatedAt, + fen: game.chess.fen(), + pgn: game.chess.pgn(), + turn: game.chess.turn(), + legalMoveCount: game.chess.moves().length, + history: game.chess.history({ verbose: true }), + timeControl: game.timeControl + ? { + initialMs: game.timeControl.initialMs, + incrementMs: game.timeControl.incrementMs, + remaining: game.timeControl.remaining, + running: game.timeControl.running + } + : null }; } From 9a535ead9fcf44c71a3b7ad13e0f8263e82c3abc Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 19:22:02 +0100 Subject: [PATCH 05/59] refactor: replace legacy API with clean TypeScript chess API and timed games --- Procfile | 1 - README.md | 86 +- api/controllers/chessOnePlayerController.js | 692 ------ api/controllers/chessTwoPlayersController.js | 631 ----- api/controllers/highScoresController.js | 59 - api/models/chessboardModel.js | 99 - api/models/db.js | 57 - api/models/playerModel.js | 32 - api/routes/apiRoutes.js | 51 - {v2/dist => dist}/server.js | 0 {v2/dist => dist}/store.js | 0 index.js | 25 - package-lock.json | 2248 +++++++++--------- package.json | 34 +- postman/Chess API.postman_collection.json | 1179 --------- {v2/src => src}/server.ts | 0 {v2/src => src}/store.ts | 0 v2/tsconfig.json => tsconfig.json | 0 v2/README.md | 81 - v2/package-lock.json | 1207 ---------- v2/package.json | 21 - 21 files changed, 1217 insertions(+), 5286 deletions(-) delete mode 100644 Procfile delete mode 100644 api/controllers/chessOnePlayerController.js delete mode 100644 api/controllers/chessTwoPlayersController.js delete mode 100644 api/controllers/highScoresController.js delete mode 100644 api/models/chessboardModel.js delete mode 100644 api/models/db.js delete mode 100644 api/models/playerModel.js delete mode 100644 api/routes/apiRoutes.js rename {v2/dist => dist}/server.js (100%) rename {v2/dist => dist}/store.js (100%) delete mode 100644 index.js delete mode 100644 postman/Chess API.postman_collection.json rename {v2/src => src}/server.ts (100%) rename {v2/src => src}/store.ts (100%) rename v2/tsconfig.json => tsconfig.json (100%) delete mode 100644 v2/README.md delete mode 100644 v2/package-lock.json delete mode 100644 v2/package.json diff --git a/Procfile b/Procfile deleted file mode 100644 index 063b78f..0000000 --- a/Procfile +++ /dev/null @@ -1 +0,0 @@ -web: npm start diff --git a/README.md b/README.md index 1a95171..5e821ff 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,81 @@ -# ♟️ Chess API ♟️ -API for playing chess and highscores storing. Api could be easily used to implement a multiplayer room based chess game, because every instance of a game initilizes new unique game_id. -* ### [API Documentation](https://documenter.getpostman.com/view/1741165/chess-api/7Lof2bk#intro) +# chess-api v2 (TypeScript) -## Feautures: +Modern general-purpose chess API rewrite. -* Player vs. Player game mode -* Player vs. Computer game mode -* Highscores data storing +## Goals +- clean, minimal routes for external users +- player-vs-player and player-vs-engine support +- timed games with clocks + increment +- easy path to persistence/auth later -## Built With +## Run -* [Chess.js](https://github.com/jhlywa/chess.js) -* [ChessCorp Artificial Intelligence: Kong](https://www.npmjs.com/package/chess-ai-kong) +```bash +cd v2 +npm install +npm run dev +``` + +## Core API + +### Create game +`POST /v2/games` + +Example body: +```json +{ + "mode": "pve", + "aiColor": "b", + "timeControl": { + "initialSeconds": 300, + "incrementSeconds": 2 + } +} +``` + +### Get game state +`GET /v2/games/:id` + +### Delete game +`DELETE /v2/games/:id` + +### List legal moves +`GET /v2/games/:id/moves` +`GET /v2/games/:id/moves?from=e2` + +### Make move +`POST /v2/games/:id/moves` + +Body (one of): +```json +{ "from": "e2", "to": "e4" } +``` +```json +{ "san": "Nf3" } +``` + +### Ask engine to move (pve mode) +`POST /v2/games/:id/ai-move` + +### Resign +`POST /v2/games/:id/resign` + +```json +{ "color": "w" } +``` + +## Time controls + +When enabled, each game tracks: +- white and black remaining time +- running side clock +- increment per move +- timeout result when a clock reaches 0 + +## Next + +- add persistence (Redis/Postgres) +- add OpenAPI schema + validation +- add tests + CI +- add stronger chess engine for pve mode diff --git a/api/controllers/chessOnePlayerController.js b/api/controllers/chessOnePlayerController.js deleted file mode 100644 index 2bb4434..0000000 --- a/api/controllers/chessOnePlayerController.js +++ /dev/null @@ -1,692 +0,0 @@ -'use strict'; - -var mongoose = require('mongoose'); -var chessAi = require('chess-ai-kong'); -var Chess = require('chess.js').Chess; -// var chess = null; - -var ChessGame = mongoose.model('Chess'); -var AIMoves = mongoose.model('AIMoves'); -var Moves = mongoose.model('Moves'); -var Status = mongoose.model('Status'); -var status = new Status(); - -// var movesArr = []; - - -exports.startNewGame = function(req, res) { - var chess = new Chess(); - var gameId = mongoose.Types.ObjectId(); - var chessGame = new ChessGame(); - chessGame.chess = chess.fen(); - chessGame.game_id = gameId; - - chessGame.save(function(err, chess) { - if(err) { - res.send(err); - } - var gameStatus = new Status(); - - gameStatus.status = "new game started"; - gameStatus.game_id = gameId; - - res.json(gameStatus); - }); - - // printChessboard(); - -}; - - -exports.startNewGameWithFEN = function(req, res) { - - var fenString = req.body.fen; - var chess = new Chess(); - var validation = chess.validate_fen(fenString); - - if(validation.valid) { - - chess.load(fenString); - var gameId = mongoose.Types.ObjectId(); - var chessGame = new ChessGame(); - chessGame.chess = chess.fen(); - chessGame.game_id = gameId; - - chessGame.save(function(err, chess) { - if(err) { - res.send(err); - } - var gameStatus = new Status(); - - gameStatus.status = "new game started from FEN"; - gameStatus.game_id = gameId; - - res.json(gameStatus); - }); - - // printChessboard(); - - } else { - status.status = "error: invalid FEN string!"; - res.json(status); - - } -}; - - -exports.startNewGameWithPgn = function(req, res) { - - var pgnString = req.body.pgn; - var chess = new Chess(); - var valid = chess.load_pgn(pgnString); - - if(valid) { - - chess.load_pgn(pgnString); - var gameId = mongoose.Types.ObjectId(); - var chessGame = new ChessGame(); - chessGame.chess = chess.fen(); - chessGame.game_id = gameId; - - chessGame.save(function(err, chess) { - if(err) { - res.send(err); - } - var gameStatus = new Status(); - - gameStatus.status = "new game started from pgn"; - gameStatus.game_id = gameId; - - res.json(gameStatus); - }); - - // printChessboard(); - - } else { - status.status = "error: invalid pgn string!"; - res.json(status); - - } - - -}; - -/** Params: a pgn position in json as {position: currentPosition} **/ -exports.listPosibleMoves = function(req, res) { - - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - if(currentGame != null){ - - var chess = new Chess(currentGame.chess); - - if(chess != null) { - - var sq = req.body.position; - var moves = new Moves(); - - var posibleMoves = chess.moves({square: sq}); - - for(var i = 0; i < posibleMoves.length; i++) { - if(posibleMoves[i].length > 2) { - var tmp = posibleMoves[i]; - while(tmp.length > 2) { - tmp = tmp.substring(1); - } - posibleMoves[i] = tmp; - } - } - - moves.moves = posibleMoves; - res.json(moves); - - } else { - status.status = "error: chess was not initialized!"; - res.json(status); - - } - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - - // printChessboard(chess); - }); - - - getChess(gameId, function(currentGame) { - // .... - }); -}; - -/** Params: from(pgn currentPosition) -> to(pgn desiredPosition) **/ -exports.move = function(req, res) { - - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var movesArr = currentGame.chess_moves; - - if(chess != null) { - var fromSq = req.body.from; - var toSq = req.body.to; - - var move = chess.move({ from: fromSq, to: toSq }); - - if(move != null) { - - movesArr.push(move.san); - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen() , - chess_moves: movesArr - }, - - function (err, chess){ - if(err) { - res.send(err); - } - status.status = "figure moved"; - res.json(status); - }); - - // printChessboard(chess); - - } else { - status.status = "error: invalid move!"; - res.json(status); - } - - } else { - status.status = "error: chess was not initialized!"; - res.json(status); - - } - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - -exports.checkGameOver = function(req, res) { - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - - if(chess != null) { - if(chess.game_over()) { - status.game_over_status = true; - - if(chess.in_checkmate()) { - status.status = "check mate"; - res.json(status); - console.log("Check mate!"); - - } else if (chess.in_draw()) { - status.status = "draw"; - res.json(status); - console.log("Draw!"); - - } else if (chess.in_stalemate()) { - status.status = "in stalemate"; - res.json(status); - - } else if (chess.in_threefold_repetition()) { - status.status = "in threefold repetition"; - res.json(status); - - } else if (chess.insufficient_material()) { - status.status = "insufficient material"; - res.json(status); - - } - - chess.clear(); - - } else { - status.status = "game continues" - res.json(status); - - } - - } else { - status.status = "error: chess was not initialized!"; - res.json(status); - - } - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - -exports.checkPosition = function(req, res) { - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var positionStatus = new Status(); - - positionStatus.position = chess.get(res.body.position) - res.json(positionStatus); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - -exports.moveAI = function(req, res) { - - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - - var chess = new Chess(currentGame.chess); - var movesArr = currentGame.chess_moves; - - if(chess != null) { - var move = chessAi.play(movesArr); - var makeMove = chess.move(move); - - if(makeMove != null) { - - var from = makeMove.from; - var to = makeMove.to; - movesArr.push(makeMove.san); - - - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen() , - chess_moves: movesArr - }, - - function (err, chess){ - if(err) { - res.send(err); - } - var aiMoves = new AIMoves(); - aiMoves.status = "AI moved!"; - aiMoves.to = to; - aiMoves.from = from; - - res.json(aiMoves); - }); - - printChessboard(chess); - - } else { - status.status = "error: invalid move!"; - res.json(status); - } - - } else { - status.status = "error: chess was not initialized!"; - res.json(status); - } - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - - }); -}; - - -exports.returnFEN = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var fenStatus = new Status(); - - fenStatus.fen_string = chess.fen(); - res.json(fenStatus); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - - -exports.returnAscii = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var asciiStatus = new Status(); - - asciiStatus.ascii = chess.ascii(); - res.json(asciiStatus); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - -exports.returnPgn = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var pgnStatus = new Status(); - - pgnStatus.pgn = chess.pgn(); - res.json(pgnStatus); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - -exports.undoLastMove = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var movesArr = currentGame.chess_moves; - var succes = chess.undo(); - console.log(succes); - if(succes != null) { - movesArr.pop(); - - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen(), - chess_moves: movesArr - }, - - function (err, chess){ - if(err) { - res.send(err); - } - - status.status = "move undone"; - res.json(status); - }); - - - } else { - status.status = "error: couldn't undo the move!"; - res.json(status); - } - printChessboard(chess); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - } - }); -}; - - - - -exports.resetBoard = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - chess.reset(); - - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen() - }, - - function (err, chess){ - if(err) { - res.send(err); - } - - status.status = "board reseted"; - res.json(status); - }); - - printChessboard(chess); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - - - -exports.clearBoard = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - chess.clear(); - - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen() - }, - - function (err, chess){ - if(err) { - res.send(err); - } - - status.status = "board cleared"; - res.json(status); - }); - - printChessboard(chess); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - -exports.loadFenOverCurrent = function(req, res){ - var gameId = req.body.game_id; - var fenString = req.body.fen; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var validation = chess.validate_fen(fenString); - - if(validation.valid) { - - chess.load(fenString); - - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen(), - chess_moves: [] - }, - - function (err, chess){ - if(err) { - res.send(err); - } - - status.status = "FEN loaded!"; - res.json(status); - }); - - // printChessboard(chess); - - } else { - status.status = "error: invalid FEN string!"; - res.json(status); - - } - - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - -exports.loadPgnOverCurrent = function(req, res){ - var gameId = req.body.game_id; - var pgnString = req.body.pgn; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var valid = chess.load_pgn(pgnString); - - if(valid) { - - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen(), - chess_moves: [] - }, - - function (err, chess){ - if(err) { - res.send(err); - } - - status.status = "Pgn loaded!"; - res.json(status); - }); - - // printChessboard(chess); - - } else { - status.status = "error: invalid pgn string!"; - res.json(status); - - } - - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - - - - -exports.returnTurn = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var turnStatus = new Status(); - - turnStatus.turn = chess.turn(); - res.json(turnStatus); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - - - - - -function getChess(gameId, callback) { - ChessGame.findOne({ game_id: gameId }, function(err, chessGame) { - if(err) { - return null; - } - callback(chessGame); - }); -} - -// TODO : .get(square) -// .header() - - -// .put(piece, square) -// remove(square) - -// .square_color(square) - -// .validate_fen(fen): - - - - - -function printChessboard(chess) { - console.log(); - console.log("##########################################"); - console.log(); - console.log(chess.ascii()); - - var turn = "" - if(chess.turn() == "w") { - turn = "white"; - } else { - turn = "black"; - } - - console.log("Turn: " + turn ); -} diff --git a/api/controllers/chessTwoPlayersController.js b/api/controllers/chessTwoPlayersController.js deleted file mode 100644 index f39e68b..0000000 --- a/api/controllers/chessTwoPlayersController.js +++ /dev/null @@ -1,631 +0,0 @@ -'use strict'; - -var mongoose = require('mongoose'); -var chessAi = require('chess-ai-kong'); -var Chess = require('chess.js').Chess; -// var chess = null; - -var ChessGame = mongoose.model('Chess'); -var AIMoves = mongoose.model('AIMoves'); -var Moves = mongoose.model('Moves'); -var Status = mongoose.model('Status'); -var status = new Status(); - -// var movesArr = []; - - -exports.startNewGame = function(req, res) { - var chess = new Chess(); - var gameId = mongoose.Types.ObjectId(); - var chessGame = new ChessGame(); - chessGame.chess = chess.fen(); - chessGame.game_id = gameId; - - chessGame.save(function(err, chess) { - if(err) { - res.send(err); - } - var gameStatus = new Status(); - - gameStatus.status = "new game started"; - gameStatus.game_id = gameId; - - res.json(gameStatus); - }); - - // printChessboard(); - -}; - - -exports.startNewGameWithFEN = function(req, res) { - - var fenString = req.body.fen; - var chess = new Chess(); - var validation = chess.validate_fen(fenString); - - if(validation.valid) { - - chess.load(fenString); - var gameId = mongoose.Types.ObjectId(); - var chessGame = new ChessGame(); - chessGame.chess = chess.fen(); - chessGame.game_id = gameId; - - chessGame.save(function(err, chess) { - if(err) { - res.send(err); - } - var gameStatus = new Status(); - - gameStatus.status = "new game started from FEN"; - gameStatus.game_id = gameId; - - res.json(gameStatus); - }); - - // printChessboard(); - - } else { - status.status = "error: invalid FEN string!"; - res.json(status); - - } -}; - - -exports.startNewGameWithPgn = function(req, res) { - - var pgnString = req.body.pgn; - var chess = new Chess(); - var valid = chess.load_pgn(pgnString); - - if(valid) { - - chess.load_pgn(pgnString); - var gameId = mongoose.Types.ObjectId(); - var chessGame = new ChessGame(); - chessGame.chess = chess.fen(); - chessGame.game_id = gameId; - - chessGame.save(function(err, chess) { - if(err) { - res.send(err); - } - var gameStatus = new Status(); - - gameStatus.status = "new game started from pgn"; - gameStatus.game_id = gameId; - - res.json(gameStatus); - }); - - // printChessboard(); - - } else { - status.status = "error: invalid pgn string!"; - res.json(status); - - } - - -}; - -/** Params: a pgn position in json as {position: currentPosition} **/ -exports.listPosibleMoves = function(req, res) { - - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - if(currentGame != null){ - - var chess = new Chess(currentGame.chess); - - if(chess != null) { - - var sq = req.body.position; - var moves = new Moves(); - - var posibleMoves = chess.moves({square: sq}); - - for(var i = 0; i < posibleMoves.length; i++) { - if(posibleMoves[i].length > 2) { - var tmp = posibleMoves[i]; - while(tmp.length > 2) { - tmp = tmp.substring(1); - } - posibleMoves[i] = tmp; - } - } - - moves.moves = posibleMoves; - res.json(moves); - - } else { - status.status = "error: chess was not initialized!"; - res.json(status); - - } - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - - // printChessboard(chess); - }); - - - getChess(gameId, function(currentGame) { - // .... - }); -}; - -/** Params: from(pgn currentPosition) -> to(pgn desiredPosition) **/ -exports.move = function(req, res) { - - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var movesArr = currentGame.chess_moves; - - if(chess != null) { - var fromSq = req.body.from; - var toSq = req.body.to; - - var move = chess.move({ from: fromSq, to: toSq }); - - if(move != null) { - - movesArr.push(move.san); - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen() , - chess_moves: movesArr - }, - - function (err, chess){ - if(err) { - res.send(err); - } - status.status = "figure moved"; - res.json(status); - }); - - // printChessboard(chess); - - } else { - status.status = "error: invalid move!"; - res.json(status); - } - - } else { - status.status = "error: chess was not initialized!"; - res.json(status); - - } - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - -exports.checkGameOver = function(req, res) { - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - - if(chess != null) { - if(chess.game_over()) { - status.game_over_status = true; - - if(chess.in_checkmate()) { - status.status = "check mate"; - res.json(status); - console.log("Check mate!"); - - } else if (chess.in_draw()) { - status.status = "draw"; - res.json(status); - console.log("Draw!"); - - } else if (chess.in_stalemate()) { - status.status = "in stalemate"; - res.json(status); - - } else if (chess.in_threefold_repetition()) { - status.status = "in threefold repetition"; - res.json(status); - - } else if (chess.insufficient_material()) { - status.status = "insufficient material"; - res.json(status); - - } - - chess.clear(); - - } else { - status.status = "game continues" - res.json(status); - - } - - } else { - status.status = "error: chess was not initialized!"; - res.json(status); - - } - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - -exports.checkPosition = function(req, res) { - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var positionStatus = new Status(); - - positionStatus.position = chess.get(res.body.position) - res.json(positionStatus); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - -exports.returnFEN = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var fenStatus = new Status(); - - fenStatus.fen_string = chess.fen(); - res.json(fenStatus); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - - -exports.returnAscii = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var asciiStatus = new Status(); - - asciiStatus.ascii = chess.ascii(); - res.json(asciiStatus); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - -exports.returnPgn = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var pgnStatus = new Status(); - - pgnStatus.pgn = chess.pgn(); - res.json(pgnStatus); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - -exports.undoLastMove = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var movesArr = currentGame.chess_moves; - var succes = chess.undo(); - if(succes != null) { - movesArr.pop(); - - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen(), - chess_moves: movesArr - }, - - function (err, chess){ - if(err) { - res.send(err); - } - - status.status = "move undone"; - res.json(status); - }); - - - } else { - status.status = "error: couldn't undo the move!"; - res.json(status); - } - printChessboard(chess); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - } - }); -}; - - - - -exports.resetBoard = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - chess.reset(); - - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen() - }, - - function (err, chess){ - if(err) { - res.send(err); - } - - status.status = "board reseted"; - res.json(status); - }); - - printChessboard(chess); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - - - -exports.clearBoard = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - chess.clear(); - - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen() - }, - - function (err, chess){ - if(err) { - res.send(err); - } - - status.status = "board cleared"; - res.json(status); - }); - - printChessboard(chess); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - -exports.loadFenOverCurrent = function(req, res){ - var gameId = req.body.game_id; - var fenString = req.body.fen; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var validation = chess.validate_fen(fenString); - - if(validation.valid) { - - chess.load(fenString); - - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen(), - chess_moves: [] - }, - - function (err, chess){ - if(err) { - res.send(err); - } - - status.status = "FEN loaded!"; - res.json(status); - }); - - // printChessboard(chess); - - } else { - status.status = "error: invalid FEN string!"; - res.json(status); - - } - - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - -exports.loadPgnOverCurrent = function(req, res){ - var gameId = req.body.game_id; - var pgnString = req.body.pgn; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var valid = chess.load_pgn(pgnString); - - if(valid) { - - ChessGame.update({ game_id: gameId }, - { - chess: chess.fen(), - chess_moves: [] - }, - - function (err, chess){ - if(err) { - res.send(err); - } - - status.status = "Pgn loaded!"; - res.json(status); - }); - - // printChessboard(chess); - - } else { - status.status = "error: invalid pgn string!"; - res.json(status); - - } - - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - - - - -exports.returnTurn = function(req, res){ - var gameId = req.body.game_id; - - getChess(gameId, currentGame => { - - if(currentGame != null) { - var chess = new Chess(currentGame.chess); - var turnStatus = new Status(); - - turnStatus.turn = chess.turn(); - res.json(turnStatus); - - } else { - status.status = "error: The game has expired OR you didn't put the game_id as the parameter!"; - res.json(status); - - } - }); -}; - - - - - - -function getChess(gameId, callback) { - ChessGame.findOne({ game_id: gameId }, function(err, chessGame) { - if(err) { - return null; - } - callback(chessGame); - }); -} - -// TODO : .get(square) -// .header() - - -// .put(piece, square) -// remove(square) - -// .square_color(square) - -// .validate_fen(fen): - - - - - -function printChessboard(chess) { - console.log(); - console.log("##########################################"); - console.log(); - console.log(chess.ascii()); - - var turn = "" - if(chess.turn() == "w") { - turn = "white"; - } else { - turn = "black"; - } - - console.log("Turn: " + turn ); -} diff --git a/api/controllers/highScoresController.js b/api/controllers/highScoresController.js deleted file mode 100644 index f6c23fe..0000000 --- a/api/controllers/highScoresController.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -var hhmmss = require('hhmmss'); -var mongoose = require('mongoose'); -var Player = mongoose.model('Player'); -var Status = mongoose.model('Status'); - -var status = new Status(); - -exports.createNewLocalScoreboard = function(req, res) { - var scoreBoardId = mongoose.Types.ObjectId(); - - status.status = "Scoreboard created!"; - status.scoreboard_id = scoreBoardId; - - res.json(status); -}; - - - -exports.addNewPlayer = function(req, res) { - var newPlayer = new Player(req.body); - - newPlayer.save(function(err, player) { - if(err) { - res.send(err); - } - res.json(player); - }); -}; - - - -exports.lisTopHighScores = function(req, res) { - var scoreBoardId = req.body.scoreboard_id; - console.log(scoreBoardId);; - Player.find( - { scoreboard_id: scoreBoardId }, //filter by scoreboard ID - ['name', 'score', 'score_out', 'date', 'date_out'], //Return name, score and date - { - skip: 0, //Start at idx 0 - limit: 5, //finish at idx 5 - sort: { - score: 'asc' //Sort by score, ascending - } - } - - , function(err, topN) { - if(err) res.send(err); - - for(var i in topN) { - var date = ((topN[i].date + '').split('-') + '').split(" "); - topN[i].date_out = date[2] + " " + date[1] + " " + date[3]; - topN[i].score_out = hhmmss(topN[i].score); - } - - res.json(topN); - }); -}; diff --git a/api/models/chessboardModel.js b/api/models/chessboardModel.js deleted file mode 100644 index b3504de..0000000 --- a/api/models/chessboardModel.js +++ /dev/null @@ -1,99 +0,0 @@ -'use strict'; - -var mongoose = require('mongoose'); - -var StatusSchema = new mongoose.Schema({ - status: { - type: String - }, - - game_over_status: { - type: Boolean - }, - - game_id: { - type: String - }, - - fen_string: { - type: String - - }, - - turn: { - type: String - - }, - - ascii: { - type: String - - }, - - pgn: { - type: String - - } - - -}); - -module.exports = mongoose.model('Status', StatusSchema); - - - -var PossibleMovesSchema = new mongoose.Schema({ - moves: [{ - type: String - }] - -}); - -module.exports = mongoose.model('Moves', PossibleMovesSchema); - -var AIMovesSchema = new mongoose.Schema ({ - from: { - type: String - }, - - to: { - type: String - - }, - - status: { - type: String - - } - -}); - - -module.exports = mongoose.model('AIMoves', AIMovesSchema); - - -var ChessSchema = new mongoose.Schema ({ - chess: { - type: String - }, - - chess_moves: [{ - type: String - }], - - game_id: { - type: String - }, - - createAt: { - type: Date, - default: Date.now(), - index: { expires: '2h' }, - expireAfterSeconds: 7200 - } - - -}); - - -module.exports = mongoose.model('Chess', ChessSchema); diff --git a/api/models/db.js b/api/models/db.js deleted file mode 100644 index 560d315..0000000 --- a/api/models/db.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -var mongoose = require('mongoose'); -mongoose.Promise = global.Promise; - -var failedConnections = 0; -var autoReconnect = true; - -//var db_URI = 'mongodb://localhost/ElmChessDb' -var db_URI = 'mongodb://chess_player:chess_player@ds163016.mlab.com:63016/chess-highscores'; -connect(); - -function connect() { - mongoose.connect(db_URI, { useMongoClient: true }); -} - -/** Mongoose is connected **/ -mongoose.connection.on('connected', function() { - console.log('Mongoose database is connected on: ' + db_URI); - -}); - -/** Mongoose is disconnected--> Tries to reconnect three times, then gives up **/ -mongoose.connection.on('disconnected', function() { - console.log('Mongoose is disconnected.'); - if(failedConnections < 3) { - console.log('Trying to reconnect.. '); - connect(); - failedConnections++; - } -}); - -/** Mongoose error **/ -mongoose.connection.on('error', function(err) { - console.log('Mongoose encountered an error: ' + err); -}); - -/** Application closing **/ -process.on('SIGINT', function () { - console.log('Goodbye from mongoose! :)'); - process.exit(0); -}); - -/** Handles SIGUSR2 when nodemon restart **/ -process.once('SIGUSR2', function() { - console.log('Restarting mongoose.'); - process.kill(process.pid, 'SIGUSR2'); - -}); - - -/** Handles SIGUTERM after Heroku restar **/ -process.on('SIGTERM', function() { - console.log('Goodbye from Heroku! :)'); - process.exit(0); - -}); diff --git a/api/models/playerModel.js b/api/models/playerModel.js deleted file mode 100644 index e49c381..0000000 --- a/api/models/playerModel.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - -var mongoose = require('mongoose'); - -var PlayerSchema = new mongoose.Schema ({ - name: { - type: String , - required:'Players name was not entered!' - }, - score: { - type: Number - }, - score_out: { - type: String - }, - date: { - type: Date, - default: Date.now - }, - date_out: { - type: String - }, - scoreboard_id: { - type: String - - } - - - -}); - -module.exports = mongoose.model('Player', PlayerSchema); diff --git a/api/routes/apiRoutes.js b/api/routes/apiRoutes.js deleted file mode 100644 index 0268f4d..0000000 --- a/api/routes/apiRoutes.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; - -var express = require('express'); - -module.exports = function(app) { - var chessOnePlayerController = require('../controllers/chessOnePlayerController'); - var chessTwoPlayersController = require('../controllers/chessTwoPlayersController'); - - var apiRouter = express.Router(); - var versionRouter = express.Router(); - - app.use('/api', apiRouter); - apiRouter.use('/v1', versionRouter); - - // --- Player vs Computer --- - versionRouter.route('/chess/one').get(chessOnePlayerController.startNewGame); - versionRouter.route('/chess/one/moves').post(chessOnePlayerController.listPosibleMoves); - versionRouter.route('/chess/one/move/player').post(chessOnePlayerController.move); - versionRouter.route('/chess/one/move/ai').post(chessOnePlayerController.moveAI); - versionRouter.route('/chess/one/check').post(chessOnePlayerController.checkGameOver); - versionRouter.route('/chess/one/check-position').post(chessOnePlayerController.checkPosition); - versionRouter.route('/chess/one/fen').post(chessOnePlayerController.returnFEN); - versionRouter.route('/chess/one/turn').post(chessOnePlayerController.returnTurn); - versionRouter.route('/chess/one/ascii').post(chessOnePlayerController.returnAscii); - versionRouter.route('/chess/one/pgn').post(chessOnePlayerController.returnPgn); - versionRouter.route('/chess/one/load/over/fen').post(chessOnePlayerController.loadFenOverCurrent); - versionRouter.route('/chess/one/load/over/pgn').post(chessOnePlayerController.loadPgnOverCurrent); - versionRouter.route('/chess/one/clear').post(chessOnePlayerController.clearBoard); - versionRouter.route('/chess/one/reset').post(chessOnePlayerController.resetBoard); - versionRouter.route('/chess/one/undo').post(chessOnePlayerController.undoLastMove); - versionRouter.route('/chess/one/start/fen').post(chessOnePlayerController.startNewGameWithFEN); - versionRouter.route('/chess/one/start/pgn').post(chessOnePlayerController.startNewGameWithPgn); - - // --- Player vs Player --- - versionRouter.route('/chess/two').get(chessTwoPlayersController.startNewGame); - versionRouter.route('/chess/two/moves').post(chessTwoPlayersController.listPosibleMoves); - versionRouter.route('/chess/two/move').post(chessTwoPlayersController.move); - versionRouter.route('/chess/two/check').post(chessTwoPlayersController.checkGameOver); - versionRouter.route('/chess/two/check-position').post(chessTwoPlayersController.checkPosition); - versionRouter.route('/chess/two/fen').post(chessTwoPlayersController.returnFEN); - versionRouter.route('/chess/two/turn').post(chessTwoPlayersController.returnTurn); - versionRouter.route('/chess/two/ascii').post(chessTwoPlayersController.returnAscii); - versionRouter.route('/chess/two/pgn').post(chessTwoPlayersController.returnPgn); - versionRouter.route('/chess/two/load/over/fen').post(chessTwoPlayersController.loadFenOverCurrent); - versionRouter.route('/chess/two/load/over/pgn').post(chessTwoPlayersController.loadPgnOverCurrent); - versionRouter.route('/chess/two/clear').post(chessTwoPlayersController.clearBoard); - versionRouter.route('/chess/two/reset').post(chessTwoPlayersController.resetBoard); - versionRouter.route('/chess/two/undo').post(chessTwoPlayersController.undoLastMove); - versionRouter.route('/chess/two/start/fen').post(chessTwoPlayersController.startNewGameWithFEN); - versionRouter.route('/chess/two/start/pgn').post(chessTwoPlayersController.startNewGameWithPgn); -}; diff --git a/v2/dist/server.js b/dist/server.js similarity index 100% rename from v2/dist/server.js rename to dist/server.js diff --git a/v2/dist/store.js b/dist/store.js similarity index 100% rename from v2/dist/store.js rename to dist/store.js diff --git a/index.js b/index.js deleted file mode 100644 index 737c64d..0000000 --- a/index.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -var express = require('express'); -var bodyParser = require('body-parser'); -require('./api/models/db'); - -var routesApi = require('./api/routes/apiRoutes'); -var app = express(); -var port = process.env.PORT || 3000; - -app.get('/', function(req, res) { - res.send('

Up and running.

'); -}); - -app.use(bodyParser.urlencoded({ extended: true })); -app.use(bodyParser.json()); - -routesApi(app); - -app.use(function(req, res) { - res.status(404).send({ error: 'Url not found!', url: req.originalUrl }); -}); - -app.listen(port); -console.log('Up and running on port: ' + port); diff --git a/package-lock.json b/package-lock.json index 7625b27..0110335 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,1207 +1,1207 @@ { - "name": "elm_chess_api", - "version": "1.0.0", - "lockfileVersion": 1, + "name": "chess-api-v2", + "version": "2.0.0-alpha.1", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" - } - }, - "append-field": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz", - "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=" - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "requires": { - "sprintf-js": "1.0.3" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.15" - } - }, - "bson": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", - "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" - }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.14" - }, + "packages": { + "": { + "name": "chess-api-v2", + "version": "2.0.0-alpha.1", "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } + "chess.js": "^1.4.0", + "fastify": "^5.0.0" + }, + "devDependencies": { + "@types/node": "^22.10.2", + "tsx": "^4.19.2", + "typescript": "^5.7.3" } }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } }, - "chess-ai-kong": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/chess-ai-kong/-/chess-ai-kong-0.3.3.tgz", - "integrity": "sha1-hN4uF9tAnwWboijBHVDI5MjvN7I=", - "requires": { - "chess-rules": "0.10.2" + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "chess-rules": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/chess-rules/-/chess-rules-0.10.2.tgz", - "integrity": "sha1-Kfrn8O6Gu3EB85YcL4Jv3G28ikI=", - "requires": { - "colors": "1.1.2", - "underscore-plus": "1.6.6" + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "chess.js": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-0.10.2.tgz", - "integrity": "sha1-6s76IGcVX4fwRugMwS0gGe7xuBo=" + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", - "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.2.7", - "typedarray": "0.0.6" - } - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", - "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.14", - "streamsearch": "0.1.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } }, - "encodeurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "express": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", - "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", - "requires": { - "accepts": "1.3.4", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.1", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.0", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.2", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", - "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.15", - "utils-merge": "1.0.1", - "vary": "1.1.2" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" - } - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "formidable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=" + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "graphlib": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.1.tgz", - "integrity": "sha1-QjUsUrovTQNctWbrkfc5X3bryVE=", - "requires": { - "lodash": "4.17.4" + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "hhmmss": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hhmmss/-/hhmmss-1.0.0.tgz", - "integrity": "sha1-BsdlqZCKiIS3IAPBeoOch5ypKnw=" - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.3.1" - }, - "dependencies": { - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - } + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "ipaddr.js": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - } - }, - "json-refs": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-3.0.2.tgz", - "integrity": "sha512-5SVFpK29GMOP1Ms6vS4JC18WA8Tzauzd+pVSXZZD90JgX9VrDW/vhO327r0L8kKmZvfDGEF8mGq5YqzbzXx1Kg==", - "requires": { - "commander": "2.12.2", - "graphlib": "2.1.1", - "js-yaml": "3.10.0", - "lodash": "4.17.4", - "native-promise-only": "0.8.1", - "path-loader": "1.0.4", - "slash": "1.0.0", - "uri-js": "3.0.2" - } - }, - "kareem": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", - "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash._arraypool": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz", - "integrity": "sha1-6I7suS4ruEyQZWEv2VigcZzUf5Q=" - }, - "lodash._basebind": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", - "integrity": "sha1-6UC5690nwyfgqNqxtVkWxTQelXU=", - "requires": { - "lodash._basecreate": "2.4.1", - "lodash._setbinddata": "2.4.1", - "lodash._slice": "2.4.1", - "lodash.isobject": "2.4.1" - } - }, - "lodash._baseclone": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-2.4.1.tgz", - "integrity": "sha1-MPgj5X4X43NdODvWK2Czh1Q7QYY=", - "requires": { - "lodash._getarray": "2.4.1", - "lodash._releasearray": "2.4.1", - "lodash._slice": "2.4.1", - "lodash.assign": "2.4.1", - "lodash.foreach": "2.4.1", - "lodash.forown": "2.4.1", - "lodash.isarray": "2.4.1", - "lodash.isobject": "2.4.1" - } - }, - "lodash._basecreate": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", - "integrity": "sha1-+Ob1tXip405UEXm1a47uv0oofgg=", - "requires": { - "lodash._isnative": "2.4.1", - "lodash.isobject": "2.4.1", - "lodash.noop": "2.4.1" - } - }, - "lodash._basecreatecallback": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", - "integrity": "sha1-fQsmdknLKeehOdAQO3wR+uhOSFE=", - "requires": { - "lodash._setbinddata": "2.4.1", - "lodash.bind": "2.4.1", - "lodash.identity": "2.4.1", - "lodash.support": "2.4.1" - } - }, - "lodash._basecreatewrapper": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", - "integrity": "sha1-TTHy595+E0+/KAN2K4FQsyUZZm8=", - "requires": { - "lodash._basecreate": "2.4.1", - "lodash._setbinddata": "2.4.1", - "lodash._slice": "2.4.1", - "lodash.isobject": "2.4.1" - } - }, - "lodash._createwrapper": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", - "integrity": "sha1-UdaVeXPaTtVW43KQ2MGhjFPeFgc=", - "requires": { - "lodash._basebind": "2.4.1", - "lodash._basecreatewrapper": "2.4.1", - "lodash._slice": "2.4.1", - "lodash.isfunction": "2.4.1" - } - }, - "lodash._getarray": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._getarray/-/lodash._getarray-2.4.1.tgz", - "integrity": "sha1-+vH3+BD6mFolHCGHQESBCUg55e4=", - "requires": { - "lodash._arraypool": "2.4.1" - } - }, - "lodash._isnative": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=" - }, - "lodash._maxpoolsize": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._maxpoolsize/-/lodash._maxpoolsize-2.4.1.tgz", - "integrity": "sha1-nUgvRjuOZq++WcLBTtsRcGAXIzQ=" - }, - "lodash._objecttypes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=" - }, - "lodash._releasearray": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._releasearray/-/lodash._releasearray-2.4.1.tgz", - "integrity": "sha1-phOWMNdtFTawfdyAliiJsIL2pkE=", - "requires": { - "lodash._arraypool": "2.4.1", - "lodash._maxpoolsize": "2.4.1" - } - }, - "lodash._setbinddata": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", - "integrity": "sha1-98IAzRuS7yNrOZ7s9zxkjReqlNI=", - "requires": { - "lodash._isnative": "2.4.1", - "lodash.noop": "2.4.1" - } - }, - "lodash._shimkeys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", - "requires": { - "lodash._objecttypes": "2.4.1" - } - }, - "lodash._slice": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz", - "integrity": "sha1-dFz0GlNZexj2iImFREBe+isG2Q8=" - }, - "lodash.assign": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz", - "integrity": "sha1-hMOVlt1xGBqXsGUpE6fJZ15Jsao=", - "requires": { - "lodash._basecreatecallback": "2.4.1", - "lodash._objecttypes": "2.4.1", - "lodash.keys": "2.4.1" - } - }, - "lodash.bind": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", - "integrity": "sha1-XRn6AFyMTSNvr0dCx7eh/Kvikmc=", - "requires": { - "lodash._createwrapper": "2.4.1", - "lodash._slice": "2.4.1" - } - }, - "lodash.clonedeep": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-2.4.1.tgz", - "integrity": "sha1-8pIDtAsS/uCkXTYxZIJZvrq8eGg=", - "requires": { - "lodash._baseclone": "2.4.1", - "lodash._basecreatecallback": "2.4.1" - } - }, - "lodash.foreach": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-2.4.1.tgz", - "integrity": "sha1-/j/Do0yGyUyrb5UiVgKCdB4BYwk=", - "requires": { - "lodash._basecreatecallback": "2.4.1", - "lodash.forown": "2.4.1" - } - }, - "lodash.forown": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-2.4.1.tgz", - "integrity": "sha1-eLQer+FAX6lmRZ6kGT/VAtCEUks=", - "requires": { - "lodash._basecreatecallback": "2.4.1", - "lodash._objecttypes": "2.4.1", - "lodash.keys": "2.4.1" - } - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.identity": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz", - "integrity": "sha1-ZpTP+mX++TH3wxzobHRZfPVg9PE=" - }, - "lodash.isarray": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-2.4.1.tgz", - "integrity": "sha1-tSoybB9i9tfac6MdVAHfbvRPD6E=", - "requires": { - "lodash._isnative": "2.4.1" - } - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.isfunction": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz", - "integrity": "sha1-LP1XXHPkmKtX4xm3f6Aq3vE6lNE=" - }, - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", - "requires": { - "lodash._objecttypes": "2.4.1" - } - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "requires": { - "lodash._isnative": "2.4.1", - "lodash._shimkeys": "2.4.1", - "lodash.isobject": "2.4.1" - } - }, - "lodash.noop": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", - "integrity": "sha1-T7VPgWZS5a4Q6PcvcXo4jHMmU4o=" - }, - "lodash.support": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", - "integrity": "sha1-Mg4LZwMWc8KNeiu12eAzGkUkBRU=", - "requires": { - "lodash._isnative": "2.4.1" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mongodb": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.2.tgz", - "integrity": "sha512-fqJt3iywelk4yKu/lfwQg163Bjpo5zDKhXiohycvon4iQHbrfflSAz9AIlRE6496Pm/dQKQK5bMigdVo2s6gBg==", - "requires": { - "bson": "^1.1.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2" - }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", + "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { - "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==" + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0" + } + }, + "node_modules/@fastify/error": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", + "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", + "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" } + ], + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^6.0.0" } }, - "mongoose": { - "version": "5.7.5", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.5.tgz", - "integrity": "sha512-BZ4FxtnbTurc/wcm/hLltLdI4IDxo4nsE0D9q58YymTdZwreNzwO62CcjVtaHhmr8HmJtOInp2W/T12FZaMf8g==", - "requires": { - "bson": "~1.1.1", - "kareem": "2.3.1", - "mongodb": "3.3.2", - "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.6.0", - "mquery": "3.2.2", - "ms": "2.1.2", - "regexp-clone": "1.0.0", - "safe-buffer": "5.1.2", - "sift": "7.0.1", - "sliced": "1.0.1" - }, + "node_modules/@fastify/forwarded": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", + "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", + "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "dequal": "^2.0.3" + } + }, + "node_modules/@fastify/proxy-addr": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", + "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" }, - "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==" + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" } + ], + "license": "MIT", + "dependencies": { + "@fastify/forwarded": "^3.0.0", + "ipaddr.js": "^2.1.0" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.11.tgz", + "integrity": "sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" } }, - "mongoose-legacy-pluralize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" - }, - "mongose": { - "version": "0.0.2-security", - "resolved": "https://registry.npmjs.org/mongose/-/mongose-0.0.2-security.tgz", - "integrity": "sha512-XJUBQHhC/12+hWtrcB1Ww+gkxSzbxg4VdjpNlBQGvFoyPm1bErhA+3n/IkWbGCkavFB1OSycpvpCRphPsZXgLw==" - }, - "mpath": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", - "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" - }, - "mquery": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", - "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", - "requires": { - "bluebird": "3.5.1", - "debug": "3.1.0", - "regexp-clone": "^1.0.0", - "safe-buffer": "5.1.2", - "sliced": "1.0.1" + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "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==" + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true } } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz", - "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=", - "requires": { - "append-field": "0.1.0", - "busboy": "0.2.14", - "concat-stream": "1.6.0", - "mkdirp": "0.5.1", - "object-assign": "3.0.0", - "on-finished": "2.3.0", - "type-is": "1.6.15", - "xtend": "4.0.1" - } - }, - "native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" + "node_modules/avvio": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", + "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/error": "^4.0.0", + "fastq": "^1.17.1" } }, - "parse-seconds": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-seconds/-/parse-seconds-1.0.0.tgz", - "integrity": "sha1-BoSBL/jexg1h47xww114w4D0acM=" - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "path-loader": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.4.tgz", - "integrity": "sha512-k/IPo9OWyofATP5gwIehHHQoFShS37zsSIsejKe6fjI+tqK+FnRpiSg4ZfWUpxb0g2PfCreWPqBD4ayjqjqkdQ==", - "requires": { - "native-promise-only": "0.8.1", - "superagent": "3.8.2" - } - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "proxy-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", - "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.5.2" - } - }, - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - } - }, - "readable-stream": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", - "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "regexp-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", - "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + "node_modules/chess.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.4.0.tgz", + "integrity": "sha512-BBJgrrtKQOzFLonR0l+k64A98NLemPwNsCskwb+29bRwobUa4iTm51E1kwGPbWXAcfdDa18nad6vpPPKPWarqw==", + "license": "BSD-2-Clause" }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", - "requires": { - "debug": "2.6.9", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - } - }, - "serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", - "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.1" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "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" + } }, - "sift": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", - "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } }, - "sliced": { + "node_modules/fast-decode-uri-component": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-json-stringify": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.3.0.tgz", + "integrity": "sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.2.0", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0", + "json-schema-ref-resolver": "^3.0.0", + "rfdc": "^1.2.0" + } }, - "spark-md5": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.0.tgz", - "integrity": "sha1-NyIifFTi+vJLHcbZM8wUTm9xv+8=" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/string/-/string-3.3.3.tgz", - "integrity": "sha1-XqIRzZLSKOGEKUmQpsyXs2anfLA=" - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "superagent": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", - "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "3.1.0", - "extend": "3.0.1", - "form-data": "2.3.1", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.5.1", - "readable-stream": "2.2.7" - }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastify": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.7.4.tgz", + "integrity": "sha512-e6l5NsRdaEP8rdD8VR0ErJASeyaRbzXYpmkrpr2SuvuMq6Si3lvsaVy5C+7gLanEkvjpMDzBXWE5HPeb/hgTxA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^4.0.5", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "@fastify/proxy-addr": "^5.0.0", + "abstract-logging": "^2.0.1", + "avvio": "^9.0.0", + "fast-json-stringify": "^6.0.0", + "find-my-way": "^9.0.0", + "light-my-request": "^6.0.0", + "pino": "^10.1.0", + "process-warning": "^5.0.0", + "rfdc": "^1.3.1", + "secure-json-parse": "^4.0.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" } }, - "swagger-converter": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/swagger-converter/-/swagger-converter-0.1.7.tgz", - "integrity": "sha1-oJdRnG8e5N1n4wjZtT3cnCslf5c=", - "requires": { - "lodash.clonedeep": "2.4.1" - } - }, - "swagger-tools": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/swagger-tools/-/swagger-tools-0.10.3.tgz", - "integrity": "sha512-2eepnAxniKB/oejo4pz4wGnN9hoXfLzs6ChVluDRCVzu98F7HDSRw0C+DwmiarXD5i1rjXK8yLvUuxQxOOKOJg==", - "requires": { - "async": "2.6.0", - "body-parser": "1.18.2", - "commander": "2.12.2", - "debug": "3.1.0", - "js-yaml": "3.10.0", - "json-refs": "3.0.2", - "lodash": "4.17.4", - "multer": "1.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "2.1.0", - "qs": "6.5.1", - "serve-static": "1.13.1", - "spark-md5": "3.0.0", - "string": "3.3.3", - "superagent": "3.8.2", - "swagger-converter": "0.1.7", - "traverse": "0.6.6", - "z-schema": "3.19.0" + "node_modules/find-my-way": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.5.0.tgz", + "integrity": "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^5.0.0" }, + "engines": { + "node": ">=20" + } + }, + "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/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", "dependencies": { - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "requires": { - "lodash": "4.17.4" - } + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/ipaddr.js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/json-schema-ref-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", + "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/light-my-request": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", + "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" }, - "path-to-regexp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.1.0.tgz", - "integrity": "sha512-dZY7QPCPp5r9cnNuQ955mOv4ZFVDXY/yvqeV7Y1W2PJA3PEFcuow9xKFfJxbBj1pIjOAP+M2B4/7xubmykLrXw==" + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" } + ], + "license": "BSD-3-Clause", + "dependencies": { + "cookie": "^1.0.1", + "process-warning": "^4.0.0", + "set-cookie-parser": "^2.6.0" } }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" + "node_modules/light-my-request/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.17" + "node_modules/pino": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", + "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" + }, + "bin": { + "pino": "bin.js" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } }, - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } }, - "underscore-plus": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/underscore-plus/-/underscore-plus-1.6.6.tgz", - "integrity": "sha1-ZezeG9xEGjXYnmUP1w3PE65Dmn0=", - "requires": { - "underscore": "1.6.0" + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "unpipe": { + "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } }, - "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", - "requires": { - "punycode": "2.1.0" + "node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "license": "MIT", + "engines": { + "node": ">=10" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/safe-regex2": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", + "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ret": "~0.5.0" + } }, - "validator": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-9.2.0.tgz", - "integrity": "sha512-6Ij4Eo0KM4LkR0d0IegOwluG5453uqT5QyF5SV5Ezvm8/zmkKI/L4eoraafZGlZPC9guLkwKzgypcw8VGWWnGA==" + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "node_modules/secure-json-parse": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", + "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "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" + } }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "z-schema": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.19.0.tgz", - "integrity": "sha512-V94f3ODuluBS4kQLLjNhwoMek0dyIXCsvNu/A17dAyJ6sMhT5KkJQwSn07R0naByLIXJWMDk+ruMfI/3G3hS4Q==", - "requires": { - "commander": "2.12.2", - "lodash.get": "4.4.2", - "lodash.isequal": "4.5.0", - "validator": "9.2.0" + "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/sonic-boom": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.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/thread-stream": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", + "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + }, + "engines": { + "node": ">=20" } + }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" } } } diff --git a/package.json b/package.json index 16b7515..ad0c1da 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,21 @@ { - "name": "elm_chess_api", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "node index.js" + "name": "chess-api-v2", + "version": "2.0.0-alpha.1", + "private": true, + "type": "module", + "description": "Modern rewrite of chess-api", + "scripts": { + "dev": "tsx src/server.ts", + "build": "tsc -p tsconfig.json", + "start": "node dist/server.js" }, - "author": "Anze Mur", - "license": "ISC", "dependencies": { - "chess-ai-kong": "^0.3.3", - "chess.js": "^0.10.2", - "express": "^4.16.2", - "hhmmss": "^1.0.0", - "mongoose": "^5.7.5", - "mongose": "0.0.2-security", - "parse-seconds": "^1.0.0", - "swagger-tools": "^0.10.3" + "chess.js": "^1.4.0", + "fastify": "^5.0.0" + }, + "devDependencies": { + "typescript": "^5.7.3", + "tsx": "^4.19.2", + "@types/node": "^22.10.2" } -} +} \ No newline at end of file diff --git a/postman/Chess API.postman_collection.json b/postman/Chess API.postman_collection.json deleted file mode 100644 index ec52770..0000000 --- a/postman/Chess API.postman_collection.json +++ /dev/null @@ -1,1179 +0,0 @@ -{ - "variables": [], - "info": { - "name": "Chess API", - "_postman_id": "ad2f0eee-233f-fc5c-123d-d3230fa72f28", - "description": "Chess API + highscores API", - "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json" - }, - "item": [ - { - "name": "Highscores", - "description": "", - "item": [ - { - "name": "Create new local scoreboard", - "request": { - "url": { - "raw": "http://chess-api-chess.herokuapp.com/api/v1/scoreboard", - "protocol": "http", - "host": [ - "chess-api-chess", - "herokuapp", - "com" - ], - "path": [ - "api", - "v1", - "scoreboard" - ], - "query": [ - { - "key": "", - "value": "", - "equals": true, - "description": "", - "disabled": true - } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "scoreboard_id", - "value": "5a42ccb81b3f5e25cc4f0fc3", - "description": "", - "type": "text", - "disabled": true - }, - { - "key": "", - "value": "", - "description": "", - "type": "text", - "disabled": true - } - ] - }, - "description": "Create new local scoreboard : generates a scoreboard_id." - }, - "response": [] - }, - { - "name": "listTopFive", - "request": { - "url": { - "raw": "http://chess-api-chess.herokuapp.com/api/v1/highscores", - "protocol": "http", - "host": [ - "chess-api-chess", - "herokuapp", - "com" - ], - "path": [ - "api", - "v1", - "highscores" - ], - "query": [ - { - "key": "", - "value": "", - "equals": true, - "description": "", - "disabled": true - } - ], - "variable": [] - }, - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "scoreboard_id", - "value": "5a42ccb81b3f5e25cc4f0fc3", - "description": "", - "type": "text", - "disabled": true - }, - { - "key": "", - "value": "", - "description": "", - "type": "text", - "disabled": true - } - ] - }, - "description": "Lists top five players. If parameter scoreboard_id is added you get the local highscores." - }, - "response": [] - }, - { - "name": "addPlayer", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/highscores/add", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "name", - "value": "playerX", - "description": "", - "type": "text" - }, - { - "key": "score", - "value": "10", - "description": "", - "type": "text" - } - ] - }, - "description": "Adds a player to the scoreboard.\n" - }, - "response": [] - } - ] - }, - { - "name": "Chess", - "description": "", - "item": [ - { - "name": "One player game", - "description": "", - "item": [ - { - "name": "Gameplay", - "description": "", - "item": [ - { - "name": "Create new game", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one", - "method": "GET", - "header": [], - "body": {}, - "description": "Creates a new game and generates new game_id.\n" - }, - "response": [] - }, - { - "name": "List possible moves", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/moves", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "position", - "value": "a2", - "description": "", - "type": "text" - }, - { - "key": "game_id", - "value": "5a43ca62772e4e00148e207b", - "description": "", - "type": "text" - } - ] - }, - "description": "Returns a list of legal moves from the current position." - }, - "response": [] - }, - { - "name": "Move figure player", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/move/player", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "from", - "value": "a2", - "description": "", - "type": "text" - }, - { - "key": "to", - "value": "a3", - "description": "", - "type": "text" - }, - { - "key": "game_id", - "value": "5a43ca62772e4e00148e207b", - "description": "", - "type": "text" - } - ] - }, - "description": "Attempts to make a move on the board." - }, - "response": [] - }, - { - "name": "Move figure AI", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/move/ai", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - } - ] - }, - "description": "AI attempts to make a move on the board." - }, - "response": [] - }, - { - "name": "Check game over", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/check", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3c356be4538a2628f17ca4", - "description": "", - "type": "text" - }, - { - "key": "", - "value": "", - "description": "", - "type": "text", - "disabled": true - } - ] - }, - "description": "Returns the current state of the game (checkmate, stalemate, draw, threefold repetition, or insufficient material, game continues)." - }, - "response": [] - }, - { - "name": "Check position statue", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/check-position", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3c356be4538a2628f17ca4", - "description": "", - "type": "text" - }, - { - "key": "position", - "value": "a2", - "description": "", - "type": "text", - "disabled": true - } - ] - }, - "description": "Returns the current state of a position on the board." - }, - "response": [] - } - ], - "_postman_isSubFolder": true - }, - { - "name": "Other options", - "description": "", - "item": [ - { - "name": "getFEN", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3cf85420055432a4a430da", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "getAscii", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3cf85420055432a4a430da", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "getPgn", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/pgn", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3cf85420055432a4a430da", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "getTurn", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/turn", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3cf98c91820501608bc67e", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "undoMove", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/undo", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "resetBoard", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/reset", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "clearBoard", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/clear", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "Start new game from FEN", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/start/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - }, - { - "key": "fen", - "value": "4r3/8/2p2PPk/1p6/pP2p1R1/P1B5/2P2K2/3r4 w - - 1 45", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "Start new game from pgn", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/start/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - }, - { - "key": "pgn", - "value": "", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "Load FEN over current game", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/load/over/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - }, - { - "key": "fen", - "value": "4r3/8/2p2PPk/1p6/pP2p1R1/P1B5/2P2K2/3r4 w - - 1 45", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "Load pgn over current game", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/one/load/over/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - }, - { - "key": "pgn", - "value": "", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - } - ], - "_postman_isSubFolder": true - } - ], - "_postman_isSubFolder": true - }, - { - "name": "Two players game", - "description": "", - "item": [ - { - "name": "Gameplay", - "description": "", - "item": [ - { - "name": "Create new game", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two", - "method": "GET", - "header": [], - "body": {}, - "description": "Creates a new game and generates new game_id.\n" - }, - "response": [] - }, - { - "name": "List possible moves", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/moves", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "position", - "value": "a2", - "description": "", - "type": "text" - } - ] - }, - "description": "Returns a list of legal moves from the current position." - }, - "response": [] - }, - { - "name": "Move figure player", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/move", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "from", - "value": "a2", - "description": "", - "type": "text" - }, - { - "key": "to", - "value": "a3", - "description": "", - "type": "text" - }, - { - "key": "game_id", - "value": "5a43ca62772e4e00148e207b", - "description": "", - "type": "text" - } - ] - }, - "description": "Attempts to make a move on the board." - }, - "response": [] - }, - { - "name": "Check game over", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/check", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3c356be4538a2628f17ca4", - "description": "", - "type": "text" - }, - { - "key": "", - "value": "", - "description": "", - "type": "text", - "disabled": true - } - ] - }, - "description": "Returns the current state of the game (checkmate, stalemate, draw, threefold repetition, or insufficient material, game continues)." - }, - "response": [] - }, - { - "name": "Check position statue", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/check-position", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3c356be4538a2628f17ca4", - "description": "", - "type": "text" - }, - { - "key": "position", - "value": "a2", - "description": "", - "type": "text", - "disabled": true - } - ] - }, - "description": "Returns the current state of a position on the board." - }, - "response": [] - } - ], - "_postman_isSubFolder": true - }, - { - "name": "Other options", - "description": "", - "item": [ - { - "name": "getFEN", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3cf85420055432a4a430da", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "getAscii", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3cf85420055432a4a430da", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "getPgn", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/pgn", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3cf85420055432a4a430da", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "getTurn", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/turn", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a3cf98c91820501608bc67e", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "undoMove", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/undo", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "resetBoard", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/reset", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "clearBoard", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/clear", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "Start new game from FEN", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/start/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - }, - { - "key": "fen", - "value": "4r3/8/2p2PPk/1p6/pP2p1R1/P1B5/2P2K2/3r4 w - - 1 45", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "Start new game from pgn", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/start/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - }, - { - "key": "pgn", - "value": "", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "Load FEN over current game", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/load/over/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - }, - { - "key": "fen", - "value": "4r3/8/2p2PPk/1p6/pP2p1R1/P1B5/2P2K2/3r4 w - - 1 45", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - }, - { - "name": "Load pgn over current game", - "request": { - "url": "http://chess-api-chess.herokuapp.com/api/v1/chess/two/load/over/fen", - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/x-www-form-urlencoded", - "description": "" - } - ], - "body": { - "mode": "urlencoded", - "urlencoded": [ - { - "key": "game_id", - "value": "5a43c4f3d326e114807278d2", - "description": "", - "type": "text" - }, - { - "key": "pgn", - "value": "", - "description": "", - "type": "text" - } - ] - }, - "description": "" - }, - "response": [] - } - ], - "_postman_isSubFolder": true - } - ], - "_postman_isSubFolder": true - } - ] - } - ] -} \ No newline at end of file diff --git a/v2/src/server.ts b/src/server.ts similarity index 100% rename from v2/src/server.ts rename to src/server.ts diff --git a/v2/src/store.ts b/src/store.ts similarity index 100% rename from v2/src/store.ts rename to src/store.ts diff --git a/v2/tsconfig.json b/tsconfig.json similarity index 100% rename from v2/tsconfig.json rename to tsconfig.json diff --git a/v2/README.md b/v2/README.md deleted file mode 100644 index 5e821ff..0000000 --- a/v2/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# chess-api v2 (TypeScript) - -Modern general-purpose chess API rewrite. - -## Goals - -- clean, minimal routes for external users -- player-vs-player and player-vs-engine support -- timed games with clocks + increment -- easy path to persistence/auth later - -## Run - -```bash -cd v2 -npm install -npm run dev -``` - -## Core API - -### Create game -`POST /v2/games` - -Example body: -```json -{ - "mode": "pve", - "aiColor": "b", - "timeControl": { - "initialSeconds": 300, - "incrementSeconds": 2 - } -} -``` - -### Get game state -`GET /v2/games/:id` - -### Delete game -`DELETE /v2/games/:id` - -### List legal moves -`GET /v2/games/:id/moves` -`GET /v2/games/:id/moves?from=e2` - -### Make move -`POST /v2/games/:id/moves` - -Body (one of): -```json -{ "from": "e2", "to": "e4" } -``` -```json -{ "san": "Nf3" } -``` - -### Ask engine to move (pve mode) -`POST /v2/games/:id/ai-move` - -### Resign -`POST /v2/games/:id/resign` - -```json -{ "color": "w" } -``` - -## Time controls - -When enabled, each game tracks: -- white and black remaining time -- running side clock -- increment per move -- timeout result when a clock reaches 0 - -## Next - -- add persistence (Redis/Postgres) -- add OpenAPI schema + validation -- add tests + CI -- add stronger chess engine for pve mode diff --git a/v2/package-lock.json b/v2/package-lock.json deleted file mode 100644 index 0110335..0000000 --- a/v2/package-lock.json +++ /dev/null @@ -1,1207 +0,0 @@ -{ - "name": "chess-api-v2", - "version": "2.0.0-alpha.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "chess-api-v2", - "version": "2.0.0-alpha.1", - "dependencies": { - "chess.js": "^1.4.0", - "fastify": "^5.0.0" - }, - "devDependencies": { - "@types/node": "^22.10.2", - "tsx": "^4.19.2", - "typescript": "^5.7.3" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@fastify/ajv-compiler": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", - "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^3.0.1", - "fast-uri": "^3.0.0" - } - }, - "node_modules/@fastify/error": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", - "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", - "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "fast-json-stringify": "^6.0.0" - } - }, - "node_modules/@fastify/forwarded": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", - "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "node_modules/@fastify/merge-json-schemas": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", - "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/@fastify/proxy-addr": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", - "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "@fastify/forwarded": "^3.0.0", - "ipaddr.js": "^2.1.0" - } - }, - "node_modules/@pinojs/redact": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.19.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.11.tgz", - "integrity": "sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", - "license": "MIT" - }, - "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/avvio": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", - "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "@fastify/error": "^4.0.0", - "fastq": "^1.17.1" - } - }, - "node_modules/chess.js": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.4.0.tgz", - "integrity": "sha512-BBJgrrtKQOzFLonR0l+k64A98NLemPwNsCskwb+29bRwobUa4iTm51E1kwGPbWXAcfdDa18nad6vpPPKPWarqw==", - "license": "BSD-2-Clause" - }, - "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/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/fast-decode-uri-component": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", - "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/fast-json-stringify": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.3.0.tgz", - "integrity": "sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "@fastify/merge-json-schemas": "^0.2.0", - "ajv": "^8.12.0", - "ajv-formats": "^3.0.1", - "fast-uri": "^3.0.0", - "json-schema-ref-resolver": "^3.0.0", - "rfdc": "^1.2.0" - } - }, - "node_modules/fast-querystring": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", - "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", - "license": "MIT", - "dependencies": { - "fast-decode-uri-component": "^1.0.1" - } - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastify": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.7.4.tgz", - "integrity": "sha512-e6l5NsRdaEP8rdD8VR0ErJASeyaRbzXYpmkrpr2SuvuMq6Si3lvsaVy5C+7gLanEkvjpMDzBXWE5HPeb/hgTxA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "@fastify/ajv-compiler": "^4.0.5", - "@fastify/error": "^4.0.0", - "@fastify/fast-json-stringify-compiler": "^5.0.0", - "@fastify/proxy-addr": "^5.0.0", - "abstract-logging": "^2.0.1", - "avvio": "^9.0.0", - "fast-json-stringify": "^6.0.0", - "find-my-way": "^9.0.0", - "light-my-request": "^6.0.0", - "pino": "^10.1.0", - "process-warning": "^5.0.0", - "rfdc": "^1.3.1", - "secure-json-parse": "^4.0.0", - "semver": "^7.6.0", - "toad-cache": "^3.7.0" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/find-my-way": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.5.0.tgz", - "integrity": "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-querystring": "^1.0.0", - "safe-regex2": "^5.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "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/get-tsconfig": { - "version": "4.13.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", - "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/json-schema-ref-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", - "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/light-my-request": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", - "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause", - "dependencies": { - "cookie": "^1.0.1", - "process-warning": "^4.0.0", - "set-cookie-parser": "^2.6.0" - } - }, - "node_modules/light-my-request/node_modules/process-warning": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", - "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/pino": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", - "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", - "license": "MIT", - "dependencies": { - "@pinojs/redact": "^0.4.0", - "atomic-sleep": "^1.0.0", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^3.0.0", - "pino-std-serializers": "^7.0.0", - "process-warning": "^5.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^4.0.1", - "thread-stream": "^4.0.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/pino-abstract-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", - "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", - "license": "MIT", - "dependencies": { - "split2": "^4.0.0" - } - }, - "node_modules/pino-std-serializers": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", - "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", - "license": "MIT" - }, - "node_modules/process-warning": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", - "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "node_modules/quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", - "license": "MIT" - }, - "node_modules/real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/ret": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", - "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "license": "MIT" - }, - "node_modules/safe-regex2": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", - "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "ret": "~0.5.0" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/secure-json-parse": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", - "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "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/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/sonic-boom": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", - "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.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/thread-stream": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", - "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", - "license": "MIT", - "dependencies": { - "real-require": "^0.2.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/toad-cache": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", - "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - } - } -} diff --git a/v2/package.json b/v2/package.json deleted file mode 100644 index ad0c1da..0000000 --- a/v2/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "chess-api-v2", - "version": "2.0.0-alpha.1", - "private": true, - "type": "module", - "description": "Modern rewrite of chess-api", - "scripts": { - "dev": "tsx src/server.ts", - "build": "tsc -p tsconfig.json", - "start": "node dist/server.js" - }, - "dependencies": { - "chess.js": "^1.4.0", - "fastify": "^5.0.0" - }, - "devDependencies": { - "typescript": "^5.7.3", - "tsx": "^4.19.2", - "@types/node": "^22.10.2" - } -} \ No newline at end of file From 4303e85cca4f6582b054fd3f55ed9260e1da71d2 Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 19:40:32 +0100 Subject: [PATCH 06/59] feat(api): remove /v2 prefix and use chess-ai-kong for engine moves --- README.md | 58 ++++++++++++++++++----------------------------- dist/server.js | 36 ++++++++++++++--------------- dist/store.js | 25 ++++++++++++++++++-- package-lock.json | 47 ++++++++++++++++++++++++++++++++++++-- package.json | 7 +++--- src/server.ts | 36 ++++++++++++++--------------- src/store.ts | 31 +++++++++++++++++++++++-- 7 files changed, 159 insertions(+), 81 deletions(-) diff --git a/README.md b/README.md index 5e821ff..c673e66 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,29 @@ -# chess-api v2 (TypeScript) +# ♟️ chess-api -Modern general-purpose chess API rewrite. +General-purpose Chess API for external users. -## Goals - -- clean, minimal routes for external users -- player-vs-player and player-vs-engine support -- timed games with clocks + increment -- easy path to persistence/auth later +- Player vs Player (`pvp`) +- Player vs Engine (`pve`) +- Timed games (initial time + increment) +- Clean game-centric routes ## Run ```bash -cd v2 npm install npm run dev ``` -## Core API +## API + +### Health +- `GET /` +- `GET /api` ### Create game -`POST /v2/games` +`POST /games` -Example body: +Example: ```json { "mode": "pve", @@ -35,47 +36,32 @@ Example body: ``` ### Get game state -`GET /v2/games/:id` +`GET /games/:id` ### Delete game -`DELETE /v2/games/:id` +`DELETE /games/:id` ### List legal moves -`GET /v2/games/:id/moves` -`GET /v2/games/:id/moves?from=e2` +- `GET /games/:id/moves` +- `GET /games/:id/moves?from=e2` ### Make move -`POST /v2/games/:id/moves` +`POST /games/:id/moves` -Body (one of): ```json { "from": "e2", "to": "e4" } ``` +or ```json { "san": "Nf3" } ``` -### Ask engine to move (pve mode) -`POST /v2/games/:id/ai-move` +### Engine move (uses chess-ai-kong) +`POST /games/:id/ai-move` ### Resign -`POST /v2/games/:id/resign` +`POST /games/:id/resign` ```json { "color": "w" } ``` - -## Time controls - -When enabled, each game tracks: -- white and black remaining time -- running side clock -- increment per move -- timeout result when a clock reaches 0 - -## Next - -- add persistence (Redis/Postgres) -- add OpenAPI schema + validation -- add tests + CI -- add stronger chess engine for pve mode diff --git a/dist/server.js b/dist/server.js index d918bfb..c8dfac6 100644 --- a/dist/server.js +++ b/dist/server.js @@ -1,20 +1,20 @@ import Fastify from 'fastify'; import { aiMove, createGame, deleteGame, getGame, legalMoves, makeMove, resign, state } from './store.js'; const app = Fastify({ logger: true }); -app.get('/', async () => ({ ok: true, service: 'chess-api-v2', docs: '/v2' })); -app.get('/v2', async () => ({ - message: 'General Chess API v2', +app.get('/', async () => ({ ok: true, service: 'chess-api', docs: '/api' })); +app.get('/api', async () => ({ + message: 'General Chess API', endpoints: [ - 'POST /v2/games', - 'GET /v2/games/:id', - 'DELETE /v2/games/:id', - 'GET /v2/games/:id/moves?from=e2', - 'POST /v2/games/:id/moves', - 'POST /v2/games/:id/ai-move', - 'POST /v2/games/:id/resign' + 'POST /games', + 'GET /games/:id', + 'DELETE /games/:id', + 'GET /games/:id/moves?from=e2', + 'POST /games/:id/moves', + 'POST /games/:id/ai-move', + 'POST /games/:id/resign' ] })); -app.post('/v2/games', async (req, reply) => { +app.post('/games', async (req, reply) => { const body = (req.body ?? {}); const game = createGame({ mode: body.mode ?? 'pvp', @@ -25,21 +25,21 @@ app.post('/v2/games', async (req, reply) => { reply.code(201); return state(game); }); -app.get('/v2/games/:id', async (req, reply) => { +app.get('/games/:id', async (req, reply) => { const { id } = req.params; const game = getGame(id); if (!game) return reply.code(404).send({ error: 'Game not found' }); return state(game); }); -app.delete('/v2/games/:id', async (req, reply) => { +app.delete('/games/:id', async (req, reply) => { const { id } = req.params; const ok = deleteGame(id); if (!ok) return reply.code(404).send({ error: 'Game not found' }); return reply.code(204).send(); }); -app.get('/v2/games/:id/moves', async (req, reply) => { +app.get('/games/:id/moves', async (req, reply) => { const { id } = req.params; const { from } = (req.query ?? {}); const game = getGame(id); @@ -48,7 +48,7 @@ app.get('/v2/games/:id/moves', async (req, reply) => { const moves = legalMoves(game, from); return { gameId: id, from: from ?? null, count: moves.length, moves }; }); -app.post('/v2/games/:id/moves', async (req, reply) => { +app.post('/games/:id/moves', async (req, reply) => { const { id } = req.params; const body = (req.body ?? {}); const game = getGame(id); @@ -59,7 +59,7 @@ app.post('/v2/games/:id/moves', async (req, reply) => { return reply.code(422).send(result); return { move: result.move, state: state(game) }; }); -app.post('/v2/games/:id/ai-move', async (req, reply) => { +app.post('/games/:id/ai-move', async (req, reply) => { const { id } = req.params; const game = getGame(id); if (!game) @@ -69,7 +69,7 @@ app.post('/v2/games/:id/ai-move', async (req, reply) => { return reply.code(422).send(result); return { move: result.move, state: state(game) }; }); -app.post('/v2/games/:id/resign', async (req, reply) => { +app.post('/games/:id/resign', async (req, reply) => { const { id } = req.params; const body = (req.body ?? {}); const game = getGame(id); @@ -83,5 +83,5 @@ app.post('/v2/games/:id/resign', async (req, reply) => { }); const port = Number(process.env.PORT || 3000); app.listen({ port, host: '0.0.0.0' }).then(() => { - app.log.info(`chess-api-v2 listening on ${port}`); + app.log.info(`chess-api listening on ${port}`); }); diff --git a/dist/store.js b/dist/store.js index a02f9fc..336e043 100644 --- a/dist/store.js +++ b/dist/store.js @@ -1,6 +1,16 @@ import { Chess } from 'chess.js'; import crypto from 'node:crypto'; +import { createRequire } from 'node:module'; const games = new Map(); +const require = createRequire(import.meta.url); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const chessAI = require('chess-ai-kong'); +chessAI.setOptions({ + depth: 3, + monitor: false, + strategy: 'basic', + timeout: 5000 +}); function nowIso() { return new Date().toISOString(); } @@ -116,8 +126,19 @@ export function aiMove(game) { finishIfGameOver(game); return { error: 'No legal AI moves' }; } - const pick = moves[Math.floor(Math.random() * moves.length)]; - const move = game.chess.move(pick); + let move = null; + try { + const history = game.chess.history(); + const san = chessAI.play(history); + move = game.chess.move(san); + } + catch { + move = null; + } + if (!move) { + const pick = moves[Math.floor(Math.random() * moves.length)]; + move = game.chess.move(pick); + } if (!move) return { error: 'AI failed to move' }; afterMove(game, mover); diff --git a/package-lock.json b/package-lock.json index 0110335..56b045e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,14 @@ { - "name": "chess-api-v2", + "name": "chess-api", "version": "2.0.0-alpha.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "chess-api-v2", + "name": "chess-api", "version": "2.0.0-alpha.1", "dependencies": { + "chess-ai-kong": "^0.3.3", "chess.js": "^1.4.0", "fastify": "^5.0.0" }, @@ -654,12 +655,40 @@ "fastq": "^1.17.1" } }, + "node_modules/chess-ai-kong": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/chess-ai-kong/-/chess-ai-kong-0.3.3.tgz", + "integrity": "sha512-JuPK+AniBmacnJXYq5iZzKEmytqBwtJ8wITp1xnJ3TKzLknUQwT0isK0YXrCPpBhvk5Lh1YClMr5D09cDk9t1A==", + "license": "MIT", + "dependencies": { + "chess-rules": "^0.10.2" + } + }, + "node_modules/chess-rules": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/chess-rules/-/chess-rules-0.10.2.tgz", + "integrity": "sha512-S6x6Q78bKG5GTnollkBJ7GTAaUrySbmIxHdrkiaI6PfFWZFOpI2ZS11Qc1NYDdOPUqzwbjErEm3Ti3UJjdrNOA==", + "license": "MIT", + "dependencies": { + "colors": "^1.1.2", + "underscore-plus": "^1.6.6" + } + }, "node_modules/chess.js": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.4.0.tgz", "integrity": "sha512-BBJgrrtKQOzFLonR0l+k64A98NLemPwNsCskwb+29bRwobUa4iTm51E1kwGPbWXAcfdDa18nad6vpPPKPWarqw==", "license": "BSD-2-Clause" }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/cookie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", @@ -1196,6 +1225,20 @@ "node": ">=14.17" } }, + "node_modules/underscore": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", + "license": "MIT" + }, + "node_modules/underscore-plus": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore-plus/-/underscore-plus-1.7.0.tgz", + "integrity": "sha512-A3BEzkeicFLnr+U/Q3EyWwJAQPbA19mtZZ4h+lLq3ttm9kn8WC4R3YpuJZEXmWdLjYP47Zc8aLZm9kwdv+zzvA==", + "dependencies": { + "underscore": "^1.9.1" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", diff --git a/package.json b/package.json index ad0c1da..9d9678d 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { - "name": "chess-api-v2", + "name": "chess-api", "version": "2.0.0-alpha.1", "private": true, "type": "module", - "description": "Modern rewrite of chess-api", + "description": "General chess API (TypeScript)", "scripts": { "dev": "tsx src/server.ts", "build": "tsc -p tsconfig.json", @@ -11,7 +11,8 @@ }, "dependencies": { "chess.js": "^1.4.0", - "fastify": "^5.0.0" + "fastify": "^5.0.0", + "chess-ai-kong": "^0.3.3" }, "devDependencies": { "typescript": "^5.7.3", diff --git a/src/server.ts b/src/server.ts index 4caebab..680e691 100644 --- a/src/server.ts +++ b/src/server.ts @@ -14,22 +14,22 @@ import { const app = Fastify({ logger: true }); -app.get('/', async () => ({ ok: true, service: 'chess-api-v2', docs: '/v2' })); +app.get('/', async () => ({ ok: true, service: 'chess-api', docs: '/api' })); -app.get('/v2', async () => ({ - message: 'General Chess API v2', +app.get('/api', async () => ({ + message: 'General Chess API', endpoints: [ - 'POST /v2/games', - 'GET /v2/games/:id', - 'DELETE /v2/games/:id', - 'GET /v2/games/:id/moves?from=e2', - 'POST /v2/games/:id/moves', - 'POST /v2/games/:id/ai-move', - 'POST /v2/games/:id/resign' + 'POST /games', + 'GET /games/:id', + 'DELETE /games/:id', + 'GET /games/:id/moves?from=e2', + 'POST /games/:id/moves', + 'POST /games/:id/ai-move', + 'POST /games/:id/resign' ] })); -app.post('/v2/games', async (req, reply) => { +app.post('/games', async (req, reply) => { const body = (req.body ?? {}) as { mode?: GameMode; fen?: string; @@ -48,21 +48,21 @@ app.post('/v2/games', async (req, reply) => { return state(game); }); -app.get('/v2/games/:id', async (req, reply) => { +app.get('/games/:id', async (req, reply) => { const { id } = req.params as { id: string }; const game = getGame(id); if (!game) return reply.code(404).send({ error: 'Game not found' }); return state(game); }); -app.delete('/v2/games/:id', async (req, reply) => { +app.delete('/games/:id', async (req, reply) => { const { id } = req.params as { id: string }; const ok = deleteGame(id); if (!ok) return reply.code(404).send({ error: 'Game not found' }); return reply.code(204).send(); }); -app.get('/v2/games/:id/moves', async (req, reply) => { +app.get('/games/:id/moves', async (req, reply) => { const { id } = req.params as { id: string }; const { from } = (req.query ?? {}) as { from?: string }; const game = getGame(id); @@ -72,7 +72,7 @@ app.get('/v2/games/:id/moves', async (req, reply) => { return { gameId: id, from: from ?? null, count: moves.length, moves }; }); -app.post('/v2/games/:id/moves', async (req, reply) => { +app.post('/games/:id/moves', async (req, reply) => { const { id } = req.params as { id: string }; const body = (req.body ?? {}) as { san?: string; @@ -90,7 +90,7 @@ app.post('/v2/games/:id/moves', async (req, reply) => { return { move: result.move, state: state(game) }; }); -app.post('/v2/games/:id/ai-move', async (req, reply) => { +app.post('/games/:id/ai-move', async (req, reply) => { const { id } = req.params as { id: string }; const game = getGame(id); if (!game) return reply.code(404).send({ error: 'Game not found' }); @@ -101,7 +101,7 @@ app.post('/v2/games/:id/ai-move', async (req, reply) => { return { move: result.move, state: state(game) }; }); -app.post('/v2/games/:id/resign', async (req, reply) => { +app.post('/games/:id/resign', async (req, reply) => { const { id } = req.params as { id: string }; const body = (req.body ?? {}) as { color?: Color }; const game = getGame(id); @@ -117,5 +117,5 @@ app.post('/v2/games/:id/resign', async (req, reply) => { const port = Number(process.env.PORT || 3000); app.listen({ port, host: '0.0.0.0' }).then(() => { - app.log.info(`chess-api-v2 listening on ${port}`); + app.log.info(`chess-api listening on ${port}`); }); diff --git a/src/store.ts b/src/store.ts index 5b5a652..483fc31 100644 --- a/src/store.ts +++ b/src/store.ts @@ -1,5 +1,6 @@ import { Chess, type Square } from 'chess.js'; import crypto from 'node:crypto'; +import { createRequire } from 'node:module'; export type GameMode = 'pvp' | 'pve'; export type Color = 'w' | 'b'; @@ -39,6 +40,20 @@ export interface CreateGameInput { const games = new Map(); +const require = createRequire(import.meta.url); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const chessAI: { + play: (history: string[]) => string; + setOptions: (opts: { depth?: number; monitor?: boolean; strategy?: string; timeout?: number }) => void; +} = require('chess-ai-kong'); + +chessAI.setOptions({ + depth: 3, + monitor: false, + strategy: 'basic', + timeout: 5000 +}); + function nowIso() { return new Date().toISOString(); } @@ -171,8 +186,20 @@ export function aiMove(game: Game) { return { error: 'No legal AI moves' } as const; } - const pick = moves[Math.floor(Math.random() * moves.length)]!; - const move = game.chess.move(pick); + let move: ReturnType | null = null; + try { + const history = game.chess.history(); + const san = chessAI.play(history); + move = game.chess.move(san); + } catch { + move = null; + } + + if (!move) { + const pick = moves[Math.floor(Math.random() * moves.length)]!; + move = game.chess.move(pick); + } + if (!move) return { error: 'AI failed to move' } as const; afterMove(game, mover); From c7fea2f0398b0f07b51a35abf3bdd7fba7ddcd37 Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 19:48:26 +0100 Subject: [PATCH 07/59] feat(engine): use Stockfish for ai-move with kong fallback --- README.md | 4 ++- dist/server.js | 2 +- dist/store.js | 73 +++++++++++++++++++++++++++++++++++++++++----- src/server.ts | 2 +- src/store.ts | 78 +++++++++++++++++++++++++++++++++++++++++++++----- 5 files changed, 142 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index c673e66..c40f32d 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,11 @@ or { "san": "Nf3" } ``` -### Engine move (uses chess-ai-kong) +### Engine move (uses Stockfish, fallback to chess-ai-kong) `POST /games/:id/ai-move` +> For best strength install Stockfish on host (`brew install stockfish` on macOS). + ### Resign `POST /games/:id/resign` diff --git a/dist/server.js b/dist/server.js index c8dfac6..cb8a4b4 100644 --- a/dist/server.js +++ b/dist/server.js @@ -64,7 +64,7 @@ app.post('/games/:id/ai-move', async (req, reply) => { const game = getGame(id); if (!game) return reply.code(404).send({ error: 'Game not found' }); - const result = aiMove(game); + const result = await aiMove(game); if ('error' in result) return reply.code(422).send(result); return { move: result.move, state: state(game) }; diff --git a/dist/store.js b/dist/store.js index 336e043..fa07612 100644 --- a/dist/store.js +++ b/dist/store.js @@ -1,6 +1,7 @@ import { Chess } from 'chess.js'; import crypto from 'node:crypto'; import { createRequire } from 'node:module'; +import { spawn } from 'node:child_process'; const games = new Map(); const require = createRequire(import.meta.url); // eslint-disable-next-line @typescript-eslint/no-var-requires @@ -11,6 +12,52 @@ chessAI.setOptions({ strategy: 'basic', timeout: 5000 }); +async function getStockfishBestMove(fen, moveTimeMs = 400) { + return new Promise((resolve) => { + const engine = spawn('stockfish'); + let settled = false; + const done = (move) => { + if (settled) + return; + settled = true; + try { + engine.stdin.write('quit\n'); + } + catch { + // ignore + } + engine.kill(); + resolve(move); + }; + const timeout = setTimeout(() => done(null), Math.max(200, moveTimeMs + 1500)); + engine.once('error', () => { + clearTimeout(timeout); + done(null); + }); + engine.stdout.setEncoding('utf8'); + engine.stdout.on('data', (chunk) => { + const lines = chunk + .split(/\r?\n/) + .map((l) => l.trim()) + .filter(Boolean); + for (const line of lines) { + if (line === 'uciok') { + engine.stdin.write('isready\n'); + } + else if (line === 'readyok') { + engine.stdin.write(`position fen ${fen}\n`); + engine.stdin.write(`go movetime ${moveTimeMs}\n`); + } + else if (line.startsWith('bestmove ')) { + clearTimeout(timeout); + const move = line.split(' ')[1] ?? null; + done(move && move !== '(none)' ? move : null); + } + } + }); + engine.stdin.write('uci\n'); + }); +} function nowIso() { return new Date().toISOString(); } @@ -112,7 +159,7 @@ export function makeMove(game, payload) { afterMove(game, mover); return { move }; } -export function aiMove(game) { +export async function aiMove(game) { applyClockTick(game); if (game.status !== 'active') return { error: 'Game is already finished' }; @@ -127,14 +174,26 @@ export function aiMove(game) { return { error: 'No legal AI moves' }; } let move = null; - try { - const history = game.chess.history(); - const san = chessAI.play(history); - move = game.chess.move(san); + // Preferred engine: Stockfish (UCI) + const uciMove = await getStockfishBestMove(game.chess.fen()); + if (uciMove && uciMove.length >= 4) { + const from = uciMove.slice(0, 2); + const to = uciMove.slice(2, 4); + const promotion = (uciMove.slice(4, 5) || undefined); + move = game.chess.move({ from, to, promotion }); } - catch { - move = null; + // Fallback: legacy kong engine + if (!move) { + try { + const history = game.chess.history(); + const san = chessAI.play(history); + move = game.chess.move(san); + } + catch { + move = null; + } } + // Final fallback: random legal move if (!move) { const pick = moves[Math.floor(Math.random() * moves.length)]; move = game.chess.move(pick); diff --git a/src/server.ts b/src/server.ts index 680e691..c6c6f92 100644 --- a/src/server.ts +++ b/src/server.ts @@ -95,7 +95,7 @@ app.post('/games/:id/ai-move', async (req, reply) => { const game = getGame(id); if (!game) return reply.code(404).send({ error: 'Game not found' }); - const result = aiMove(game); + const result = await aiMove(game); if ('error' in result) return reply.code(422).send(result); return { move: result.move, state: state(game) }; diff --git a/src/store.ts b/src/store.ts index 483fc31..c2876eb 100644 --- a/src/store.ts +++ b/src/store.ts @@ -1,6 +1,7 @@ import { Chess, type Square } from 'chess.js'; import crypto from 'node:crypto'; import { createRequire } from 'node:module'; +import { spawn } from 'node:child_process'; export type GameMode = 'pvp' | 'pve'; export type Color = 'w' | 'b'; @@ -54,6 +55,55 @@ chessAI.setOptions({ timeout: 5000 }); +async function getStockfishBestMove(fen: string, moveTimeMs = 400): Promise { + return new Promise((resolve) => { + const engine = spawn('stockfish'); + let settled = false; + + const done = (move: string | null) => { + if (settled) return; + settled = true; + try { + engine.stdin.write('quit\n'); + } catch { + // ignore + } + engine.kill(); + resolve(move); + }; + + const timeout = setTimeout(() => done(null), Math.max(200, moveTimeMs + 1500)); + + engine.once('error', () => { + clearTimeout(timeout); + done(null); + }); + + engine.stdout.setEncoding('utf8'); + engine.stdout.on('data', (chunk: string) => { + const lines = chunk + .split(/\r?\n/) + .map((l) => l.trim()) + .filter(Boolean); + + for (const line of lines) { + if (line === 'uciok') { + engine.stdin.write('isready\n'); + } else if (line === 'readyok') { + engine.stdin.write(`position fen ${fen}\n`); + engine.stdin.write(`go movetime ${moveTimeMs}\n`); + } else if (line.startsWith('bestmove ')) { + clearTimeout(timeout); + const move = line.split(' ')[1] ?? null; + done(move && move !== '(none)' ? move : null); + } + } + }); + + engine.stdin.write('uci\n'); + }); +} + function nowIso() { return new Date().toISOString(); } @@ -173,7 +223,7 @@ export function makeMove( return { move } as const; } -export function aiMove(game: Game) { +export async function aiMove(game: Game) { applyClockTick(game); if (game.status !== 'active') return { error: 'Game is already finished' } as const; if (game.mode !== 'pve') return { error: 'AI move only supported for pve games' } as const; @@ -187,14 +237,28 @@ export function aiMove(game: Game) { } let move: ReturnType | null = null; - try { - const history = game.chess.history(); - const san = chessAI.play(history); - move = game.chess.move(san); - } catch { - move = null; + + // Preferred engine: Stockfish (UCI) + const uciMove = await getStockfishBestMove(game.chess.fen()); + if (uciMove && uciMove.length >= 4) { + const from = uciMove.slice(0, 2); + const to = uciMove.slice(2, 4); + const promotion = (uciMove.slice(4, 5) || undefined) as 'q' | 'r' | 'b' | 'n' | undefined; + move = game.chess.move({ from, to, promotion }); + } + + // Fallback: legacy kong engine + if (!move) { + try { + const history = game.chess.history(); + const san = chessAI.play(history); + move = game.chess.move(san); + } catch { + move = null; + } } + // Final fallback: random legal move if (!move) { const pick = moves[Math.floor(Math.random() * moves.length)]!; move = game.chess.move(pick); From c0d1b7886e89854d379de4ae65faece7e0b39cc2 Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 20:03:31 +0100 Subject: [PATCH 08/59] feat(prod): add Postgres+Drizzle, Google auth, API keys, and persistent game storage --- .env.example | 3 + README.md | 100 +++++----- dist/bootstrap.js | 55 +++++ dist/crypto.js | 10 + dist/db.js | 9 + dist/google.js | 19 ++ dist/schema.js | 45 +++++ dist/server.js | 237 ++++++++++++++++------ dist/store.js | 281 +++++++++++--------------- package-lock.json | 499 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 7 +- src/bootstrap.ts | 59 ++++++ src/crypto.ts | 13 ++ src/db.ts | 11 + src/google.ts | 23 +++ src/schema.ts | 49 +++++ src/server.ts | 277 +++++++++++++++++++------ src/store.ts | 369 ++++++++++++++-------------------- 18 files changed, 1509 insertions(+), 557 deletions(-) create mode 100644 .env.example create mode 100644 dist/bootstrap.js create mode 100644 dist/crypto.js create mode 100644 dist/db.js create mode 100644 dist/google.js create mode 100644 dist/schema.js create mode 100644 src/bootstrap.ts create mode 100644 src/crypto.ts create mode 100644 src/db.ts create mode 100644 src/google.ts create mode 100644 src/schema.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9eefc4b --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +DATABASE_URL=postgres://user:pass@host:5432/chess +GOOGLE_CLIENT_ID=your-google-client-id.apps.googleusercontent.com +PORT=3000 diff --git a/README.md b/README.md index c40f32d..7dddb4a 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,28 @@ -# ♟️ chess-api - -General-purpose Chess API for external users. - -- Player vs Player (`pvp`) -- Player vs Engine (`pve`) -- Timed games (initial time + increment) -- Clean game-centric routes +# chess-api (rewrite) + +Production-style chess API with: +- Google social auth (users) +- API key management per user +- Chess game endpoints protected by API key +- PvP + PvE +- Timed games (clock + increment) +- Postgres + Drizzle + +## Stack +- Fastify +- Drizzle ORM +- PostgreSQL +- chess.js +- chess-ai-kong (engine) + +## Environment +Create `.env` with: + +```env +DATABASE_URL=postgres://... +GOOGLE_CLIENT_ID=your-google-oauth-client-id +PORT=3000 +``` ## Run @@ -14,16 +31,32 @@ npm install npm run dev ``` -## API - -### Health -- `GET /` -- `GET /api` - -### Create game -`POST /games` +## Auth flow +1. Client performs Google Sign-In and gets `idToken` +2. Call `POST /auth/google` with `{ "idToken": "..." }` +3. Receive `accessToken` (session bearer) +4. Use bearer token for `/me` + `/me/api-keys` +5. Use generated API key in `x-api-key` header for chess routes + +## API overview + +### Session auth routes +- `POST /auth/google` +- `GET /me` +- `GET /me/api-keys` +- `POST /me/api-keys` +- `DELETE /me/api-keys/:id` + +### Chess routes (require `x-api-key`) +- `POST /games` +- `GET /games/:id` +- `DELETE /games/:id` +- `GET /games/:id/moves?from=e2` +- `POST /games/:id/moves` +- `POST /games/:id/ai-move` +- `POST /games/:id/resign` -Example: +### Create game example ```json { "mode": "pve", @@ -34,36 +67,3 @@ Example: } } ``` - -### Get game state -`GET /games/:id` - -### Delete game -`DELETE /games/:id` - -### List legal moves -- `GET /games/:id/moves` -- `GET /games/:id/moves?from=e2` - -### Make move -`POST /games/:id/moves` - -```json -{ "from": "e2", "to": "e4" } -``` -or -```json -{ "san": "Nf3" } -``` - -### Engine move (uses Stockfish, fallback to chess-ai-kong) -`POST /games/:id/ai-move` - -> For best strength install Stockfish on host (`brew install stockfish` on macOS). - -### Resign -`POST /games/:id/resign` - -```json -{ "color": "w" } -``` diff --git a/dist/bootstrap.js b/dist/bootstrap.js new file mode 100644 index 0000000..9fd8d36 --- /dev/null +++ b/dist/bootstrap.js @@ -0,0 +1,55 @@ +import { client } from './db.js'; +export async function ensureSchema() { + await client ` + create table if not exists users ( + id text primary key, + email text not null unique, + name text not null, + picture text, + created_at timestamptz not null default now() + ); + `; + await client ` + create table if not exists sessions ( + token text primary key, + user_id text not null references users(id) on delete cascade, + expires_at timestamptz not null, + created_at timestamptz not null default now() + ); + `; + await client ` + create table if not exists api_keys ( + id text primary key, + user_id text not null references users(id) on delete cascade, + name text not null, + key_hash text not null unique, + key_prefix text not null, + active boolean not null default true, + created_at timestamptz not null default now(), + last_used_at timestamptz + ); + `; + await client ` + create table if not exists games ( + id text primary key, + user_id text not null references users(id) on delete cascade, + mode text not null, + ai_color text, + fen text not null, + pgn text not null, + turn text not null, + status text not null, + result_reason text, + result_winner text, + history jsonb not null, + initial_ms integer, + increment_ms integer, + remaining_w integer, + remaining_b integer, + running text, + last_tick_at integer, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now() + ); + `; +} diff --git a/dist/crypto.js b/dist/crypto.js new file mode 100644 index 0000000..2fbdaed --- /dev/null +++ b/dist/crypto.js @@ -0,0 +1,10 @@ +import crypto from 'node:crypto'; +export function randomId() { + return crypto.randomUUID(); +} +export function randomToken(bytes = 32) { + return crypto.randomBytes(bytes).toString('hex'); +} +export function sha256(input) { + return crypto.createHash('sha256').update(input).digest('hex'); +} diff --git a/dist/db.js b/dist/db.js new file mode 100644 index 0000000..7a550f7 --- /dev/null +++ b/dist/db.js @@ -0,0 +1,9 @@ +import postgres from 'postgres'; +import { drizzle } from 'drizzle-orm/postgres-js'; +const connection = process.env.DATABASE_URL; +if (!connection) { + throw new Error('DATABASE_URL is required'); +} +const client = postgres(connection, { prepare: false }); +export const db = drizzle(client); +export { client }; diff --git a/dist/google.js b/dist/google.js new file mode 100644 index 0000000..c060002 --- /dev/null +++ b/dist/google.js @@ -0,0 +1,19 @@ +import { OAuth2Client } from 'google-auth-library'; +const googleClientId = process.env.GOOGLE_CLIENT_ID; +if (!googleClientId) { + throw new Error('GOOGLE_CLIENT_ID is required'); +} +const client = new OAuth2Client(googleClientId); +export async function verifyGoogleIdToken(idToken) { + const ticket = await client.verifyIdToken({ idToken, audience: googleClientId }); + const payload = ticket.getPayload(); + if (!payload?.sub || !payload.email || !payload.name) { + throw new Error('Invalid Google token payload'); + } + return { + googleId: payload.sub, + email: payload.email, + name: payload.name, + picture: payload.picture ?? null + }; +} diff --git a/dist/schema.js b/dist/schema.js new file mode 100644 index 0000000..6f17dab --- /dev/null +++ b/dist/schema.js @@ -0,0 +1,45 @@ +import { pgTable, text, timestamp, boolean, jsonb, integer } from 'drizzle-orm/pg-core'; +export const users = pgTable('users', { + id: text('id').primaryKey(), + email: text('email').notNull().unique(), + name: text('name').notNull(), + picture: text('picture'), + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow() +}); +export const sessions = pgTable('sessions', { + token: text('token').primaryKey(), + userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }), + expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(), + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow() +}); +export const apiKeys = pgTable('api_keys', { + id: text('id').primaryKey(), + userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }), + name: text('name').notNull(), + keyHash: text('key_hash').notNull().unique(), + keyPrefix: text('key_prefix').notNull(), + active: boolean('active').notNull().default(true), + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), + lastUsedAt: timestamp('last_used_at', { withTimezone: true }) +}); +export const games = pgTable('games', { + id: text('id').primaryKey(), + userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }), + mode: text('mode').notNull(), + aiColor: text('ai_color'), + fen: text('fen').notNull(), + pgn: text('pgn').notNull(), + turn: text('turn').notNull(), + status: text('status').notNull(), + resultReason: text('result_reason'), + resultWinner: text('result_winner'), + history: jsonb('history').notNull().$type(), + initialMs: integer('initial_ms'), + incrementMs: integer('increment_ms'), + remainingW: integer('remaining_w'), + remainingB: integer('remaining_b'), + running: text('running'), + lastTickAt: integer('last_tick_at'), + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), + updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow() +}); diff --git a/dist/server.js b/dist/server.js index cb8a4b4..198092b 100644 --- a/dist/server.js +++ b/dist/server.js @@ -1,85 +1,210 @@ import Fastify from 'fastify'; -import { aiMove, createGame, deleteGame, getGame, legalMoves, makeMove, resign, state } from './store.js'; +import rateLimit from '@fastify/rate-limit'; +import cors from '@fastify/cors'; +import { and, eq, gt } from 'drizzle-orm'; +import { db } from './db.js'; +import { apiKeys, games, sessions, users } from './schema.js'; +import { ensureSchema } from './bootstrap.js'; +import { randomId, randomToken, sha256 } from './crypto.js'; +import { verifyGoogleIdToken } from './google.js'; +import { aiMove, hydrate, legalMoves, makeMove, newGameState, present, resign, serialize } from './store.js'; const app = Fastify({ logger: true }); +await app.register(cors, { origin: true }); +await app.register(rateLimit, { max: 200, timeWindow: '1 minute' }); +await ensureSchema(); +async function requireSession(request, reply) { + const auth = request.headers.authorization; + if (!auth?.startsWith('Bearer ')) + return reply.code(401).send({ error: 'Missing bearer token' }); + const token = auth.slice('Bearer '.length); + const rows = await db + .select({ userId: sessions.userId, email: users.email, name: users.name }) + .from(sessions) + .innerJoin(users, eq(users.id, sessions.userId)) + .where(and(eq(sessions.token, token), gt(sessions.expiresAt, new Date()))) + .limit(1); + if (!rows.length) + return reply.code(401).send({ error: 'Invalid session' }); + request.sessionUser = { id: rows[0].userId, email: rows[0].email, name: rows[0].name }; +} +async function requireApiKey(request, reply) { + const key = request.headers['x-api-key']; + if (!key) + return reply.code(401).send({ error: 'Missing x-api-key' }); + const keyHash = sha256(key); + const rows = await db + .select({ id: apiKeys.id, userId: apiKeys.userId }) + .from(apiKeys) + .where(and(eq(apiKeys.keyHash, keyHash), eq(apiKeys.active, true))) + .limit(1); + if (!rows.length) + return reply.code(401).send({ error: 'Invalid API key' }); + await db.update(apiKeys).set({ lastUsedAt: new Date() }).where(eq(apiKeys.id, rows[0].id)); + request.apiUserId = rows[0].userId; +} app.get('/', async () => ({ ok: true, service: 'chess-api', docs: '/api' })); app.get('/api', async () => ({ - message: 'General Chess API', - endpoints: [ - 'POST /games', - 'GET /games/:id', - 'DELETE /games/:id', - 'GET /games/:id/moves?from=e2', - 'POST /games/:id/moves', - 'POST /games/:id/ai-move', - 'POST /games/:id/resign' - ] + message: 'Production Chess API', + auth: { + login: 'POST /auth/google', + me: 'GET /me', + apiKeys: 'POST/GET/DELETE /me/api-keys' + }, + chess: ['POST /games', 'GET /games/:id', 'DELETE /games/:id', 'GET /games/:id/moves', 'POST /games/:id/moves', 'POST /games/:id/ai-move', 'POST /games/:id/resign'] })); -app.post('/games', async (req, reply) => { - const body = (req.body ?? {}); - const game = createGame({ - mode: body.mode ?? 'pvp', - fen: body.fen, - aiColor: body.aiColor, - timeControl: body.timeControl +app.post('/auth/google', async (request, reply) => { + const body = (request.body ?? {}); + if (!body.idToken) + return reply.code(400).send({ error: 'idToken is required' }); + const profile = await verifyGoogleIdToken(body.idToken); + const existing = await db.select().from(users).where(eq(users.email, profile.email)).limit(1); + const userId = existing[0]?.id ?? randomId(); + if (!existing.length) { + await db.insert(users).values({ id: userId, email: profile.email, name: profile.name, picture: profile.picture }); + } + const token = randomToken(32); + const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 30); + await db.insert(sessions).values({ token, userId, expiresAt }); + return { accessToken: token, expiresAt, user: { id: userId, email: profile.email, name: profile.name, picture: profile.picture } }; +}); +app.get('/me', { preHandler: requireSession }, async (request) => { + return { user: request.sessionUser }; +}); +app.get('/me/api-keys', { preHandler: requireSession }, async (request) => { + const rows = await db + .select({ id: apiKeys.id, name: apiKeys.name, keyPrefix: apiKeys.keyPrefix, active: apiKeys.active, createdAt: apiKeys.createdAt, lastUsedAt: apiKeys.lastUsedAt }) + .from(apiKeys) + .where(eq(apiKeys.userId, request.sessionUser.id)); + return { items: rows }; +}); +app.post('/me/api-keys', { preHandler: requireSession }, async (request, reply) => { + const body = (request.body ?? {}); + const name = (body.name ?? 'default').slice(0, 80); + const rawKey = `chess_${randomToken(24)}`; + const keyHash = sha256(rawKey); + const keyPrefix = rawKey.slice(0, 12); + await db.insert(apiKeys).values({ + id: randomId(), + userId: request.sessionUser.id, + name, + keyHash, + keyPrefix, + active: true }); reply.code(201); - return state(game); + return { apiKey: rawKey, prefix: keyPrefix, name }; }); -app.get('/games/:id', async (req, reply) => { - const { id } = req.params; - const game = getGame(id); - if (!game) - return reply.code(404).send({ error: 'Game not found' }); - return state(game); +app.delete('/me/api-keys/:id', { preHandler: requireSession }, async (request, reply) => { + const { id } = request.params; + await db + .update(apiKeys) + .set({ active: false }) + .where(and(eq(apiKeys.id, id), eq(apiKeys.userId, request.sessionUser.id))); + return reply.code(204).send(); }); -app.delete('/games/:id', async (req, reply) => { - const { id } = req.params; - const ok = deleteGame(id); - if (!ok) +app.post('/games', { preHandler: requireApiKey }, async (request, reply) => { + const body = (request.body ?? {}); + const gameId = randomId(); + const state = newGameState(body); + const payload = serialize(state); + await db.insert(games).values({ + id: gameId, + userId: request.apiUserId, + ...payload, + updatedAt: new Date() + }); + reply.code(201); + return present(gameId, state); +}); +app.get('/games/:id', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params; + const rows = await db + .select() + .from(games) + .where(and(eq(games.id, id), eq(games.userId, request.apiUserId))) + .limit(1); + const row = rows[0]; + if (!row) return reply.code(404).send({ error: 'Game not found' }); + const state = hydrate(row); + const view = present(id, state); + await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); + return view; +}); +app.delete('/games/:id', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params; + await db.delete(games).where(and(eq(games.id, id), eq(games.userId, request.apiUserId))); return reply.code(204).send(); }); -app.get('/games/:id/moves', async (req, reply) => { - const { id } = req.params; - const { from } = (req.query ?? {}); - const game = getGame(id); - if (!game) +app.get('/games/:id/moves', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params; + const { from } = (request.query ?? {}); + const rows = await db + .select() + .from(games) + .where(and(eq(games.id, id), eq(games.userId, request.apiUserId))) + .limit(1); + const row = rows[0]; + if (!row) return reply.code(404).send({ error: 'Game not found' }); - const moves = legalMoves(game, from); + const state = hydrate(row); + const moves = legalMoves(state, from); + await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); return { gameId: id, from: from ?? null, count: moves.length, moves }; }); -app.post('/games/:id/moves', async (req, reply) => { - const { id } = req.params; - const body = (req.body ?? {}); - const game = getGame(id); - if (!game) +app.post('/games/:id/moves', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params; + const body = (request.body ?? {}); + const rows = await db + .select() + .from(games) + .where(and(eq(games.id, id), eq(games.userId, request.apiUserId))) + .limit(1); + const row = rows[0]; + if (!row) return reply.code(404).send({ error: 'Game not found' }); - const result = makeMove(game, body); + const state = hydrate(row); + const result = makeMove(state, body); if ('error' in result) return reply.code(422).send(result); - return { move: result.move, state: state(game) }; + await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); + return { move: result.move, state: present(id, state) }; }); -app.post('/games/:id/ai-move', async (req, reply) => { - const { id } = req.params; - const game = getGame(id); - if (!game) +app.post('/games/:id/ai-move', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params; + const rows = await db + .select() + .from(games) + .where(and(eq(games.id, id), eq(games.userId, request.apiUserId))) + .limit(1); + const row = rows[0]; + if (!row) return reply.code(404).send({ error: 'Game not found' }); - const result = await aiMove(game); + const state = hydrate(row); + const result = await aiMove(state); if ('error' in result) return reply.code(422).send(result); - return { move: result.move, state: state(game) }; + await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); + return { move: result.move, state: present(id, state) }; }); -app.post('/games/:id/resign', async (req, reply) => { - const { id } = req.params; - const body = (req.body ?? {}); - const game = getGame(id); - if (!game) - return reply.code(404).send({ error: 'Game not found' }); +app.post('/games/:id/resign', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params; + const body = (request.body ?? {}); if (!body.color || !['w', 'b'].includes(body.color)) { return reply.code(400).send({ error: 'color must be w or b' }); } - resign(game, body.color); - return state(game); + const rows = await db + .select() + .from(games) + .where(and(eq(games.id, id), eq(games.userId, request.apiUserId))) + .limit(1); + const row = rows[0]; + if (!row) + return reply.code(404).send({ error: 'Game not found' }); + const state = hydrate(row); + resign(state, body.color); + await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); + return present(id, state); }); const port = Number(process.env.PORT || 3000); app.listen({ port, host: '0.0.0.0' }).then(() => { diff --git a/dist/store.js b/dist/store.js index fa07612..54fd5ef 100644 --- a/dist/store.js +++ b/dist/store.js @@ -1,85 +1,22 @@ import { Chess } from 'chess.js'; -import crypto from 'node:crypto'; import { createRequire } from 'node:module'; -import { spawn } from 'node:child_process'; -const games = new Map(); const require = createRequire(import.meta.url); -// eslint-disable-next-line @typescript-eslint/no-var-requires const chessAI = require('chess-ai-kong'); -chessAI.setOptions({ - depth: 3, - monitor: false, - strategy: 'basic', - timeout: 5000 -}); -async function getStockfishBestMove(fen, moveTimeMs = 400) { - return new Promise((resolve) => { - const engine = spawn('stockfish'); - let settled = false; - const done = (move) => { - if (settled) - return; - settled = true; - try { - engine.stdin.write('quit\n'); - } - catch { - // ignore - } - engine.kill(); - resolve(move); - }; - const timeout = setTimeout(() => done(null), Math.max(200, moveTimeMs + 1500)); - engine.once('error', () => { - clearTimeout(timeout); - done(null); - }); - engine.stdout.setEncoding('utf8'); - engine.stdout.on('data', (chunk) => { - const lines = chunk - .split(/\r?\n/) - .map((l) => l.trim()) - .filter(Boolean); - for (const line of lines) { - if (line === 'uciok') { - engine.stdin.write('isready\n'); - } - else if (line === 'readyok') { - engine.stdin.write(`position fen ${fen}\n`); - engine.stdin.write(`go movetime ${moveTimeMs}\n`); - } - else if (line.startsWith('bestmove ')) { - clearTimeout(timeout); - const move = line.split(' ')[1] ?? null; - done(move && move !== '(none)' ? move : null); - } - } - }); - engine.stdin.write('uci\n'); - }); -} -function nowIso() { - return new Date().toISOString(); -} -function nowMs() { - return Date.now(); -} +chessAI.setOptions({ depth: 3, monitor: false, strategy: 'basic', timeout: 5000 }); function opposite(c) { return c === 'w' ? 'b' : 'w'; } -export function createGame(input = {}) { +export function newGameState(input) { const chess = new Chess(); if (input.fen) chess.load(input.fen); - const id = crypto.randomUUID(); const turn = chess.turn(); - const game = { - id, + return { mode: input.mode ?? 'pvp', + aiColor: (input.mode ?? 'pvp') === 'pve' ? input.aiColor ?? 'b' : null, chess, - createdAt: nowIso(), - updatedAt: nowIso(), status: 'active', + result: null, timeControl: input.timeControl ? { initialMs: Math.max(1, input.timeControl.initialSeconds) * 1000, @@ -89,147 +26,155 @@ export function createGame(input = {}) { b: Math.max(1, input.timeControl.initialSeconds) * 1000 }, running: turn, - lastTickAt: nowMs() + lastTickAt: Date.now() } - : null, - aiColor: (input.mode ?? 'pvp') === 'pve' ? input.aiColor ?? 'b' : null + : null }; - games.set(id, game); - return game; } -export function getGame(id) { - return games.get(id); +export function hydrate(row) { + const chess = new Chess(row.fen); + const timeControl = row.initialMs && row.incrementMs !== null && row.remainingW !== null && row.remainingB !== null && row.running && row.lastTickAt + ? { + initialMs: row.initialMs, + incrementMs: row.incrementMs, + remaining: { w: row.remainingW, b: row.remainingB }, + running: row.running, + lastTickAt: row.lastTickAt + } + : null; + return { + mode: row.mode, + aiColor: row.aiColor ?? null, + chess, + status: row.status, + result: row.resultReason + ? { reason: row.resultReason, winner: row.resultWinner ?? null } + : null, + timeControl + }; } -export function deleteGame(id) { - return games.delete(id); +export function serialize(state) { + return { + mode: state.mode, + aiColor: state.aiColor, + fen: state.chess.fen(), + pgn: state.chess.pgn(), + turn: state.chess.turn(), + status: state.status, + resultReason: state.result?.reason ?? null, + resultWinner: state.result?.winner ?? null, + history: state.chess.history({ verbose: true }), + initialMs: state.timeControl?.initialMs ?? null, + incrementMs: state.timeControl?.incrementMs ?? null, + remainingW: state.timeControl?.remaining.w ?? null, + remainingB: state.timeControl?.remaining.b ?? null, + running: state.timeControl?.running ?? null, + lastTickAt: state.timeControl?.lastTickAt ?? null + }; } -function finishIfGameOver(game) { - if (!game.chess.isGameOver()) +function finishIfGameOver(state) { + if (!state.chess.isGameOver()) return; - game.status = 'finished'; - if (game.chess.isCheckmate()) { - game.result = { reason: 'checkmate', winner: opposite(game.chess.turn()) }; + state.status = 'finished'; + if (state.chess.isCheckmate()) { + state.result = { reason: 'checkmate', winner: opposite(state.chess.turn()) }; return; } - game.result = { reason: 'draw', winner: null }; + state.result = { reason: 'draw', winner: null }; } -function applyClockTick(game) { - if (!game.timeControl || game.status !== 'active') +export function tick(state) { + if (!state.timeControl || state.status !== 'active') return; - const tc = game.timeControl; - const now = nowMs(); - const elapsed = Math.max(0, now - tc.lastTickAt); - tc.remaining[tc.running] = Math.max(0, tc.remaining[tc.running] - elapsed); - tc.lastTickAt = now; - if (tc.remaining[tc.running] <= 0) { - game.status = 'finished'; - game.result = { reason: 'timeout', winner: opposite(tc.running) }; + const now = Date.now(); + const elapsed = Math.max(0, now - state.timeControl.lastTickAt); + state.timeControl.remaining[state.timeControl.running] = Math.max(0, state.timeControl.remaining[state.timeControl.running] - elapsed); + state.timeControl.lastTickAt = now; + if (state.timeControl.remaining[state.timeControl.running] <= 0) { + state.status = 'finished'; + state.result = { reason: 'timeout', winner: opposite(state.timeControl.running) }; } } -function afterMove(game, mover) { - if (game.timeControl) { - const tc = game.timeControl; - tc.remaining[mover] += tc.incrementMs; - tc.running = game.chess.turn(); - tc.lastTickAt = nowMs(); +function afterMove(state, mover) { + if (state.timeControl) { + state.timeControl.remaining[mover] += state.timeControl.incrementMs; + state.timeControl.running = state.chess.turn(); + state.timeControl.lastTickAt = Date.now(); } - finishIfGameOver(game); - game.updatedAt = nowIso(); + finishIfGameOver(state); } -export function legalMoves(game, from) { - applyClockTick(game); - if (game.status !== 'active') +export function legalMoves(state, from) { + tick(state); + if (state.status !== 'active') return []; - if (from) - return game.chess.moves({ square: from }); - return game.chess.moves(); + return from ? state.chess.moves({ square: from }) : state.chess.moves(); } -export function makeMove(game, payload) { - applyClockTick(game); - if (game.status !== 'active') +export function makeMove(state, payload) { + tick(state); + if (state.status !== 'active') return { error: 'Game is already finished' }; - const mover = game.chess.turn(); + const mover = state.chess.turn(); const move = payload.san - ? game.chess.move(payload.san) + ? state.chess.move(payload.san) : payload.from && payload.to - ? game.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) + ? state.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) : null; if (!move) return { error: 'Illegal move' }; - afterMove(game, mover); + afterMove(state, mover); return { move }; } -export async function aiMove(game) { - applyClockTick(game); - if (game.status !== 'active') +export async function aiMove(state) { + tick(state); + if (state.status !== 'active') return { error: 'Game is already finished' }; - if (game.mode !== 'pve') + if (state.mode !== 'pve') return { error: 'AI move only supported for pve games' }; - if (game.aiColor !== game.chess.turn()) + if (state.aiColor !== state.chess.turn()) return { error: 'Not AI turn' }; - const mover = game.chess.turn(); - const moves = game.chess.moves(); - if (!moves.length) { - finishIfGameOver(game); + const mover = state.chess.turn(); + const legal = state.chess.moves(); + if (!legal.length) return { error: 'No legal AI moves' }; - } let move = null; - // Preferred engine: Stockfish (UCI) - const uciMove = await getStockfishBestMove(game.chess.fen()); - if (uciMove && uciMove.length >= 4) { - const from = uciMove.slice(0, 2); - const to = uciMove.slice(2, 4); - const promotion = (uciMove.slice(4, 5) || undefined); - move = game.chess.move({ from, to, promotion }); + try { + const san = chessAI.play(state.chess.history()); + move = state.chess.move(san); } - // Fallback: legacy kong engine - if (!move) { - try { - const history = game.chess.history(); - const san = chessAI.play(history); - move = game.chess.move(san); - } - catch { - move = null; - } + catch { + move = null; } - // Final fallback: random legal move if (!move) { - const pick = moves[Math.floor(Math.random() * moves.length)]; - move = game.chess.move(pick); + const pick = legal[Math.floor(Math.random() * legal.length)]; + move = state.chess.move(pick); } if (!move) return { error: 'AI failed to move' }; - afterMove(game, mover); + afterMove(state, mover); return { move }; } -export function resign(game, color) { - if (game.status !== 'active') +export function resign(state, color) { + if (state.status !== 'active') return; - game.status = 'finished'; - game.result = { reason: 'resign', winner: opposite(color) }; - game.updatedAt = nowIso(); + state.status = 'finished'; + state.result = { reason: 'resign', winner: opposite(color) }; } -export function state(game) { - applyClockTick(game); +export function present(id, state) { + tick(state); return { - id: game.id, - mode: game.mode, - status: game.status, - result: game.result ?? null, - createdAt: game.createdAt, - updatedAt: game.updatedAt, - fen: game.chess.fen(), - pgn: game.chess.pgn(), - turn: game.chess.turn(), - legalMoveCount: game.chess.moves().length, - history: game.chess.history({ verbose: true }), - timeControl: game.timeControl + id, + mode: state.mode, + status: state.status, + result: state.result, + fen: state.chess.fen(), + pgn: state.chess.pgn(), + turn: state.chess.turn(), + history: state.chess.history({ verbose: true }), + timeControl: state.timeControl ? { - initialMs: game.timeControl.initialMs, - incrementMs: game.timeControl.incrementMs, - remaining: game.timeControl.remaining, - running: game.timeControl.running + initialMs: state.timeControl.initialMs, + incrementMs: state.timeControl.incrementMs, + remaining: state.timeControl.remaining, + running: state.timeControl.running } : null }; diff --git a/package-lock.json b/package-lock.json index 56b045e..d8d9677 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,14 @@ "name": "chess-api", "version": "2.0.0-alpha.1", "dependencies": { + "@fastify/cors": "^10.0.1", + "@fastify/rate-limit": "^10.1.0", "chess-ai-kong": "^0.3.3", "chess.js": "^1.4.0", - "fastify": "^5.0.0" + "drizzle-orm": "^0.39.0", + "fastify": "^5.0.0", + "google-auth-library": "^9.15.1", + "postgres": "^3.4.5" }, "devDependencies": { "@types/node": "^22.10.2", @@ -481,6 +486,26 @@ "fast-uri": "^3.0.0" } }, + "node_modules/@fastify/cors": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-10.1.0.tgz", + "integrity": "sha512-MZyBCBJtII60CU9Xme/iE4aEy8G7QpzGR8zkdXZkDFt7ElEMachbE61tfhAG/bvSaULlqlf0huMT12T7iqEmdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "fastify-plugin": "^5.0.0", + "mnemonist": "0.40.0" + } + }, "node_modules/@fastify/error": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", @@ -571,6 +596,36 @@ "ipaddr.js": "^2.1.0" } }, + "node_modules/@fastify/rate-limit": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@fastify/rate-limit/-/rate-limit-10.3.0.tgz", + "integrity": "sha512-eIGkG9XKQs0nyynatApA3EVrojHOuq4l6fhB4eeCk4PIOeadvOJz9/4w3vGI44Go17uaXOWEcPkaD8kuKm7g6Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@lukeed/ms": "^2.0.2", + "fastify-plugin": "^5.0.0", + "toad-cache": "^3.7.0" + } + }, + "node_modules/@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@pinojs/redact": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", @@ -593,6 +648,15 @@ "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", "license": "MIT" }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", @@ -655,6 +719,41 @@ "fastq": "^1.17.1" } }, + "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/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, "node_modules/chess-ai-kong": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/chess-ai-kong/-/chess-ai-kong-0.3.3.tgz", @@ -702,6 +801,23 @@ "url": "https://opencollective.com/express" } }, + "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/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -711,6 +827,132 @@ "node": ">=6" } }, + "node_modules/drizzle-orm": { + "version": "0.39.3", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.39.3.tgz", + "integrity": "sha512-EZ8ZpYvDIvKU9C56JYLOmUskazhad+uXZCTCRN4OnRMsL+xAJ05dv1eCpAG5xzhsm1hqiuC5kAZUCS924u2DTw==", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/esbuild": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", @@ -753,6 +995,12 @@ "@esbuild/win32-x64": "0.27.3" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", @@ -847,6 +1095,22 @@ "toad-cache": "^3.7.0" } }, + "node_modules/fastify-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", + "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -885,6 +1149,36 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/gaxios": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/get-tsconfig": { "version": "4.13.6", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", @@ -898,6 +1192,58 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/google-auth-library": { + "version": "9.15.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", + "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "license": "MIT", + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/ipaddr.js": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", @@ -907,6 +1253,27 @@ "node": ">= 10" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-schema-ref-resolver": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", @@ -932,6 +1299,27 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/light-my-request": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", @@ -969,6 +1357,47 @@ ], "license": "MIT" }, + "node_modules/mnemonist": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.40.0.tgz", + "integrity": "sha512-kdd8AFNig2AD5Rkih7EPCXhu/iMvwevQFX/uEiGhZyPZi7fHqOoF4V4kHLpCfysxXMgQ4B52kdPMCwARshKvEg==", + "license": "MIT", + "dependencies": { + "obliterator": "^2.0.4" + } + }, + "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/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "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/obliterator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "license": "MIT" + }, "node_modules/on-exit-leak-free": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", @@ -1015,6 +1444,19 @@ "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", "license": "MIT" }, + "node_modules/postgres": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.8.tgz", + "integrity": "sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg==", + "license": "Unlicense", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/porsager" + } + }, "node_modules/process-warning": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", @@ -1090,6 +1532,26 @@ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "license": "MIT" }, + "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-regex2": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", @@ -1191,6 +1653,12 @@ "node": ">=12" } }, + "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/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", @@ -1245,6 +1713,35 @@ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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" + } } } } diff --git a/package.json b/package.json index 9d9678d..91d0b7e 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,12 @@ "dependencies": { "chess.js": "^1.4.0", "fastify": "^5.0.0", - "chess-ai-kong": "^0.3.3" + "chess-ai-kong": "^0.3.3", + "@fastify/cors": "^10.0.1", + "@fastify/rate-limit": "^10.1.0", + "drizzle-orm": "^0.39.0", + "postgres": "^3.4.5", + "google-auth-library": "^9.15.1" }, "devDependencies": { "typescript": "^5.7.3", diff --git a/src/bootstrap.ts b/src/bootstrap.ts new file mode 100644 index 0000000..790ad50 --- /dev/null +++ b/src/bootstrap.ts @@ -0,0 +1,59 @@ +import { client } from './db.js'; + +export async function ensureSchema() { + await client` + create table if not exists users ( + id text primary key, + email text not null unique, + name text not null, + picture text, + created_at timestamptz not null default now() + ); + `; + + await client` + create table if not exists sessions ( + token text primary key, + user_id text not null references users(id) on delete cascade, + expires_at timestamptz not null, + created_at timestamptz not null default now() + ); + `; + + await client` + create table if not exists api_keys ( + id text primary key, + user_id text not null references users(id) on delete cascade, + name text not null, + key_hash text not null unique, + key_prefix text not null, + active boolean not null default true, + created_at timestamptz not null default now(), + last_used_at timestamptz + ); + `; + + await client` + create table if not exists games ( + id text primary key, + user_id text not null references users(id) on delete cascade, + mode text not null, + ai_color text, + fen text not null, + pgn text not null, + turn text not null, + status text not null, + result_reason text, + result_winner text, + history jsonb not null, + initial_ms integer, + increment_ms integer, + remaining_w integer, + remaining_b integer, + running text, + last_tick_at integer, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now() + ); + `; +} diff --git a/src/crypto.ts b/src/crypto.ts new file mode 100644 index 0000000..a7377f5 --- /dev/null +++ b/src/crypto.ts @@ -0,0 +1,13 @@ +import crypto from 'node:crypto'; + +export function randomId() { + return crypto.randomUUID(); +} + +export function randomToken(bytes = 32) { + return crypto.randomBytes(bytes).toString('hex'); +} + +export function sha256(input: string) { + return crypto.createHash('sha256').update(input).digest('hex'); +} diff --git a/src/db.ts b/src/db.ts new file mode 100644 index 0000000..6856044 --- /dev/null +++ b/src/db.ts @@ -0,0 +1,11 @@ +import postgres from 'postgres'; +import { drizzle } from 'drizzle-orm/postgres-js'; + +const connection = process.env.DATABASE_URL; +if (!connection) { + throw new Error('DATABASE_URL is required'); +} + +const client = postgres(connection, { prepare: false }); +export const db = drizzle(client); +export { client }; diff --git a/src/google.ts b/src/google.ts new file mode 100644 index 0000000..dc7848c --- /dev/null +++ b/src/google.ts @@ -0,0 +1,23 @@ +import { OAuth2Client } from 'google-auth-library'; + +const googleClientId = process.env.GOOGLE_CLIENT_ID; +if (!googleClientId) { + throw new Error('GOOGLE_CLIENT_ID is required'); +} + +const client = new OAuth2Client(googleClientId); + +export async function verifyGoogleIdToken(idToken: string) { + const ticket = await client.verifyIdToken({ idToken, audience: googleClientId }); + const payload = ticket.getPayload(); + if (!payload?.sub || !payload.email || !payload.name) { + throw new Error('Invalid Google token payload'); + } + + return { + googleId: payload.sub, + email: payload.email, + name: payload.name, + picture: payload.picture ?? null + }; +} diff --git a/src/schema.ts b/src/schema.ts new file mode 100644 index 0000000..3097f8b --- /dev/null +++ b/src/schema.ts @@ -0,0 +1,49 @@ +import { pgTable, text, timestamp, boolean, jsonb, integer } from 'drizzle-orm/pg-core'; + +export const users = pgTable('users', { + id: text('id').primaryKey(), + email: text('email').notNull().unique(), + name: text('name').notNull(), + picture: text('picture'), + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow() +}); + +export const sessions = pgTable('sessions', { + token: text('token').primaryKey(), + userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }), + expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(), + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow() +}); + +export const apiKeys = pgTable('api_keys', { + id: text('id').primaryKey(), + userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }), + name: text('name').notNull(), + keyHash: text('key_hash').notNull().unique(), + keyPrefix: text('key_prefix').notNull(), + active: boolean('active').notNull().default(true), + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), + lastUsedAt: timestamp('last_used_at', { withTimezone: true }) +}); + +export const games = pgTable('games', { + id: text('id').primaryKey(), + userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }), + mode: text('mode').notNull(), + aiColor: text('ai_color'), + fen: text('fen').notNull(), + pgn: text('pgn').notNull(), + turn: text('turn').notNull(), + status: text('status').notNull(), + resultReason: text('result_reason'), + resultWinner: text('result_winner'), + history: jsonb('history').notNull().$type(), + initialMs: integer('initial_ms'), + incrementMs: integer('increment_ms'), + remainingW: integer('remaining_w'), + remainingB: integer('remaining_b'), + running: text('running'), + lastTickAt: integer('last_tick_at'), + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), + updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow() +}); diff --git a/src/server.ts b/src/server.ts index c6c6f92..1dae071 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,118 +1,269 @@ import Fastify from 'fastify'; +import rateLimit from '@fastify/rate-limit'; +import cors from '@fastify/cors'; +import { and, eq, gt } from 'drizzle-orm'; +import { db } from './db.js'; +import { apiKeys, games, sessions, users } from './schema.js'; +import { ensureSchema } from './bootstrap.js'; +import { randomId, randomToken, sha256 } from './crypto.js'; +import { verifyGoogleIdToken } from './google.js'; import { aiMove, - createGame, - deleteGame, - getGame, + hydrate, legalMoves, makeMove, + newGameState, + present, resign, - state, + serialize, type Color, type GameMode } from './store.js'; const app = Fastify({ logger: true }); +await app.register(cors, { origin: true }); +await app.register(rateLimit, { max: 200, timeWindow: '1 minute' }); +await ensureSchema(); + +type SessionUser = { id: string; email: string; name: string }; + +declare module 'fastify' { + interface FastifyRequest { + sessionUser?: SessionUser; + apiUserId?: string; + } +} + +async function requireSession(request: any, reply: any) { + const auth = request.headers.authorization as string | undefined; + if (!auth?.startsWith('Bearer ')) return reply.code(401).send({ error: 'Missing bearer token' }); + + const token = auth.slice('Bearer '.length); + const rows = await db + .select({ userId: sessions.userId, email: users.email, name: users.name }) + .from(sessions) + .innerJoin(users, eq(users.id, sessions.userId)) + .where(and(eq(sessions.token, token), gt(sessions.expiresAt, new Date()))) + .limit(1); + + if (!rows.length) return reply.code(401).send({ error: 'Invalid session' }); + request.sessionUser = { id: rows[0]!.userId, email: rows[0]!.email, name: rows[0]!.name }; +} + +async function requireApiKey(request: any, reply: any) { + const key = request.headers['x-api-key'] as string | undefined; + if (!key) return reply.code(401).send({ error: 'Missing x-api-key' }); + + const keyHash = sha256(key); + const rows = await db + .select({ id: apiKeys.id, userId: apiKeys.userId }) + .from(apiKeys) + .where(and(eq(apiKeys.keyHash, keyHash), eq(apiKeys.active, true))) + .limit(1); + + if (!rows.length) return reply.code(401).send({ error: 'Invalid API key' }); + + await db.update(apiKeys).set({ lastUsedAt: new Date() }).where(eq(apiKeys.id, rows[0]!.id)); + request.apiUserId = rows[0]!.userId; +} app.get('/', async () => ({ ok: true, service: 'chess-api', docs: '/api' })); app.get('/api', async () => ({ - message: 'General Chess API', - endpoints: [ - 'POST /games', - 'GET /games/:id', - 'DELETE /games/:id', - 'GET /games/:id/moves?from=e2', - 'POST /games/:id/moves', - 'POST /games/:id/ai-move', - 'POST /games/:id/resign' - ] + message: 'Production Chess API', + auth: { + login: 'POST /auth/google', + me: 'GET /me', + apiKeys: 'POST/GET/DELETE /me/api-keys' + }, + chess: ['POST /games', 'GET /games/:id', 'DELETE /games/:id', 'GET /games/:id/moves', 'POST /games/:id/moves', 'POST /games/:id/ai-move', 'POST /games/:id/resign'] })); -app.post('/games', async (req, reply) => { - const body = (req.body ?? {}) as { +app.post('/auth/google', async (request, reply) => { + const body = (request.body ?? {}) as { idToken?: string }; + if (!body.idToken) return reply.code(400).send({ error: 'idToken is required' }); + + const profile = await verifyGoogleIdToken(body.idToken); + + const existing = await db.select().from(users).where(eq(users.email, profile.email)).limit(1); + const userId = existing[0]?.id ?? randomId(); + + if (!existing.length) { + await db.insert(users).values({ id: userId, email: profile.email, name: profile.name, picture: profile.picture }); + } + + const token = randomToken(32); + const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 30); + await db.insert(sessions).values({ token, userId, expiresAt }); + + return { accessToken: token, expiresAt, user: { id: userId, email: profile.email, name: profile.name, picture: profile.picture } }; +}); + +app.get('/me', { preHandler: requireSession }, async (request) => { + return { user: request.sessionUser }; +}); + +app.get('/me/api-keys', { preHandler: requireSession }, async (request) => { + const rows = await db + .select({ id: apiKeys.id, name: apiKeys.name, keyPrefix: apiKeys.keyPrefix, active: apiKeys.active, createdAt: apiKeys.createdAt, lastUsedAt: apiKeys.lastUsedAt }) + .from(apiKeys) + .where(eq(apiKeys.userId, request.sessionUser!.id)); + + return { items: rows }; +}); + +app.post('/me/api-keys', { preHandler: requireSession }, async (request, reply) => { + const body = (request.body ?? {}) as { name?: string }; + const name = (body.name ?? 'default').slice(0, 80); + + const rawKey = `chess_${randomToken(24)}`; + const keyHash = sha256(rawKey); + const keyPrefix = rawKey.slice(0, 12); + + await db.insert(apiKeys).values({ + id: randomId(), + userId: request.sessionUser!.id, + name, + keyHash, + keyPrefix, + active: true + }); + + reply.code(201); + return { apiKey: rawKey, prefix: keyPrefix, name }; +}); + +app.delete('/me/api-keys/:id', { preHandler: requireSession }, async (request, reply) => { + const { id } = request.params as { id: string }; + await db + .update(apiKeys) + .set({ active: false }) + .where(and(eq(apiKeys.id, id), eq(apiKeys.userId, request.sessionUser!.id))); + return reply.code(204).send(); +}); + +app.post('/games', { preHandler: requireApiKey }, async (request, reply) => { + const body = (request.body ?? {}) as { mode?: GameMode; fen?: string; aiColor?: Color; timeControl?: { initialSeconds: number; incrementSeconds?: number }; }; - const game = createGame({ - mode: body.mode ?? 'pvp', - fen: body.fen, - aiColor: body.aiColor, - timeControl: body.timeControl + const gameId = randomId(); + const state = newGameState(body); + const payload = serialize(state); + + await db.insert(games).values({ + id: gameId, + userId: request.apiUserId!, + ...payload, + updatedAt: new Date() }); reply.code(201); - return state(game); + return present(gameId, state); }); -app.get('/games/:id', async (req, reply) => { - const { id } = req.params as { id: string }; - const game = getGame(id); - if (!game) return reply.code(404).send({ error: 'Game not found' }); - return state(game); +app.get('/games/:id', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params as { id: string }; + const rows = await db + .select() + .from(games) + .where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))) + .limit(1); + + const row = rows[0]; + if (!row) return reply.code(404).send({ error: 'Game not found' }); + + const state = hydrate(row as any); + const view = present(id, state); + + await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); + return view; }); -app.delete('/games/:id', async (req, reply) => { - const { id } = req.params as { id: string }; - const ok = deleteGame(id); - if (!ok) return reply.code(404).send({ error: 'Game not found' }); +app.delete('/games/:id', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params as { id: string }; + await db.delete(games).where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))); return reply.code(204).send(); }); -app.get('/games/:id/moves', async (req, reply) => { - const { id } = req.params as { id: string }; - const { from } = (req.query ?? {}) as { from?: string }; - const game = getGame(id); - if (!game) return reply.code(404).send({ error: 'Game not found' }); +app.get('/games/:id/moves', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params as { id: string }; + const { from } = (request.query ?? {}) as { from?: string }; + const rows = await db + .select() + .from(games) + .where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))) + .limit(1); + const row = rows[0]; + if (!row) return reply.code(404).send({ error: 'Game not found' }); - const moves = legalMoves(game, from); + const state = hydrate(row as any); + const moves = legalMoves(state, from); + await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); return { gameId: id, from: from ?? null, count: moves.length, moves }; }); -app.post('/games/:id/moves', async (req, reply) => { - const { id } = req.params as { id: string }; - const body = (req.body ?? {}) as { - san?: string; - from?: string; - to?: string; - promotion?: 'q' | 'r' | 'b' | 'n'; - }; +app.post('/games/:id/moves', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params as { id: string }; + const body = (request.body ?? {}) as { san?: string; from?: string; to?: string; promotion?: 'q' | 'r' | 'b' | 'n' }; - const game = getGame(id); - if (!game) return reply.code(404).send({ error: 'Game not found' }); + const rows = await db + .select() + .from(games) + .where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))) + .limit(1); + const row = rows[0]; + if (!row) return reply.code(404).send({ error: 'Game not found' }); - const result = makeMove(game, body); + const state = hydrate(row as any); + const result = makeMove(state, body); if ('error' in result) return reply.code(422).send(result); - return { move: result.move, state: state(game) }; + await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); + return { move: result.move, state: present(id, state) }; }); -app.post('/games/:id/ai-move', async (req, reply) => { - const { id } = req.params as { id: string }; - const game = getGame(id); - if (!game) return reply.code(404).send({ error: 'Game not found' }); +app.post('/games/:id/ai-move', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params as { id: string }; + + const rows = await db + .select() + .from(games) + .where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))) + .limit(1); + const row = rows[0]; + if (!row) return reply.code(404).send({ error: 'Game not found' }); - const result = await aiMove(game); + const state = hydrate(row as any); + const result = await aiMove(state); if ('error' in result) return reply.code(422).send(result); - return { move: result.move, state: state(game) }; + await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); + return { move: result.move, state: present(id, state) }; }); -app.post('/games/:id/resign', async (req, reply) => { - const { id } = req.params as { id: string }; - const body = (req.body ?? {}) as { color?: Color }; - const game = getGame(id); - if (!game) return reply.code(404).send({ error: 'Game not found' }); - +app.post('/games/:id/resign', { preHandler: requireApiKey }, async (request, reply) => { + const { id } = request.params as { id: string }; + const body = (request.body ?? {}) as { color?: Color }; if (!body.color || !['w', 'b'].includes(body.color)) { return reply.code(400).send({ error: 'color must be w or b' }); } - resign(game, body.color); - return state(game); + const rows = await db + .select() + .from(games) + .where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))) + .limit(1); + const row = rows[0]; + if (!row) return reply.code(404).send({ error: 'Game not found' }); + + const state = hydrate(row as any); + resign(state, body.color); + await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); + return present(id, state); }); const port = Number(process.env.PORT || 3000); diff --git a/src/store.ts b/src/store.ts index c2876eb..c1880c3 100644 --- a/src/store.ts +++ b/src/store.ts @@ -1,11 +1,17 @@ import { Chess, type Square } from 'chess.js'; -import crypto from 'node:crypto'; import { createRequire } from 'node:module'; -import { spawn } from 'node:child_process'; export type GameMode = 'pvp' | 'pve'; export type Color = 'w' | 'b'; +const require = createRequire(import.meta.url); +const chessAI: { + play: (history: string[]) => string; + setOptions: (opts: { depth?: number; monitor?: boolean; strategy?: string; timeout?: number }) => void; +} = require('chess-ai-kong'); + +chessAI.setOptions({ depth: 3, monitor: false, strategy: 'basic', timeout: 5000 }); + export interface TimeControl { initialMs: number; incrementMs: number; @@ -14,121 +20,35 @@ export interface TimeControl { lastTickAt: number; } -export interface Game { - id: string; +export interface GameState { mode: GameMode; + aiColor: Color | null; chess: Chess; - createdAt: string; - updatedAt: string; status: 'active' | 'finished'; - result?: { - reason: 'checkmate' | 'draw' | 'timeout' | 'resign'; - winner: Color | null; - }; + result: { reason: 'checkmate' | 'draw' | 'timeout' | 'resign'; winner: Color | null } | null; timeControl: TimeControl | null; - aiColor: Color | null; -} - -export interface CreateGameInput { - fen?: string; - mode?: GameMode; - aiColor?: Color; - timeControl?: { - initialSeconds: number; - incrementSeconds?: number; - }; -} - -const games = new Map(); - -const require = createRequire(import.meta.url); -// eslint-disable-next-line @typescript-eslint/no-var-requires -const chessAI: { - play: (history: string[]) => string; - setOptions: (opts: { depth?: number; monitor?: boolean; strategy?: string; timeout?: number }) => void; -} = require('chess-ai-kong'); - -chessAI.setOptions({ - depth: 3, - monitor: false, - strategy: 'basic', - timeout: 5000 -}); - -async function getStockfishBestMove(fen: string, moveTimeMs = 400): Promise { - return new Promise((resolve) => { - const engine = spawn('stockfish'); - let settled = false; - - const done = (move: string | null) => { - if (settled) return; - settled = true; - try { - engine.stdin.write('quit\n'); - } catch { - // ignore - } - engine.kill(); - resolve(move); - }; - - const timeout = setTimeout(() => done(null), Math.max(200, moveTimeMs + 1500)); - - engine.once('error', () => { - clearTimeout(timeout); - done(null); - }); - - engine.stdout.setEncoding('utf8'); - engine.stdout.on('data', (chunk: string) => { - const lines = chunk - .split(/\r?\n/) - .map((l) => l.trim()) - .filter(Boolean); - - for (const line of lines) { - if (line === 'uciok') { - engine.stdin.write('isready\n'); - } else if (line === 'readyok') { - engine.stdin.write(`position fen ${fen}\n`); - engine.stdin.write(`go movetime ${moveTimeMs}\n`); - } else if (line.startsWith('bestmove ')) { - clearTimeout(timeout); - const move = line.split(' ')[1] ?? null; - done(move && move !== '(none)' ? move : null); - } - } - }); - - engine.stdin.write('uci\n'); - }); -} - -function nowIso() { - return new Date().toISOString(); -} - -function nowMs() { - return Date.now(); } function opposite(c: Color): Color { return c === 'w' ? 'b' : 'w'; } -export function createGame(input: CreateGameInput = {}): Game { +export function newGameState(input: { + mode?: GameMode; + fen?: string; + aiColor?: Color; + timeControl?: { initialSeconds: number; incrementSeconds?: number }; +}): GameState { const chess = new Chess(); if (input.fen) chess.load(input.fen); - - const id = crypto.randomUUID(); const turn = chess.turn(); - const game: Game = { - id, + + return { mode: input.mode ?? 'pvp', + aiColor: (input.mode ?? 'pvp') === 'pve' ? input.aiColor ?? 'b' : null, chess, - createdAt: nowIso(), - updatedAt: nowIso(), status: 'active', + result: null, timeControl: input.timeControl ? { initialMs: Math.max(1, input.timeControl.initialSeconds) * 1000, @@ -138,165 +58,178 @@ export function createGame(input: CreateGameInput = {}): Game { b: Math.max(1, input.timeControl.initialSeconds) * 1000 }, running: turn, - lastTickAt: nowMs() + lastTickAt: Date.now() } - : null, - aiColor: (input.mode ?? 'pvp') === 'pve' ? input.aiColor ?? 'b' : null + : null }; - - games.set(id, game); - return game; } -export function getGame(id: string): Game | undefined { - return games.get(id); -} +export function hydrate(row: { + mode: string; + aiColor: string | null; + fen: string; + status: string; + resultReason: string | null; + resultWinner: string | null; + initialMs: number | null; + incrementMs: number | null; + remainingW: number | null; + remainingB: number | null; + running: string | null; + lastTickAt: number | null; +}): GameState { + const chess = new Chess(row.fen); + const timeControl = + row.initialMs && row.incrementMs !== null && row.remainingW !== null && row.remainingB !== null && row.running && row.lastTickAt + ? { + initialMs: row.initialMs, + incrementMs: row.incrementMs, + remaining: { w: row.remainingW, b: row.remainingB }, + running: row.running as Color, + lastTickAt: row.lastTickAt + } + : null; -export function deleteGame(id: string): boolean { - return games.delete(id); + return { + mode: row.mode as GameMode, + aiColor: (row.aiColor as Color | null) ?? null, + chess, + status: row.status as 'active' | 'finished', + result: row.resultReason + ? { reason: row.resultReason as 'checkmate' | 'draw' | 'timeout' | 'resign', winner: (row.resultWinner as Color | null) ?? null } + : null, + timeControl + }; } -function finishIfGameOver(game: Game) { - if (!game.chess.isGameOver()) return; +export function serialize(state: GameState) { + return { + mode: state.mode, + aiColor: state.aiColor, + fen: state.chess.fen(), + pgn: state.chess.pgn(), + turn: state.chess.turn(), + status: state.status, + resultReason: state.result?.reason ?? null, + resultWinner: state.result?.winner ?? null, + history: state.chess.history({ verbose: true }), + initialMs: state.timeControl?.initialMs ?? null, + incrementMs: state.timeControl?.incrementMs ?? null, + remainingW: state.timeControl?.remaining.w ?? null, + remainingB: state.timeControl?.remaining.b ?? null, + running: state.timeControl?.running ?? null, + lastTickAt: state.timeControl?.lastTickAt ?? null + }; +} - game.status = 'finished'; - if (game.chess.isCheckmate()) { - game.result = { reason: 'checkmate', winner: opposite(game.chess.turn()) }; +function finishIfGameOver(state: GameState) { + if (!state.chess.isGameOver()) return; + state.status = 'finished'; + if (state.chess.isCheckmate()) { + state.result = { reason: 'checkmate', winner: opposite(state.chess.turn()) }; return; } - - game.result = { reason: 'draw', winner: null }; -} - -function applyClockTick(game: Game) { - if (!game.timeControl || game.status !== 'active') return; - - const tc = game.timeControl; - const now = nowMs(); - const elapsed = Math.max(0, now - tc.lastTickAt); - tc.remaining[tc.running] = Math.max(0, tc.remaining[tc.running] - elapsed); - tc.lastTickAt = now; - - if (tc.remaining[tc.running] <= 0) { - game.status = 'finished'; - game.result = { reason: 'timeout', winner: opposite(tc.running) }; + state.result = { reason: 'draw', winner: null }; +} + +export function tick(state: GameState) { + if (!state.timeControl || state.status !== 'active') return; + const now = Date.now(); + const elapsed = Math.max(0, now - state.timeControl.lastTickAt); + state.timeControl.remaining[state.timeControl.running] = Math.max( + 0, + state.timeControl.remaining[state.timeControl.running] - elapsed + ); + state.timeControl.lastTickAt = now; + + if (state.timeControl.remaining[state.timeControl.running] <= 0) { + state.status = 'finished'; + state.result = { reason: 'timeout', winner: opposite(state.timeControl.running) }; } } -function afterMove(game: Game, mover: Color) { - if (game.timeControl) { - const tc = game.timeControl; - tc.remaining[mover] += tc.incrementMs; - tc.running = game.chess.turn(); - tc.lastTickAt = nowMs(); +function afterMove(state: GameState, mover: Color) { + if (state.timeControl) { + state.timeControl.remaining[mover] += state.timeControl.incrementMs; + state.timeControl.running = state.chess.turn(); + state.timeControl.lastTickAt = Date.now(); } - - finishIfGameOver(game); - game.updatedAt = nowIso(); + finishIfGameOver(state); } -export function legalMoves(game: Game, from?: string) { - applyClockTick(game); - if (game.status !== 'active') return []; - - if (from) return game.chess.moves({ square: from as Square }); - return game.chess.moves(); +export function legalMoves(state: GameState, from?: string) { + tick(state); + if (state.status !== 'active') return [] as string[]; + return from ? state.chess.moves({ square: from as Square }) : state.chess.moves(); } -export function makeMove( - game: Game, - payload: { san?: string; from?: string; to?: string; promotion?: 'q' | 'r' | 'b' | 'n' } -) { - applyClockTick(game); - if (game.status !== 'active') return { error: 'Game is already finished' } as const; +export function makeMove(state: GameState, payload: { san?: string; from?: string; to?: string; promotion?: 'q' | 'r' | 'b' | 'n' }) { + tick(state); + if (state.status !== 'active') return { error: 'Game is already finished' } as const; - const mover = game.chess.turn(); + const mover = state.chess.turn(); const move = payload.san - ? game.chess.move(payload.san) + ? state.chess.move(payload.san) : payload.from && payload.to - ? game.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) + ? state.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) : null; if (!move) return { error: 'Illegal move' } as const; - - afterMove(game, mover); + afterMove(state, mover); return { move } as const; } -export async function aiMove(game: Game) { - applyClockTick(game); - if (game.status !== 'active') return { error: 'Game is already finished' } as const; - if (game.mode !== 'pve') return { error: 'AI move only supported for pve games' } as const; - if (game.aiColor !== game.chess.turn()) return { error: 'Not AI turn' } as const; +export async function aiMove(state: GameState) { + tick(state); + if (state.status !== 'active') return { error: 'Game is already finished' } as const; + if (state.mode !== 'pve') return { error: 'AI move only supported for pve games' } as const; + if (state.aiColor !== state.chess.turn()) return { error: 'Not AI turn' } as const; - const mover = game.chess.turn(); - const moves = game.chess.moves(); - if (!moves.length) { - finishIfGameOver(game); - return { error: 'No legal AI moves' } as const; - } + const mover = state.chess.turn(); + const legal = state.chess.moves(); + if (!legal.length) return { error: 'No legal AI moves' } as const; - let move: ReturnType | null = null; - - // Preferred engine: Stockfish (UCI) - const uciMove = await getStockfishBestMove(game.chess.fen()); - if (uciMove && uciMove.length >= 4) { - const from = uciMove.slice(0, 2); - const to = uciMove.slice(2, 4); - const promotion = (uciMove.slice(4, 5) || undefined) as 'q' | 'r' | 'b' | 'n' | undefined; - move = game.chess.move({ from, to, promotion }); + let move = null as ReturnType | null; + try { + const san = chessAI.play(state.chess.history()); + move = state.chess.move(san); + } catch { + move = null; } - // Fallback: legacy kong engine if (!move) { - try { - const history = game.chess.history(); - const san = chessAI.play(history); - move = game.chess.move(san); - } catch { - move = null; - } - } - - // Final fallback: random legal move - if (!move) { - const pick = moves[Math.floor(Math.random() * moves.length)]!; - move = game.chess.move(pick); + const pick = legal[Math.floor(Math.random() * legal.length)]!; + move = state.chess.move(pick); } if (!move) return { error: 'AI failed to move' } as const; - - afterMove(game, mover); + afterMove(state, mover); return { move } as const; } -export function resign(game: Game, color: Color) { - if (game.status !== 'active') return; - game.status = 'finished'; - game.result = { reason: 'resign', winner: opposite(color) }; - game.updatedAt = nowIso(); +export function resign(state: GameState, color: Color) { + if (state.status !== 'active') return; + state.status = 'finished'; + state.result = { reason: 'resign', winner: opposite(color) }; } -export function state(game: Game) { - applyClockTick(game); +export function present(id: string, state: GameState) { + tick(state); return { - id: game.id, - mode: game.mode, - status: game.status, - result: game.result ?? null, - createdAt: game.createdAt, - updatedAt: game.updatedAt, - fen: game.chess.fen(), - pgn: game.chess.pgn(), - turn: game.chess.turn(), - legalMoveCount: game.chess.moves().length, - history: game.chess.history({ verbose: true }), - timeControl: game.timeControl + id, + mode: state.mode, + status: state.status, + result: state.result, + fen: state.chess.fen(), + pgn: state.chess.pgn(), + turn: state.chess.turn(), + history: state.chess.history({ verbose: true }), + timeControl: state.timeControl ? { - initialMs: game.timeControl.initialMs, - incrementMs: game.timeControl.incrementMs, - remaining: game.timeControl.remaining, - running: game.timeControl.running + initialMs: state.timeControl.initialMs, + incrementMs: state.timeControl.incrementMs, + remaining: state.timeControl.remaining, + running: state.timeControl.running } : null }; From 17d5ea8e9bcdf0b1469e358414dc16f8b96b0067 Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 20:09:29 +0100 Subject: [PATCH 09/59] refactor(architecture): rewrite API to NestJS modular structure --- README.md | 64 +- dist/app.module.js | 29 + dist/app.module.js.map | 1 + dist/bootstrap.js | 55 - dist/common/guards/api-key.guard.js | 44 + dist/common/guards/api-key.guard.js.map | 1 + dist/common/guards/session.guard.js | 31 + dist/common/guards/session.guard.js.map | 1 + dist/config/crypto.js | 5 + dist/config/crypto.js.map | 1 + dist/crypto.js | 10 - dist/database/database.module.js | 19 + dist/database/database.module.js.map | 1 + dist/database/database.service.js | 79 + dist/database/database.service.js.map | 1 + dist/{ => database}/schema.js | 9 +- dist/database/schema.js.map | 1 + dist/db.js | 9 - dist/google.js | 19 - dist/main.js | 10 + dist/main.js.map | 1 + dist/modules/auth/auth.controller.js | 36 + dist/modules/auth/auth.controller.js.map | 1 + dist/modules/auth/auth.module.js | 20 + dist/modules/auth/auth.module.js.map | 1 + dist/modules/auth/auth.service.js | 73 + dist/modules/auth/auth.service.js.map | 1 + dist/modules/chess/chess.controller.js | 111 ++ dist/modules/chess/chess.controller.js.map | 1 + dist/modules/chess/chess.engine.js | 158 ++ dist/modules/chess/chess.engine.js.map | 1 + dist/modules/chess/chess.module.js | 19 + dist/modules/chess/chess.module.js.map | 1 + dist/modules/chess/chess.service.js | 84 + dist/modules/chess/chess.service.js.map | 1 + dist/modules/health/health.controller.js | 47 + dist/modules/health/health.controller.js.map | 1 + dist/modules/health/health.module.js | 15 + dist/modules/health/health.module.js.map | 1 + dist/modules/users/users.controller.js | 71 + dist/modules/users/users.controller.js.map | 1 + dist/modules/users/users.module.js | 21 + dist/modules/users/users.module.js.map | 1 + dist/modules/users/users.service.js | 57 + dist/modules/users/users.service.js.map | 1 + dist/server.js | 212 -- dist/store.js | 181 -- package-lock.json | 1839 +++++++++++++----- package.json | 15 +- src/app.module.ts | 19 + src/bootstrap.ts | 59 - src/common/guards/api-key.guard.ts | 30 + src/common/guards/session.guard.ts | 15 + src/config/crypto.ts | 5 + src/crypto.ts | 13 - src/database/database.module.ts | 9 + src/database/database.service.ts | 67 + src/{ => database}/schema.ts | 8 +- src/db.ts | 11 - src/google.ts | 23 - src/main.ts | 11 + src/modules/auth/auth.controller.ts | 12 + src/modules/auth/auth.module.ts | 10 + src/modules/auth/auth.service.ts | 63 + src/modules/chess/chess.controller.ts | 46 + src/modules/chess/chess.engine.ts | 178 ++ src/modules/chess/chess.module.ts | 9 + src/modules/chess/chess.service.ts | 74 + src/modules/health/health.controller.ts | 26 + src/modules/health/health.module.ts | 5 + src/modules/users/users.controller.ts | 30 + src/modules/users/users.module.ts | 11 + src/modules/users/users.service.ts | 44 + src/server.ts | 272 --- src/store.ts | 236 --- tsconfig.json | 8 +- 76 files changed, 2998 insertions(+), 1658 deletions(-) create mode 100644 dist/app.module.js create mode 100644 dist/app.module.js.map delete mode 100644 dist/bootstrap.js create mode 100644 dist/common/guards/api-key.guard.js create mode 100644 dist/common/guards/api-key.guard.js.map create mode 100644 dist/common/guards/session.guard.js create mode 100644 dist/common/guards/session.guard.js.map create mode 100644 dist/config/crypto.js create mode 100644 dist/config/crypto.js.map delete mode 100644 dist/crypto.js create mode 100644 dist/database/database.module.js create mode 100644 dist/database/database.module.js.map create mode 100644 dist/database/database.service.js create mode 100644 dist/database/database.service.js.map rename dist/{ => database}/schema.js (95%) create mode 100644 dist/database/schema.js.map delete mode 100644 dist/db.js delete mode 100644 dist/google.js create mode 100644 dist/main.js create mode 100644 dist/main.js.map create mode 100644 dist/modules/auth/auth.controller.js create mode 100644 dist/modules/auth/auth.controller.js.map create mode 100644 dist/modules/auth/auth.module.js create mode 100644 dist/modules/auth/auth.module.js.map create mode 100644 dist/modules/auth/auth.service.js create mode 100644 dist/modules/auth/auth.service.js.map create mode 100644 dist/modules/chess/chess.controller.js create mode 100644 dist/modules/chess/chess.controller.js.map create mode 100644 dist/modules/chess/chess.engine.js create mode 100644 dist/modules/chess/chess.engine.js.map create mode 100644 dist/modules/chess/chess.module.js create mode 100644 dist/modules/chess/chess.module.js.map create mode 100644 dist/modules/chess/chess.service.js create mode 100644 dist/modules/chess/chess.service.js.map create mode 100644 dist/modules/health/health.controller.js create mode 100644 dist/modules/health/health.controller.js.map create mode 100644 dist/modules/health/health.module.js create mode 100644 dist/modules/health/health.module.js.map create mode 100644 dist/modules/users/users.controller.js create mode 100644 dist/modules/users/users.controller.js.map create mode 100644 dist/modules/users/users.module.js create mode 100644 dist/modules/users/users.module.js.map create mode 100644 dist/modules/users/users.service.js create mode 100644 dist/modules/users/users.service.js.map delete mode 100644 dist/server.js delete mode 100644 dist/store.js create mode 100644 src/app.module.ts delete mode 100644 src/bootstrap.ts create mode 100644 src/common/guards/api-key.guard.ts create mode 100644 src/common/guards/session.guard.ts create mode 100644 src/config/crypto.ts delete mode 100644 src/crypto.ts create mode 100644 src/database/database.module.ts create mode 100644 src/database/database.service.ts rename src/{ => database}/schema.ts (93%) delete mode 100644 src/db.ts delete mode 100644 src/google.ts create mode 100644 src/main.ts create mode 100644 src/modules/auth/auth.controller.ts create mode 100644 src/modules/auth/auth.module.ts create mode 100644 src/modules/auth/auth.service.ts create mode 100644 src/modules/chess/chess.controller.ts create mode 100644 src/modules/chess/chess.engine.ts create mode 100644 src/modules/chess/chess.module.ts create mode 100644 src/modules/chess/chess.service.ts create mode 100644 src/modules/health/health.controller.ts create mode 100644 src/modules/health/health.module.ts create mode 100644 src/modules/users/users.controller.ts create mode 100644 src/modules/users/users.module.ts create mode 100644 src/modules/users/users.service.ts delete mode 100644 src/server.ts delete mode 100644 src/store.ts diff --git a/README.md b/README.md index 7dddb4a..87fc485 100644 --- a/README.md +++ b/README.md @@ -1,69 +1,45 @@ -# chess-api (rewrite) +# chess-api (NestJS rewrite) -Production-style chess API with: -- Google social auth (users) -- API key management per user -- Chess game endpoints protected by API key -- PvP + PvE -- Timed games (clock + increment) -- Postgres + Drizzle +Proper modular architecture with NestJS: -## Stack -- Fastify -- Drizzle ORM -- PostgreSQL -- chess.js -- chess-ai-kong (engine) +- `AuthModule` (Google login + sessions) +- `UsersModule` (API key management) +- `ChessModule` (game lifecycle, clocks, PvP/PvE) +- `DatabaseModule` (Postgres + Drizzle) +- `HealthModule` (root/docs) -## Environment -Create `.env` with: +## Tech +- NestJS +- PostgreSQL +- Drizzle ORM +- Google OAuth ID token verification +- chess.js + chess-ai-kong +## Env ```env DATABASE_URL=postgres://... -GOOGLE_CLIENT_ID=your-google-oauth-client-id +GOOGLE_CLIENT_ID=your-google-client-id.apps.googleusercontent.com PORT=3000 ``` ## Run - ```bash npm install npm run dev ``` -## Auth flow -1. Client performs Google Sign-In and gets `idToken` -2. Call `POST /auth/google` with `{ "idToken": "..." }` -3. Receive `accessToken` (session bearer) -4. Use bearer token for `/me` + `/me/api-keys` -5. Use generated API key in `x-api-key` header for chess routes - -## API overview - -### Session auth routes -- `POST /auth/google` -- `GET /me` +## Auth routes +- `POST /auth/google` with `{ idToken }` +- `GET /me` (Bearer session token) - `GET /me/api-keys` - `POST /me/api-keys` - `DELETE /me/api-keys/:id` -### Chess routes (require `x-api-key`) +## Chess routes (require `x-api-key`) - `POST /games` - `GET /games/:id` - `DELETE /games/:id` -- `GET /games/:id/moves?from=e2` +- `GET /games/:id/moves` - `POST /games/:id/moves` - `POST /games/:id/ai-move` - `POST /games/:id/resign` - -### Create game example -```json -{ - "mode": "pve", - "aiColor": "b", - "timeControl": { - "initialSeconds": 300, - "incrementSeconds": 2 - } -} -``` diff --git a/dist/app.module.js b/dist/app.module.js new file mode 100644 index 0000000..9194f4e --- /dev/null +++ b/dist/app.module.js @@ -0,0 +1,29 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { DatabaseModule } from './database/database.module.js'; +import { AuthModule } from './modules/auth/auth.module.js'; +import { UsersModule } from './modules/users/users.module.js'; +import { ChessModule } from './modules/chess/chess.module.js'; +import { HealthModule } from './modules/health/health.module.js'; +let AppModule = class AppModule { +}; +AppModule = __decorate([ + Module({ + imports: [ + ConfigModule.forRoot({ isGlobal: true }), + DatabaseModule, + AuthModule, + UsersModule, + ChessModule, + HealthModule, + ], + }) +], AppModule); +export { AppModule }; +//# sourceMappingURL=app.module.js.map \ No newline at end of file diff --git a/dist/app.module.js.map b/dist/app.module.js.map new file mode 100644 index 0000000..7bdf0d6 --- /dev/null +++ b/dist/app.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAY1D,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,SAAS;IAVrB,MAAM,CAAC;QACN,OAAO,EAAE;YACP,YAAY,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACxC,cAAc;YACd,UAAU;YACV,WAAW;YACX,WAAW;YACX,YAAY;SACb;KACF,CAAC;GACW,SAAS,CAAG"} \ No newline at end of file diff --git a/dist/bootstrap.js b/dist/bootstrap.js deleted file mode 100644 index 9fd8d36..0000000 --- a/dist/bootstrap.js +++ /dev/null @@ -1,55 +0,0 @@ -import { client } from './db.js'; -export async function ensureSchema() { - await client ` - create table if not exists users ( - id text primary key, - email text not null unique, - name text not null, - picture text, - created_at timestamptz not null default now() - ); - `; - await client ` - create table if not exists sessions ( - token text primary key, - user_id text not null references users(id) on delete cascade, - expires_at timestamptz not null, - created_at timestamptz not null default now() - ); - `; - await client ` - create table if not exists api_keys ( - id text primary key, - user_id text not null references users(id) on delete cascade, - name text not null, - key_hash text not null unique, - key_prefix text not null, - active boolean not null default true, - created_at timestamptz not null default now(), - last_used_at timestamptz - ); - `; - await client ` - create table if not exists games ( - id text primary key, - user_id text not null references users(id) on delete cascade, - mode text not null, - ai_color text, - fen text not null, - pgn text not null, - turn text not null, - status text not null, - result_reason text, - result_winner text, - history jsonb not null, - initial_ms integer, - increment_ms integer, - remaining_w integer, - remaining_b integer, - running text, - last_tick_at integer, - created_at timestamptz not null default now(), - updated_at timestamptz not null default now() - ); - `; -} diff --git a/dist/common/guards/api-key.guard.js b/dist/common/guards/api-key.guard.js new file mode 100644 index 0000000..15d66b6 --- /dev/null +++ b/dist/common/guards/api-key.guard.js @@ -0,0 +1,44 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { and, eq } from 'drizzle-orm'; +import { DatabaseService } from '../../database/database.service.js'; +import { apiKeys } from '../../database/schema.js'; +import { sha256 } from '../../config/crypto.js'; +let ApiKeyGuard = class ApiKeyGuard { + dbs; + constructor(dbs) { + this.dbs = dbs; + } + async canActivate(context) { + const req = context.switchToHttp().getRequest(); + const key = req.headers['x-api-key']; + if (!key) + throw new UnauthorizedException('Missing x-api-key'); + const keyHash = sha256(key); + const rows = await this.dbs.db + .select({ id: apiKeys.id, userId: apiKeys.userId }) + .from(apiKeys) + .where(and(eq(apiKeys.keyHash, keyHash), eq(apiKeys.active, true))) + .limit(1); + const api = rows[0]; + if (!api) + throw new UnauthorizedException('Invalid API key'); + await this.dbs.db.update(apiKeys).set({ lastUsedAt: new Date() }).where(eq(apiKeys.id, api.id)); + req.apiUserId = api.userId; + return true; + } +}; +ApiKeyGuard = __decorate([ + Injectable(), + __metadata("design:paramtypes", [DatabaseService]) +], ApiKeyGuard); +export { ApiKeyGuard }; +//# sourceMappingURL=api-key.guard.js.map \ No newline at end of file diff --git a/dist/common/guards/api-key.guard.js.map b/dist/common/guards/api-key.guard.js.map new file mode 100644 index 0000000..29f9936 --- /dev/null +++ b/dist/common/guards/api-key.guard.js.map @@ -0,0 +1 @@ +{"version":3,"file":"api-key.guard.js","sourceRoot":"","sources":["../../../src/common/guards/api-key.guard.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAiC,UAAU,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGzC,IAAM,WAAW,GAAjB,MAAM,WAAW;IACO;IAA7B,YAA6B,GAAoB;QAApB,QAAG,GAAH,GAAG,CAAiB;IAAG,CAAC;IAErD,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAuB,CAAC;QAC3D,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;QAE/D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;aAC3B,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;aAClD,IAAI,CAAC,OAAO,CAAC;aACb,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;aAClE,KAAK,CAAC,CAAC,CAAC,CAAC;QAEZ,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;QAE7D,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAChG,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAtBY,WAAW;IADvB,UAAU,EAAE;qCAEuB,eAAe;GADtC,WAAW,CAsBvB"} \ No newline at end of file diff --git a/dist/common/guards/session.guard.js b/dist/common/guards/session.guard.js new file mode 100644 index 0000000..8dadc9c --- /dev/null +++ b/dist/common/guards/session.guard.js @@ -0,0 +1,31 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { AuthService } from '../../modules/auth/auth.service.js'; +let SessionGuard = class SessionGuard { + auth; + constructor(auth) { + this.auth = auth; + } + async canActivate(context) { + const req = context.switchToHttp().getRequest(); + const session = await this.auth.sessionFromBearer(req.headers.authorization); + if (!session) + throw new UnauthorizedException('Invalid session'); + req.user = { id: session.userId, email: session.email, name: session.name }; + return true; + } +}; +SessionGuard = __decorate([ + Injectable(), + __metadata("design:paramtypes", [AuthService]) +], SessionGuard); +export { SessionGuard }; +//# sourceMappingURL=session.guard.js.map \ No newline at end of file diff --git a/dist/common/guards/session.guard.js.map b/dist/common/guards/session.guard.js.map new file mode 100644 index 0000000..1863527 --- /dev/null +++ b/dist/common/guards/session.guard.js.map @@ -0,0 +1 @@ +{"version":3,"file":"session.guard.js","sourceRoot":"","sources":["../../../src/common/guards/session.guard.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAiC,UAAU,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAG1D,IAAM,YAAY,GAAlB,MAAM,YAAY;IACM;IAA7B,YAA6B,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAAG,CAAC;IAElD,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;QACjE,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAVY,YAAY;IADxB,UAAU,EAAE;qCAEwB,WAAW;GADnC,YAAY,CAUxB"} \ No newline at end of file diff --git a/dist/config/crypto.js b/dist/config/crypto.js new file mode 100644 index 0000000..606b97d --- /dev/null +++ b/dist/config/crypto.js @@ -0,0 +1,5 @@ +import crypto from 'node:crypto'; +export const randomId = () => crypto.randomUUID(); +export const randomToken = (bytes = 32) => crypto.randomBytes(bytes).toString('hex'); +export const sha256 = (s) => crypto.createHash('sha256').update(s).digest('hex'); +//# sourceMappingURL=crypto.js.map \ No newline at end of file diff --git a/dist/config/crypto.js.map b/dist/config/crypto.js.map new file mode 100644 index 0000000..a6d92cc --- /dev/null +++ b/dist/config/crypto.js.map @@ -0,0 +1 @@ +{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/config/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;AAClD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/crypto.js b/dist/crypto.js deleted file mode 100644 index 2fbdaed..0000000 --- a/dist/crypto.js +++ /dev/null @@ -1,10 +0,0 @@ -import crypto from 'node:crypto'; -export function randomId() { - return crypto.randomUUID(); -} -export function randomToken(bytes = 32) { - return crypto.randomBytes(bytes).toString('hex'); -} -export function sha256(input) { - return crypto.createHash('sha256').update(input).digest('hex'); -} diff --git a/dist/database/database.module.js b/dist/database/database.module.js new file mode 100644 index 0000000..9bd2f55 --- /dev/null +++ b/dist/database/database.module.js @@ -0,0 +1,19 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { Global, Module } from '@nestjs/common'; +import { DatabaseService } from './database.service.js'; +let DatabaseModule = class DatabaseModule { +}; +DatabaseModule = __decorate([ + Global(), + Module({ + providers: [DatabaseService], + exports: [DatabaseService], + }) +], DatabaseModule); +export { DatabaseModule }; +//# sourceMappingURL=database.module.js.map \ No newline at end of file diff --git a/dist/database/database.module.js.map b/dist/database/database.module.js.map new file mode 100644 index 0000000..7b09bb4 --- /dev/null +++ b/dist/database/database.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"database.module.js","sourceRoot":"","sources":["../../src/database/database.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAOjD,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,cAAc;IAL1B,MAAM,EAAE;IACR,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,eAAe,CAAC;QAC5B,OAAO,EAAE,CAAC,eAAe,CAAC;KAC3B,CAAC;GACW,cAAc,CAAG"} \ No newline at end of file diff --git a/dist/database/database.service.js b/dist/database/database.service.js new file mode 100644 index 0000000..e32664b --- /dev/null +++ b/dist/database/database.service.js @@ -0,0 +1,79 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { Injectable } from '@nestjs/common'; +import postgres from 'postgres'; +import { drizzle } from 'drizzle-orm/postgres-js'; +let DatabaseService = class DatabaseService { + client; + db; + constructor() { + const url = process.env.DATABASE_URL; + if (!url) + throw new Error('DATABASE_URL is required'); + this.client = postgres(url, { prepare: false }); + this.db = drizzle(this.client); + } + async onModuleInit() { + await this.client ` + create table if not exists users ( + id text primary key, + email text not null unique, + name text not null, + picture text, + created_at timestamptz not null default now() + );`; + await this.client ` + create table if not exists sessions ( + token text primary key, + user_id text not null references users(id) on delete cascade, + expires_at timestamptz not null, + created_at timestamptz not null default now() + );`; + await this.client ` + create table if not exists api_keys ( + id text primary key, + user_id text not null references users(id) on delete cascade, + name text not null, + key_hash text not null unique, + key_prefix text not null, + active boolean not null default true, + created_at timestamptz not null default now(), + last_used_at timestamptz + );`; + await this.client ` + create table if not exists games ( + id text primary key, + user_id text not null references users(id) on delete cascade, + mode text not null, + ai_color text, + fen text not null, + pgn text not null, + turn text not null, + status text not null, + result_reason text, + result_winner text, + history jsonb not null, + initial_ms integer, + increment_ms integer, + remaining_w integer, + remaining_b integer, + running text, + last_tick_at integer, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now() + );`; + } +}; +DatabaseService = __decorate([ + Injectable(), + __metadata("design:paramtypes", []) +], DatabaseService); +export { DatabaseService }; +//# sourceMappingURL=database.service.js.map \ No newline at end of file diff --git a/dist/database/database.service.js.map b/dist/database/database.service.js.map new file mode 100644 index 0000000..8bd8b2e --- /dev/null +++ b/dist/database/database.service.js.map @@ -0,0 +1 @@ +{"version":3,"file":"database.service.js","sourceRoot":"","sources":["../../src/database/database.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,gBAAgB,CAAC;AAC1D,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAG3C,IAAM,eAAe,GAArB,MAAM,eAAe;IACjB,MAAM,CAAC;IACP,EAAE,CAAC;IAEZ;QACE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,MAAM,CAAA;;;;;;;SAOZ,CAAC;QACN,MAAM,IAAI,CAAC,MAAM,CAAA;;;;;;SAMZ,CAAC;QACN,MAAM,IAAI,CAAC,MAAM,CAAA;;;;;;;;;;SAUZ,CAAC;QACN,MAAM,IAAI,CAAC,MAAM,CAAA;;;;;;;;;;;;;;;;;;;;;SAqBZ,CAAC;IACR,CAAC;CACF,CAAA;AA7DY,eAAe;IAD3B,UAAU,EAAE;;GACA,eAAe,CA6D3B"} \ No newline at end of file diff --git a/dist/schema.js b/dist/database/schema.js similarity index 95% rename from dist/schema.js rename to dist/database/schema.js index 6f17dab..d3fb3e0 100644 --- a/dist/schema.js +++ b/dist/database/schema.js @@ -4,13 +4,13 @@ export const users = pgTable('users', { email: text('email').notNull().unique(), name: text('name').notNull(), picture: text('picture'), - createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow() + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), }); export const sessions = pgTable('sessions', { token: text('token').primaryKey(), userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }), expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(), - createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow() + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), }); export const apiKeys = pgTable('api_keys', { id: text('id').primaryKey(), @@ -20,7 +20,7 @@ export const apiKeys = pgTable('api_keys', { keyPrefix: text('key_prefix').notNull(), active: boolean('active').notNull().default(true), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), - lastUsedAt: timestamp('last_used_at', { withTimezone: true }) + lastUsedAt: timestamp('last_used_at', { withTimezone: true }), }); export const games = pgTable('games', { id: text('id').primaryKey(), @@ -41,5 +41,6 @@ export const games = pgTable('games', { running: text('running'), lastTickAt: integer('last_tick_at'), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), - updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow() + updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(), }); +//# sourceMappingURL=schema.js.map \ No newline at end of file diff --git a/dist/database/schema.js.map b/dist/database/schema.js.map new file mode 100644 index 0000000..10ec809 --- /dev/null +++ b/dist/database/schema.js.map @@ -0,0 +1 @@ +{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/database/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAExF,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE;IACpC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IACvC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAC5B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;IACxB,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;CAClF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE;IAC1C,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE;IACjC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACrF,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;IACpE,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;CAClF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE;IACzC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACrF,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAC5B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IAC5C,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACvC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACjD,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;IACjF,UAAU,EAAE,SAAS,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;CAC9D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE;IACpC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACrF,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAC5B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC;IACzB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;IAC1B,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;IAC1B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAC5B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;IAChC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;IACnC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;IACnC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,EAAa;IACtD,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC;IAChC,WAAW,EAAE,OAAO,CAAC,cAAc,CAAC;IACpC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC;IAClC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC;IACnC,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;IACjF,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;CAClF,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/db.js b/dist/db.js deleted file mode 100644 index 7a550f7..0000000 --- a/dist/db.js +++ /dev/null @@ -1,9 +0,0 @@ -import postgres from 'postgres'; -import { drizzle } from 'drizzle-orm/postgres-js'; -const connection = process.env.DATABASE_URL; -if (!connection) { - throw new Error('DATABASE_URL is required'); -} -const client = postgres(connection, { prepare: false }); -export const db = drizzle(client); -export { client }; diff --git a/dist/google.js b/dist/google.js deleted file mode 100644 index c060002..0000000 --- a/dist/google.js +++ /dev/null @@ -1,19 +0,0 @@ -import { OAuth2Client } from 'google-auth-library'; -const googleClientId = process.env.GOOGLE_CLIENT_ID; -if (!googleClientId) { - throw new Error('GOOGLE_CLIENT_ID is required'); -} -const client = new OAuth2Client(googleClientId); -export async function verifyGoogleIdToken(idToken) { - const ticket = await client.verifyIdToken({ idToken, audience: googleClientId }); - const payload = ticket.getPayload(); - if (!payload?.sub || !payload.email || !payload.name) { - throw new Error('Invalid Google token payload'); - } - return { - googleId: payload.sub, - email: payload.email, - name: payload.name, - picture: payload.picture ?? null - }; -} diff --git a/dist/main.js b/dist/main.js new file mode 100644 index 0000000..15585c8 --- /dev/null +++ b/dist/main.js @@ -0,0 +1,10 @@ +import { NestFactory } from '@nestjs/core'; +import { ValidationPipe } from '@nestjs/common'; +import { AppModule } from './app.module.js'; +async function bootstrap() { + const app = await NestFactory.create(AppModule); + app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true })); + await app.listen(process.env.PORT ? Number(process.env.PORT) : 3000); +} +bootstrap(); +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/dist/main.js.map b/dist/main.js.map new file mode 100644 index 0000000..68ff2e7 --- /dev/null +++ b/dist/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChD,GAAG,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,EAAE,CAAC"} \ No newline at end of file diff --git a/dist/modules/auth/auth.controller.js b/dist/modules/auth/auth.controller.js new file mode 100644 index 0000000..fb8eecd --- /dev/null +++ b/dist/modules/auth/auth.controller.js @@ -0,0 +1,36 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +import { Body, Controller, Post } from '@nestjs/common'; +import { AuthService } from './auth.service.js'; +let AuthController = class AuthController { + auth; + constructor(auth) { + this.auth = auth; + } + google(body) { + return this.auth.loginWithGoogle(body.idToken || ''); + } +}; +__decorate([ + Post('google'), + __param(0, Body()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object]), + __metadata("design:returntype", void 0) +], AuthController.prototype, "google", null); +AuthController = __decorate([ + Controller('auth'), + __metadata("design:paramtypes", [AuthService]) +], AuthController); +export { AuthController }; +//# sourceMappingURL=auth.controller.js.map \ No newline at end of file diff --git a/dist/modules/auth/auth.controller.js.map b/dist/modules/auth/auth.controller.js.map new file mode 100644 index 0000000..c6f1cb1 --- /dev/null +++ b/dist/modules/auth/auth.controller.js.map @@ -0,0 +1 @@ +{"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../../src/modules/auth/auth.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGzC,IAAM,cAAc,GAApB,MAAM,cAAc;IACI;IAA7B,YAA6B,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAAG,CAAC;IAGlD,MAAM,CAAS,IAA0B;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;CACF,CAAA;AAHC;IADC,IAAI,CAAC,QAAQ,CAAC;IACP,WAAA,IAAI,EAAE,CAAA;;;;4CAEb;AANU,cAAc;IAD1B,UAAU,CAAC,MAAM,CAAC;qCAEkB,WAAW;GADnC,cAAc,CAO1B"} \ No newline at end of file diff --git a/dist/modules/auth/auth.module.js b/dist/modules/auth/auth.module.js new file mode 100644 index 0000000..46f205d --- /dev/null +++ b/dist/modules/auth/auth.module.js @@ -0,0 +1,20 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { Module } from '@nestjs/common'; +import { AuthController } from './auth.controller.js'; +import { AuthService } from './auth.service.js'; +let AuthModule = class AuthModule { +}; +AuthModule = __decorate([ + Module({ + controllers: [AuthController], + providers: [AuthService], + exports: [AuthService], + }) +], AuthModule); +export { AuthModule }; +//# sourceMappingURL=auth.module.js.map \ No newline at end of file diff --git a/dist/modules/auth/auth.module.js.map b/dist/modules/auth/auth.module.js.map new file mode 100644 index 0000000..64e0ea9 --- /dev/null +++ b/dist/modules/auth/auth.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../../../src/modules/auth/auth.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOzC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,UAAU;IALtB,MAAM,CAAC;QACN,WAAW,EAAE,CAAC,cAAc,CAAC;QAC7B,SAAS,EAAE,CAAC,WAAW,CAAC;QACxB,OAAO,EAAE,CAAC,WAAW,CAAC;KACvB,CAAC;GACW,UAAU,CAAG"} \ No newline at end of file diff --git a/dist/modules/auth/auth.service.js b/dist/modules/auth/auth.service.js new file mode 100644 index 0000000..6d7a73f --- /dev/null +++ b/dist/modules/auth/auth.service.js @@ -0,0 +1,73 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { BadRequestException, Injectable } from '@nestjs/common'; +import { OAuth2Client } from 'google-auth-library'; +import { and, eq, gt } from 'drizzle-orm'; +import { DatabaseService } from '../../database/database.service.js'; +import { sessions, users } from '../../database/schema.js'; +import { randomId, randomToken } from '../../config/crypto.js'; +let AuthService = class AuthService { + dbs; + google = new OAuth2Client(process.env.GOOGLE_CLIENT_ID); + constructor(dbs) { + this.dbs = dbs; + } + async loginWithGoogle(idToken) { + if (!idToken) + throw new BadRequestException('idToken is required'); + if (!process.env.GOOGLE_CLIENT_ID) + throw new BadRequestException('GOOGLE_CLIENT_ID missing'); + const ticket = await this.google.verifyIdToken({ idToken, audience: process.env.GOOGLE_CLIENT_ID }); + const payload = ticket.getPayload(); + if (!payload?.email || !payload.name) + throw new BadRequestException('Invalid Google token payload'); + const existing = await this.dbs.db.select().from(users).where(eq(users.email, payload.email)).limit(1); + const userId = existing[0]?.id ?? randomId(); + if (!existing.length) { + await this.dbs.db.insert(users).values({ + id: userId, + email: payload.email, + name: payload.name, + picture: payload.picture ?? null, + }); + } + const token = randomToken(32); + const expiresAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); + await this.dbs.db.insert(sessions).values({ token, userId, expiresAt }); + return { + accessToken: token, + expiresAt, + user: { + id: userId, + email: payload.email, + name: payload.name, + picture: payload.picture ?? null, + }, + }; + } + async sessionFromBearer(authHeader) { + if (!authHeader?.startsWith('Bearer ')) + return null; + const token = authHeader.slice('Bearer '.length); + const rows = await this.dbs.db + .select({ userId: sessions.userId, email: users.email, name: users.name }) + .from(sessions) + .innerJoin(users, eq(users.id, sessions.userId)) + .where(and(eq(sessions.token, token), gt(sessions.expiresAt, new Date()))) + .limit(1); + return rows[0] ?? null; + } +}; +AuthService = __decorate([ + Injectable(), + __metadata("design:paramtypes", [DatabaseService]) +], AuthService); +export { AuthService }; +//# sourceMappingURL=auth.service.js.map \ No newline at end of file diff --git a/dist/modules/auth/auth.service.js.map b/dist/modules/auth/auth.service.js.map new file mode 100644 index 0000000..73b1676 --- /dev/null +++ b/dist/modules/auth/auth.service.js.map @@ -0,0 +1 @@ +{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../src/modules/auth/auth.service.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/modules/chess/chess.controller.js b/dist/modules/chess/chess.controller.js new file mode 100644 index 0000000..df8e043 --- /dev/null +++ b/dist/modules/chess/chess.controller.js @@ -0,0 +1,111 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +import { Body, Controller, Delete, Get, Param, Post, Query, Req, UseGuards } from '@nestjs/common'; +import { ApiKeyGuard } from '../../common/guards/api-key.guard.js'; +import { ChessService } from './chess.service.js'; +let ChessController = class ChessController { + chess; + constructor(chess) { + this.chess = chess; + } + create(req, body) { + return this.chess.create(req.apiUserId, body || {}); + } + get(req, id) { + return this.chess.get(req.apiUserId, id); + } + async remove(req, id) { + await this.chess.remove(req.apiUserId, id); + return { ok: true }; + } + moves(req, id, from) { + return this.chess.moves(req.apiUserId, id, from); + } + move(req, id, body) { + return this.chess.makeMove(req.apiUserId, id, body || {}); + } + aiMove(req, id) { + return this.chess.makeAiMove(req.apiUserId, id); + } + resign(req, id, body) { + if (!body?.color || !['w', 'b'].includes(body.color)) + return { error: 'color must be w or b' }; + return this.chess.makeResign(req.apiUserId, id, body.color); + } +}; +__decorate([ + Post(), + __param(0, Req()), + __param(1, Body()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object, Object]), + __metadata("design:returntype", void 0) +], ChessController.prototype, "create", null); +__decorate([ + Get(':id'), + __param(0, Req()), + __param(1, Param('id')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object, String]), + __metadata("design:returntype", void 0) +], ChessController.prototype, "get", null); +__decorate([ + Delete(':id'), + __param(0, Req()), + __param(1, Param('id')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object, String]), + __metadata("design:returntype", Promise) +], ChessController.prototype, "remove", null); +__decorate([ + Get(':id/moves'), + __param(0, Req()), + __param(1, Param('id')), + __param(2, Query('from')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object, String, String]), + __metadata("design:returntype", void 0) +], ChessController.prototype, "moves", null); +__decorate([ + Post(':id/moves'), + __param(0, Req()), + __param(1, Param('id')), + __param(2, Body()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object, String, Object]), + __metadata("design:returntype", void 0) +], ChessController.prototype, "move", null); +__decorate([ + Post(':id/ai-move'), + __param(0, Req()), + __param(1, Param('id')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object, String]), + __metadata("design:returntype", void 0) +], ChessController.prototype, "aiMove", null); +__decorate([ + Post(':id/resign'), + __param(0, Req()), + __param(1, Param('id')), + __param(2, Body()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object, String, Object]), + __metadata("design:returntype", void 0) +], ChessController.prototype, "resign", null); +ChessController = __decorate([ + Controller('games'), + UseGuards(ApiKeyGuard), + __metadata("design:paramtypes", [ChessService]) +], ChessController); +export { ChessController }; +//# sourceMappingURL=chess.controller.js.map \ No newline at end of file diff --git a/dist/modules/chess/chess.controller.js.map b/dist/modules/chess/chess.controller.js.map new file mode 100644 index 0000000..3863843 --- /dev/null +++ b/dist/modules/chess/chess.controller.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chess.controller.js","sourceRoot":"","sources":["../../../src/modules/chess/chess.controller.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/modules/chess/chess.engine.js b/dist/modules/chess/chess.engine.js new file mode 100644 index 0000000..ae325e0 --- /dev/null +++ b/dist/modules/chess/chess.engine.js @@ -0,0 +1,158 @@ +import { Chess } from 'chess.js'; +import { createRequire } from 'node:module'; +const require = createRequire(import.meta.url); +const chessAI = require('chess-ai-kong'); +chessAI.setOptions({ depth: 3, monitor: false, strategy: 'basic', timeout: 5000 }); +const opposite = (c) => (c === 'w' ? 'b' : 'w'); +export function createState(input) { + const chess = new Chess(); + if (input.fen) + chess.load(input.fen); + const turn = chess.turn(); + const tc = input.timeControl; + const state = { + mode: input.mode ?? 'pvp', + aiColor: (input.mode ?? 'pvp') === 'pve' ? input.aiColor ?? 'b' : null, + chess, + status: 'active', + result: null, + timeControl: tc + ? { + initialMs: tc.initialSeconds * 1000, + incrementMs: (tc.incrementSeconds ?? 0) * 1000, + remaining: { w: tc.initialSeconds * 1000, b: tc.initialSeconds * 1000 }, + running: turn, + lastTickAt: Date.now(), + } + : null, + }; + return state; +} +export function hydrate(row) { + const chess = new Chess(row.fen); + return { + mode: row.mode, + aiColor: row.aiColor, + chess, + status: row.status, + result: row.resultReason ? { reason: row.resultReason, winner: row.resultWinner } : null, + timeControl: row.initialMs !== null + ? { + initialMs: row.initialMs, + incrementMs: row.incrementMs, + remaining: { w: row.remainingW, b: row.remainingB }, + running: row.running, + lastTickAt: row.lastTickAt, + } + : null, + }; +} +export function serialize(s) { + return { + mode: s.mode, + aiColor: s.aiColor, + fen: s.chess.fen(), + pgn: s.chess.pgn(), + turn: s.chess.turn(), + status: s.status, + resultReason: s.result?.reason ?? null, + resultWinner: s.result?.winner ?? null, + history: s.chess.history({ verbose: true }), + initialMs: s.timeControl?.initialMs ?? null, + incrementMs: s.timeControl?.incrementMs ?? null, + remainingW: s.timeControl?.remaining.w ?? null, + remainingB: s.timeControl?.remaining.b ?? null, + running: s.timeControl?.running ?? null, + lastTickAt: s.timeControl?.lastTickAt ?? null, + }; +} +export function tick(s) { + if (!s.timeControl || s.status !== 'active') + return; + const now = Date.now(); + const elapsed = Math.max(0, now - s.timeControl.lastTickAt); + s.timeControl.remaining[s.timeControl.running] = Math.max(0, s.timeControl.remaining[s.timeControl.running] - elapsed); + s.timeControl.lastTickAt = now; + if (s.timeControl.remaining[s.timeControl.running] <= 0) { + s.status = 'finished'; + s.result = { reason: 'timeout', winner: opposite(s.timeControl.running) }; + } +} +function finalize(s, mover) { + if (s.timeControl) { + s.timeControl.remaining[mover] += s.timeControl.incrementMs; + s.timeControl.running = s.chess.turn(); + s.timeControl.lastTickAt = Date.now(); + } + if (s.chess.isGameOver()) { + s.status = 'finished'; + s.result = s.chess.isCheckmate() ? { reason: 'checkmate', winner: opposite(s.chess.turn()) } : { reason: 'draw', winner: null }; + } +} +export function legalMoves(s, from) { + tick(s); + if (s.status !== 'active') + return []; + return from ? s.chess.moves({ square: from }) : s.chess.moves(); +} +export function move(s, payload) { + tick(s); + if (s.status !== 'active') + return { error: 'Game is already finished' }; + const mover = s.chess.turn(); + const m = payload.san ? s.chess.move(payload.san) : payload.from && payload.to ? s.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) : null; + if (!m) + return { error: 'Illegal move' }; + finalize(s, mover); + return { move: m }; +} +export async function aiMove(s) { + tick(s); + if (s.status !== 'active') + return { error: 'Game is already finished' }; + if (s.mode !== 'pve') + return { error: 'AI move only supported for pve games' }; + if (s.aiColor !== s.chess.turn()) + return { error: 'Not AI turn' }; + const mover = s.chess.turn(); + const legal = s.chess.moves(); + if (!legal.length) + return { error: 'No legal AI moves' }; + let m = null; + try { + const san = chessAI.play(s.chess.history()); + m = s.chess.move(san); + } + catch { + m = null; + } + if (!m) + m = s.chess.move(legal[Math.floor(Math.random() * legal.length)]); + if (!m) + return { error: 'AI failed to move' }; + finalize(s, mover); + return { move: m }; +} +export function resign(s, color) { + if (s.status !== 'active') + return; + s.status = 'finished'; + s.result = { reason: 'resign', winner: opposite(color) }; +} +export function present(id, s) { + tick(s); + return { + id, + mode: s.mode, + status: s.status, + result: s.result, + fen: s.chess.fen(), + pgn: s.chess.pgn(), + turn: s.chess.turn(), + history: s.chess.history({ verbose: true }), + timeControl: s.timeControl + ? { initialMs: s.timeControl.initialMs, incrementMs: s.timeControl.incrementMs, remaining: s.timeControl.remaining, running: s.timeControl.running } + : null, + }; +} +//# sourceMappingURL=chess.engine.js.map \ No newline at end of file diff --git a/dist/modules/chess/chess.engine.js.map b/dist/modules/chess/chess.engine.js.map new file mode 100644 index 0000000..9ba977e --- /dev/null +++ b/dist/modules/chess/chess.engine.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chess.engine.js","sourceRoot":"","sources":["../../../src/modules/chess/chess.engine.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/modules/chess/chess.module.js b/dist/modules/chess/chess.module.js new file mode 100644 index 0000000..09f6a0f --- /dev/null +++ b/dist/modules/chess/chess.module.js @@ -0,0 +1,19 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { Module } from '@nestjs/common'; +import { ChessController } from './chess.controller.js'; +import { ChessService } from './chess.service.js'; +let ChessModule = class ChessModule { +}; +ChessModule = __decorate([ + Module({ + controllers: [ChessController], + providers: [ChessService], + }) +], ChessModule); +export { ChessModule }; +//# sourceMappingURL=chess.module.js.map \ No newline at end of file diff --git a/dist/modules/chess/chess.module.js.map b/dist/modules/chess/chess.module.js.map new file mode 100644 index 0000000..242d2ad --- /dev/null +++ b/dist/modules/chess/chess.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chess.module.js","sourceRoot":"","sources":["../../../src/modules/chess/chess.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAM3C,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,WAAW;IAJvB,MAAM,CAAC;QACN,WAAW,EAAE,CAAC,eAAe,CAAC;QAC9B,SAAS,EAAE,CAAC,YAAY,CAAC;KAC1B,CAAC;GACW,WAAW,CAAG"} \ No newline at end of file diff --git a/dist/modules/chess/chess.service.js b/dist/modules/chess/chess.service.js new file mode 100644 index 0000000..5f00ec5 --- /dev/null +++ b/dist/modules/chess/chess.service.js @@ -0,0 +1,84 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { Injectable, NotFoundException } from '@nestjs/common'; +import { and, eq } from 'drizzle-orm'; +import { DatabaseService } from '../../database/database.service.js'; +import { games } from '../../database/schema.js'; +import { randomId } from '../../config/crypto.js'; +import { aiMove, createState, hydrate, legalMoves, move, present, resign, serialize } from './chess.engine.js'; +let ChessService = class ChessService { + dbs; + constructor(dbs) { + this.dbs = dbs; + } + async create(userId, body) { + const id = randomId(); + const state = createState(body); + await this.dbs.db.insert(games).values({ id, userId, ...serialize(state), updatedAt: new Date() }); + return present(id, state); + } + async get(userId, id) { + const row = await this.load(userId, id); + const state = hydrate(row); + await this.save(id, state); + return present(id, state); + } + async remove(userId, id) { + await this.dbs.db.delete(games).where(and(eq(games.id, id), eq(games.userId, userId))); + } + async moves(userId, id, from) { + const row = await this.load(userId, id); + const state = hydrate(row); + const m = legalMoves(state, from); + await this.save(id, state); + return { gameId: id, from: from ?? null, count: m.length, moves: m }; + } + async makeMove(userId, id, body) { + const row = await this.load(userId, id); + const state = hydrate(row); + const r = move(state, body); + if ('error' in r) + return r; + await this.save(id, state); + return { move: r.move, state: present(id, state) }; + } + async makeAiMove(userId, id) { + const row = await this.load(userId, id); + const state = hydrate(row); + const r = await aiMove(state); + if ('error' in r) + return r; + await this.save(id, state); + return { move: r.move, state: present(id, state) }; + } + async makeResign(userId, id, color) { + const row = await this.load(userId, id); + const state = hydrate(row); + resign(state, color); + await this.save(id, state); + return present(id, state); + } + async load(userId, id) { + const rows = await this.dbs.db.select().from(games).where(and(eq(games.id, id), eq(games.userId, userId))).limit(1); + const row = rows[0]; + if (!row) + throw new NotFoundException('Game not found'); + return row; + } + async save(id, state) { + await this.dbs.db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); + } +}; +ChessService = __decorate([ + Injectable(), + __metadata("design:paramtypes", [DatabaseService]) +], ChessService); +export { ChessService }; +//# sourceMappingURL=chess.service.js.map \ No newline at end of file diff --git a/dist/modules/chess/chess.service.js.map b/dist/modules/chess/chess.service.js.map new file mode 100644 index 0000000..58e2bc8 --- /dev/null +++ b/dist/modules/chess/chess.service.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chess.service.js","sourceRoot":"","sources":["../../../src/modules/chess/chess.service.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/modules/health/health.controller.js b/dist/modules/health/health.controller.js new file mode 100644 index 0000000..a74f8c6 --- /dev/null +++ b/dist/modules/health/health.controller.js @@ -0,0 +1,47 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { Controller, Get } from '@nestjs/common'; +let HealthController = class HealthController { + root() { + return { ok: true, service: 'chess-api', docs: '/api' }; + } + api() { + return { + message: 'Chess API (NestJS modular rewrite)', + auth: ['POST /auth/google', 'GET /me', 'GET/POST/DELETE /me/api-keys'], + chess: [ + 'POST /games', + 'GET /games/:id', + 'DELETE /games/:id', + 'GET /games/:id/moves', + 'POST /games/:id/moves', + 'POST /games/:id/ai-move', + 'POST /games/:id/resign', + ], + }; + } +}; +__decorate([ + Get(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], HealthController.prototype, "root", null); +__decorate([ + Get('api'), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], HealthController.prototype, "api", null); +HealthController = __decorate([ + Controller() +], HealthController); +export { HealthController }; +//# sourceMappingURL=health.controller.js.map \ No newline at end of file diff --git a/dist/modules/health/health.controller.js.map b/dist/modules/health/health.controller.js.map new file mode 100644 index 0000000..df7f94e --- /dev/null +++ b/dist/modules/health/health.controller.js.map @@ -0,0 +1 @@ +{"version":3,"file":"health.controller.js","sourceRoot":"","sources":["../../../src/modules/health/health.controller.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAG1C,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAE3B,IAAI;QACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1D,CAAC;IAGD,GAAG;QACD,OAAO;YACL,OAAO,EAAE,oCAAoC;YAC7C,IAAI,EAAE,CAAC,mBAAmB,EAAE,SAAS,EAAE,8BAA8B,CAAC;YACtE,KAAK,EAAE;gBACL,aAAa;gBACb,gBAAgB;gBAChB,mBAAmB;gBACnB,sBAAsB;gBACtB,uBAAuB;gBACvB,yBAAyB;gBACzB,wBAAwB;aACzB;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AApBC;IADC,GAAG,EAAE;;;;4CAGL;AAGD;IADC,GAAG,CAAC,KAAK,CAAC;;;;2CAeV;AArBU,gBAAgB;IAD5B,UAAU,EAAE;GACA,gBAAgB,CAsB5B"} \ No newline at end of file diff --git a/dist/modules/health/health.module.js b/dist/modules/health/health.module.js new file mode 100644 index 0000000..aae7e0b --- /dev/null +++ b/dist/modules/health/health.module.js @@ -0,0 +1,15 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { Module } from '@nestjs/common'; +import { HealthController } from './health.controller.js'; +let HealthModule = class HealthModule { +}; +HealthModule = __decorate([ + Module({ controllers: [HealthController] }) +], HealthModule); +export { HealthModule }; +//# sourceMappingURL=health.module.js.map \ No newline at end of file diff --git a/dist/modules/health/health.module.js.map b/dist/modules/health/health.module.js.map new file mode 100644 index 0000000..1268e4e --- /dev/null +++ b/dist/modules/health/health.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"health.module.js","sourceRoot":"","sources":["../../../src/modules/health/health.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAGnD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,YAAY;IADxB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;GAC/B,YAAY,CAAG"} \ No newline at end of file diff --git a/dist/modules/users/users.controller.js b/dist/modules/users/users.controller.js new file mode 100644 index 0000000..16561f0 --- /dev/null +++ b/dist/modules/users/users.controller.js @@ -0,0 +1,71 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +import { Body, Controller, Delete, Get, Param, Post, Req, UseGuards } from '@nestjs/common'; +import { SessionGuard } from '../../common/guards/session.guard.js'; +import { UsersService } from './users.service.js'; +let UsersController = class UsersController { + users; + constructor(users) { + this.users = users; + } + me(req) { + return { user: req.user }; + } + async list(req) { + return { items: await this.users.listApiKeys(req.user.id) }; + } + create(req, body) { + return this.users.createApiKey(req.user.id, body?.name || 'default'); + } + async revoke(req, id) { + await this.users.revokeApiKey(req.user.id, id); + return { ok: true }; + } +}; +__decorate([ + Get(), + __param(0, Req()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object]), + __metadata("design:returntype", void 0) +], UsersController.prototype, "me", null); +__decorate([ + Get('api-keys'), + __param(0, Req()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object]), + __metadata("design:returntype", Promise) +], UsersController.prototype, "list", null); +__decorate([ + Post('api-keys'), + __param(0, Req()), + __param(1, Body()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object, Object]), + __metadata("design:returntype", void 0) +], UsersController.prototype, "create", null); +__decorate([ + Delete('api-keys/:id'), + __param(0, Req()), + __param(1, Param('id')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object, String]), + __metadata("design:returntype", Promise) +], UsersController.prototype, "revoke", null); +UsersController = __decorate([ + Controller('me'), + UseGuards(SessionGuard), + __metadata("design:paramtypes", [UsersService]) +], UsersController); +export { UsersController }; +//# sourceMappingURL=users.controller.js.map \ No newline at end of file diff --git a/dist/modules/users/users.controller.js.map b/dist/modules/users/users.controller.js.map new file mode 100644 index 0000000..e2957d0 --- /dev/null +++ b/dist/modules/users/users.controller.js.map @@ -0,0 +1 @@ +{"version":3,"file":"users.controller.js","sourceRoot":"","sources":["../../../src/modules/users/users.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI3C,IAAM,eAAe,GAArB,MAAM,eAAe;IACG;IAA7B,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAGpD,EAAE,CAAQ,GAAQ;QAChB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAGK,AAAN,KAAK,CAAC,IAAI,CAAQ,GAAQ;QACxB,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9D,CAAC;IAGD,MAAM,CAAQ,GAAQ,EAAU,IAAuB;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC,CAAC;IACvE,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM,CAAQ,GAAQ,EAAe,EAAU;QACnD,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAA;AAnBC;IADC,GAAG,EAAE;IACF,WAAA,GAAG,EAAE,CAAA;;;;yCAER;AAGK;IADL,GAAG,CAAC,UAAU,CAAC;IACJ,WAAA,GAAG,EAAE,CAAA;;;;2CAEhB;AAGD;IADC,IAAI,CAAC,UAAU,CAAC;IACT,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,IAAI,EAAE,CAAA;;;;6CAE9B;AAGK;IADL,MAAM,CAAC,cAAc,CAAC;IACT,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;;;;6CAGzC;AAtBU,eAAe;IAF3B,UAAU,CAAC,IAAI,CAAC;IAChB,SAAS,CAAC,YAAY,CAAC;qCAEc,YAAY;GADrC,eAAe,CAuB3B"} \ No newline at end of file diff --git a/dist/modules/users/users.module.js b/dist/modules/users/users.module.js new file mode 100644 index 0000000..dafe620 --- /dev/null +++ b/dist/modules/users/users.module.js @@ -0,0 +1,21 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { Module } from '@nestjs/common'; +import { UsersController } from './users.controller.js'; +import { UsersService } from './users.service.js'; +import { AuthModule } from '../auth/auth.module.js'; +let UsersModule = class UsersModule { +}; +UsersModule = __decorate([ + Module({ + imports: [AuthModule], + controllers: [UsersController], + providers: [UsersService], + }) +], UsersModule); +export { UsersModule }; +//# sourceMappingURL=users.module.js.map \ No newline at end of file diff --git a/dist/modules/users/users.module.js.map b/dist/modules/users/users.module.js.map new file mode 100644 index 0000000..19c5b43 --- /dev/null +++ b/dist/modules/users/users.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"users.module.js","sourceRoot":"","sources":["../../../src/modules/users/users.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAO7C,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,WAAW;IALvB,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,WAAW,EAAE,CAAC,eAAe,CAAC;QAC9B,SAAS,EAAE,CAAC,YAAY,CAAC;KAC1B,CAAC;GACW,WAAW,CAAG"} \ No newline at end of file diff --git a/dist/modules/users/users.service.js b/dist/modules/users/users.service.js new file mode 100644 index 0000000..0b05cae --- /dev/null +++ b/dist/modules/users/users.service.js @@ -0,0 +1,57 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { Injectable } from '@nestjs/common'; +import { and, eq } from 'drizzle-orm'; +import { DatabaseService } from '../../database/database.service.js'; +import { apiKeys } from '../../database/schema.js'; +import { randomId, randomToken, sha256 } from '../../config/crypto.js'; +let UsersService = class UsersService { + dbs; + constructor(dbs) { + this.dbs = dbs; + } + async listApiKeys(userId) { + return this.dbs.db + .select({ + id: apiKeys.id, + name: apiKeys.name, + keyPrefix: apiKeys.keyPrefix, + active: apiKeys.active, + createdAt: apiKeys.createdAt, + lastUsedAt: apiKeys.lastUsedAt, + }) + .from(apiKeys) + .where(eq(apiKeys.userId, userId)); + } + async createApiKey(userId, name = 'default') { + const rawKey = `chess_${randomToken(24)}`; + await this.dbs.db.insert(apiKeys).values({ + id: randomId(), + userId, + name: name.slice(0, 80), + keyHash: sha256(rawKey), + keyPrefix: rawKey.slice(0, 12), + active: true, + }); + return { apiKey: rawKey }; + } + async revokeApiKey(userId, id) { + await this.dbs.db + .update(apiKeys) + .set({ active: false }) + .where(and(eq(apiKeys.id, id), eq(apiKeys.userId, userId))); + } +}; +UsersService = __decorate([ + Injectable(), + __metadata("design:paramtypes", [DatabaseService]) +], UsersService); +export { UsersService }; +//# sourceMappingURL=users.service.js.map \ No newline at end of file diff --git a/dist/modules/users/users.service.js.map b/dist/modules/users/users.service.js.map new file mode 100644 index 0000000..00f2844 --- /dev/null +++ b/dist/modules/users/users.service.js.map @@ -0,0 +1 @@ +{"version":3,"file":"users.service.js","sourceRoot":"","sources":["../../../src/modules/users/users.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhE,IAAM,YAAY,GAAlB,MAAM,YAAY;IACM;IAA7B,YAA6B,GAAoB;QAApB,QAAG,GAAH,GAAG,CAAiB;IAAG,CAAC;IAErD,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE;aACf,MAAM,CAAC;YACN,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC;aACD,IAAI,CAAC,OAAO,CAAC;aACb,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,IAAI,GAAG,SAAS;QACjD,MAAM,MAAM,GAAG,SAAS,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YACvC,EAAE,EAAE,QAAQ,EAAE;YACd,MAAM;YACN,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;YACvB,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,EAAU;QAC3C,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;aACd,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;aACtB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;CACF,CAAA;AApCY,YAAY;IADxB,UAAU,EAAE;qCAEuB,eAAe;GADtC,YAAY,CAoCxB"} \ No newline at end of file diff --git a/dist/server.js b/dist/server.js deleted file mode 100644 index 198092b..0000000 --- a/dist/server.js +++ /dev/null @@ -1,212 +0,0 @@ -import Fastify from 'fastify'; -import rateLimit from '@fastify/rate-limit'; -import cors from '@fastify/cors'; -import { and, eq, gt } from 'drizzle-orm'; -import { db } from './db.js'; -import { apiKeys, games, sessions, users } from './schema.js'; -import { ensureSchema } from './bootstrap.js'; -import { randomId, randomToken, sha256 } from './crypto.js'; -import { verifyGoogleIdToken } from './google.js'; -import { aiMove, hydrate, legalMoves, makeMove, newGameState, present, resign, serialize } from './store.js'; -const app = Fastify({ logger: true }); -await app.register(cors, { origin: true }); -await app.register(rateLimit, { max: 200, timeWindow: '1 minute' }); -await ensureSchema(); -async function requireSession(request, reply) { - const auth = request.headers.authorization; - if (!auth?.startsWith('Bearer ')) - return reply.code(401).send({ error: 'Missing bearer token' }); - const token = auth.slice('Bearer '.length); - const rows = await db - .select({ userId: sessions.userId, email: users.email, name: users.name }) - .from(sessions) - .innerJoin(users, eq(users.id, sessions.userId)) - .where(and(eq(sessions.token, token), gt(sessions.expiresAt, new Date()))) - .limit(1); - if (!rows.length) - return reply.code(401).send({ error: 'Invalid session' }); - request.sessionUser = { id: rows[0].userId, email: rows[0].email, name: rows[0].name }; -} -async function requireApiKey(request, reply) { - const key = request.headers['x-api-key']; - if (!key) - return reply.code(401).send({ error: 'Missing x-api-key' }); - const keyHash = sha256(key); - const rows = await db - .select({ id: apiKeys.id, userId: apiKeys.userId }) - .from(apiKeys) - .where(and(eq(apiKeys.keyHash, keyHash), eq(apiKeys.active, true))) - .limit(1); - if (!rows.length) - return reply.code(401).send({ error: 'Invalid API key' }); - await db.update(apiKeys).set({ lastUsedAt: new Date() }).where(eq(apiKeys.id, rows[0].id)); - request.apiUserId = rows[0].userId; -} -app.get('/', async () => ({ ok: true, service: 'chess-api', docs: '/api' })); -app.get('/api', async () => ({ - message: 'Production Chess API', - auth: { - login: 'POST /auth/google', - me: 'GET /me', - apiKeys: 'POST/GET/DELETE /me/api-keys' - }, - chess: ['POST /games', 'GET /games/:id', 'DELETE /games/:id', 'GET /games/:id/moves', 'POST /games/:id/moves', 'POST /games/:id/ai-move', 'POST /games/:id/resign'] -})); -app.post('/auth/google', async (request, reply) => { - const body = (request.body ?? {}); - if (!body.idToken) - return reply.code(400).send({ error: 'idToken is required' }); - const profile = await verifyGoogleIdToken(body.idToken); - const existing = await db.select().from(users).where(eq(users.email, profile.email)).limit(1); - const userId = existing[0]?.id ?? randomId(); - if (!existing.length) { - await db.insert(users).values({ id: userId, email: profile.email, name: profile.name, picture: profile.picture }); - } - const token = randomToken(32); - const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 30); - await db.insert(sessions).values({ token, userId, expiresAt }); - return { accessToken: token, expiresAt, user: { id: userId, email: profile.email, name: profile.name, picture: profile.picture } }; -}); -app.get('/me', { preHandler: requireSession }, async (request) => { - return { user: request.sessionUser }; -}); -app.get('/me/api-keys', { preHandler: requireSession }, async (request) => { - const rows = await db - .select({ id: apiKeys.id, name: apiKeys.name, keyPrefix: apiKeys.keyPrefix, active: apiKeys.active, createdAt: apiKeys.createdAt, lastUsedAt: apiKeys.lastUsedAt }) - .from(apiKeys) - .where(eq(apiKeys.userId, request.sessionUser.id)); - return { items: rows }; -}); -app.post('/me/api-keys', { preHandler: requireSession }, async (request, reply) => { - const body = (request.body ?? {}); - const name = (body.name ?? 'default').slice(0, 80); - const rawKey = `chess_${randomToken(24)}`; - const keyHash = sha256(rawKey); - const keyPrefix = rawKey.slice(0, 12); - await db.insert(apiKeys).values({ - id: randomId(), - userId: request.sessionUser.id, - name, - keyHash, - keyPrefix, - active: true - }); - reply.code(201); - return { apiKey: rawKey, prefix: keyPrefix, name }; -}); -app.delete('/me/api-keys/:id', { preHandler: requireSession }, async (request, reply) => { - const { id } = request.params; - await db - .update(apiKeys) - .set({ active: false }) - .where(and(eq(apiKeys.id, id), eq(apiKeys.userId, request.sessionUser.id))); - return reply.code(204).send(); -}); -app.post('/games', { preHandler: requireApiKey }, async (request, reply) => { - const body = (request.body ?? {}); - const gameId = randomId(); - const state = newGameState(body); - const payload = serialize(state); - await db.insert(games).values({ - id: gameId, - userId: request.apiUserId, - ...payload, - updatedAt: new Date() - }); - reply.code(201); - return present(gameId, state); -}); -app.get('/games/:id', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params; - const rows = await db - .select() - .from(games) - .where(and(eq(games.id, id), eq(games.userId, request.apiUserId))) - .limit(1); - const row = rows[0]; - if (!row) - return reply.code(404).send({ error: 'Game not found' }); - const state = hydrate(row); - const view = present(id, state); - await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); - return view; -}); -app.delete('/games/:id', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params; - await db.delete(games).where(and(eq(games.id, id), eq(games.userId, request.apiUserId))); - return reply.code(204).send(); -}); -app.get('/games/:id/moves', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params; - const { from } = (request.query ?? {}); - const rows = await db - .select() - .from(games) - .where(and(eq(games.id, id), eq(games.userId, request.apiUserId))) - .limit(1); - const row = rows[0]; - if (!row) - return reply.code(404).send({ error: 'Game not found' }); - const state = hydrate(row); - const moves = legalMoves(state, from); - await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); - return { gameId: id, from: from ?? null, count: moves.length, moves }; -}); -app.post('/games/:id/moves', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params; - const body = (request.body ?? {}); - const rows = await db - .select() - .from(games) - .where(and(eq(games.id, id), eq(games.userId, request.apiUserId))) - .limit(1); - const row = rows[0]; - if (!row) - return reply.code(404).send({ error: 'Game not found' }); - const state = hydrate(row); - const result = makeMove(state, body); - if ('error' in result) - return reply.code(422).send(result); - await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); - return { move: result.move, state: present(id, state) }; -}); -app.post('/games/:id/ai-move', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params; - const rows = await db - .select() - .from(games) - .where(and(eq(games.id, id), eq(games.userId, request.apiUserId))) - .limit(1); - const row = rows[0]; - if (!row) - return reply.code(404).send({ error: 'Game not found' }); - const state = hydrate(row); - const result = await aiMove(state); - if ('error' in result) - return reply.code(422).send(result); - await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); - return { move: result.move, state: present(id, state) }; -}); -app.post('/games/:id/resign', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params; - const body = (request.body ?? {}); - if (!body.color || !['w', 'b'].includes(body.color)) { - return reply.code(400).send({ error: 'color must be w or b' }); - } - const rows = await db - .select() - .from(games) - .where(and(eq(games.id, id), eq(games.userId, request.apiUserId))) - .limit(1); - const row = rows[0]; - if (!row) - return reply.code(404).send({ error: 'Game not found' }); - const state = hydrate(row); - resign(state, body.color); - await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); - return present(id, state); -}); -const port = Number(process.env.PORT || 3000); -app.listen({ port, host: '0.0.0.0' }).then(() => { - app.log.info(`chess-api listening on ${port}`); -}); diff --git a/dist/store.js b/dist/store.js deleted file mode 100644 index 54fd5ef..0000000 --- a/dist/store.js +++ /dev/null @@ -1,181 +0,0 @@ -import { Chess } from 'chess.js'; -import { createRequire } from 'node:module'; -const require = createRequire(import.meta.url); -const chessAI = require('chess-ai-kong'); -chessAI.setOptions({ depth: 3, monitor: false, strategy: 'basic', timeout: 5000 }); -function opposite(c) { - return c === 'w' ? 'b' : 'w'; -} -export function newGameState(input) { - const chess = new Chess(); - if (input.fen) - chess.load(input.fen); - const turn = chess.turn(); - return { - mode: input.mode ?? 'pvp', - aiColor: (input.mode ?? 'pvp') === 'pve' ? input.aiColor ?? 'b' : null, - chess, - status: 'active', - result: null, - timeControl: input.timeControl - ? { - initialMs: Math.max(1, input.timeControl.initialSeconds) * 1000, - incrementMs: Math.max(0, input.timeControl.incrementSeconds ?? 0) * 1000, - remaining: { - w: Math.max(1, input.timeControl.initialSeconds) * 1000, - b: Math.max(1, input.timeControl.initialSeconds) * 1000 - }, - running: turn, - lastTickAt: Date.now() - } - : null - }; -} -export function hydrate(row) { - const chess = new Chess(row.fen); - const timeControl = row.initialMs && row.incrementMs !== null && row.remainingW !== null && row.remainingB !== null && row.running && row.lastTickAt - ? { - initialMs: row.initialMs, - incrementMs: row.incrementMs, - remaining: { w: row.remainingW, b: row.remainingB }, - running: row.running, - lastTickAt: row.lastTickAt - } - : null; - return { - mode: row.mode, - aiColor: row.aiColor ?? null, - chess, - status: row.status, - result: row.resultReason - ? { reason: row.resultReason, winner: row.resultWinner ?? null } - : null, - timeControl - }; -} -export function serialize(state) { - return { - mode: state.mode, - aiColor: state.aiColor, - fen: state.chess.fen(), - pgn: state.chess.pgn(), - turn: state.chess.turn(), - status: state.status, - resultReason: state.result?.reason ?? null, - resultWinner: state.result?.winner ?? null, - history: state.chess.history({ verbose: true }), - initialMs: state.timeControl?.initialMs ?? null, - incrementMs: state.timeControl?.incrementMs ?? null, - remainingW: state.timeControl?.remaining.w ?? null, - remainingB: state.timeControl?.remaining.b ?? null, - running: state.timeControl?.running ?? null, - lastTickAt: state.timeControl?.lastTickAt ?? null - }; -} -function finishIfGameOver(state) { - if (!state.chess.isGameOver()) - return; - state.status = 'finished'; - if (state.chess.isCheckmate()) { - state.result = { reason: 'checkmate', winner: opposite(state.chess.turn()) }; - return; - } - state.result = { reason: 'draw', winner: null }; -} -export function tick(state) { - if (!state.timeControl || state.status !== 'active') - return; - const now = Date.now(); - const elapsed = Math.max(0, now - state.timeControl.lastTickAt); - state.timeControl.remaining[state.timeControl.running] = Math.max(0, state.timeControl.remaining[state.timeControl.running] - elapsed); - state.timeControl.lastTickAt = now; - if (state.timeControl.remaining[state.timeControl.running] <= 0) { - state.status = 'finished'; - state.result = { reason: 'timeout', winner: opposite(state.timeControl.running) }; - } -} -function afterMove(state, mover) { - if (state.timeControl) { - state.timeControl.remaining[mover] += state.timeControl.incrementMs; - state.timeControl.running = state.chess.turn(); - state.timeControl.lastTickAt = Date.now(); - } - finishIfGameOver(state); -} -export function legalMoves(state, from) { - tick(state); - if (state.status !== 'active') - return []; - return from ? state.chess.moves({ square: from }) : state.chess.moves(); -} -export function makeMove(state, payload) { - tick(state); - if (state.status !== 'active') - return { error: 'Game is already finished' }; - const mover = state.chess.turn(); - const move = payload.san - ? state.chess.move(payload.san) - : payload.from && payload.to - ? state.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) - : null; - if (!move) - return { error: 'Illegal move' }; - afterMove(state, mover); - return { move }; -} -export async function aiMove(state) { - tick(state); - if (state.status !== 'active') - return { error: 'Game is already finished' }; - if (state.mode !== 'pve') - return { error: 'AI move only supported for pve games' }; - if (state.aiColor !== state.chess.turn()) - return { error: 'Not AI turn' }; - const mover = state.chess.turn(); - const legal = state.chess.moves(); - if (!legal.length) - return { error: 'No legal AI moves' }; - let move = null; - try { - const san = chessAI.play(state.chess.history()); - move = state.chess.move(san); - } - catch { - move = null; - } - if (!move) { - const pick = legal[Math.floor(Math.random() * legal.length)]; - move = state.chess.move(pick); - } - if (!move) - return { error: 'AI failed to move' }; - afterMove(state, mover); - return { move }; -} -export function resign(state, color) { - if (state.status !== 'active') - return; - state.status = 'finished'; - state.result = { reason: 'resign', winner: opposite(color) }; -} -export function present(id, state) { - tick(state); - return { - id, - mode: state.mode, - status: state.status, - result: state.result, - fen: state.chess.fen(), - pgn: state.chess.pgn(), - turn: state.chess.turn(), - history: state.chess.history({ verbose: true }), - timeControl: state.timeControl - ? { - initialMs: state.timeControl.initialMs, - incrementMs: state.timeControl.incrementMs, - remaining: state.timeControl.remaining, - running: state.timeControl.running - } - : null - }; -} diff --git a/package-lock.json b/package-lock.json index d8d9677..b03f291 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,19 @@ "dependencies": { "@fastify/cors": "^10.0.1", "@fastify/rate-limit": "^10.1.0", + "@nestjs/common": "^10.4.2", + "@nestjs/config": "^3.2.3", + "@nestjs/core": "^10.4.2", + "@nestjs/platform-express": "^10.4.2", "chess-ai-kong": "^0.3.3", "chess.js": "^1.4.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.1", "drizzle-orm": "^0.39.0", - "fastify": "^5.0.0", "google-auth-library": "^9.15.1", - "postgres": "^3.4.5" + "postgres": "^3.4.5", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.1" }, "devDependencies": { "@types/node": "^22.10.2", @@ -23,6 +30,16 @@ "typescript": "^5.7.3" } }, + "node_modules/@borewit/text-codec": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz", + "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", @@ -465,27 +482,6 @@ "node": ">=18" } }, - "node_modules/@fastify/ajv-compiler": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", - "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^3.0.1", - "fast-uri": "^3.0.0" - } - }, "node_modules/@fastify/cors": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-10.1.0.tgz", @@ -506,26 +502,10 @@ "mnemonist": "0.40.0" } }, - "node_modules/@fastify/error": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", - "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", - "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", + "node_modules/@fastify/rate-limit": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@fastify/rate-limit/-/rate-limit-10.3.0.tgz", + "integrity": "sha512-eIGkG9XKQs0nyynatApA3EVrojHOuq4l6fhB4eeCk4PIOeadvOJz9/4w3vGI44Go17uaXOWEcPkaD8kuKm7g6Q==", "funding": [ { "type": "github", @@ -538,98 +518,173 @@ ], "license": "MIT", "dependencies": { - "fast-json-stringify": "^6.0.0" + "@lukeed/ms": "^2.0.2", + "fastify-plugin": "^5.0.0", + "toad-cache": "^3.7.0" } }, - "node_modules/@fastify/forwarded": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", - "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/@fastify/merge-json-schemas": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", - "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" + "node_modules/@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nestjs/common": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.22.tgz", + "integrity": "sha512-fxJ4v85nDHaqT1PmfNCQ37b/jcv2OojtXTaK1P2uAXhzLf9qq6WNUOFvxBrV4fhQek1EQoT1o9oj5xAZmv3NRw==", + "license": "MIT", + "dependencies": { + "file-type": "20.4.1", + "iterare": "1.2.1", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" + "class-validator": { + "optional": true } - ], + } + }, + "node_modules/@nestjs/config": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.3.0.tgz", + "integrity": "sha512-pdGTp8m9d0ZCrjTpjkUbZx6gyf2IKf+7zlkrPNMsJzYZ4bFRRTpXrnj+556/5uiI6AfL5mMrJc2u7dB6bvM+VA==", "license": "MIT", "dependencies": { - "dequal": "^2.0.3" + "dotenv": "16.4.5", + "dotenv-expand": "10.0.0", + "lodash": "4.17.21" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "rxjs": "^7.1.0" } }, - "node_modules/@fastify/proxy-addr": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", - "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" + "node_modules/@nestjs/core": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.4.22.tgz", + "integrity": "sha512-6IX9+VwjiKtCjx+mXVPncpkQ5ZjKfmssOZPFexmT+6T9H9wZ3svpYACAo7+9e7Nr9DZSoRZw3pffkJP7Z0UjaA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "3.3.0", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "@nestjs/websockets": "^10.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true } - ], + } + }, + "node_modules/@nestjs/platform-express": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.22.tgz", + "integrity": "sha512-ySSq7Py/DFozzZdNDH67m/vHoeVdphDniWBnl6q5QVoXldDdrZIHLXLRMPayTDh5A95nt7jjJzmD4qpTbNQ6tA==", "license": "MIT", "dependencies": { - "@fastify/forwarded": "^3.0.0", - "ipaddr.js": "^2.1.0" + "body-parser": "1.20.4", + "cors": "2.8.5", + "express": "4.22.1", + "multer": "2.0.2", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0" } }, - "node_modules/@fastify/rate-limit": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@fastify/rate-limit/-/rate-limit-10.3.0.tgz", - "integrity": "sha512-eIGkG9XKQs0nyynatApA3EVrojHOuq4l6fhB4eeCk4PIOeadvOJz9/4w3vGI44Go17uaXOWEcPkaD8kuKm7g6Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], + "node_modules/@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", "license": "MIT", "dependencies": { - "@lukeed/ms": "^2.0.2", - "fastify-plugin": "^5.0.0", - "toad-cache": "^3.7.0" + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" } }, - "node_modules/@lukeed/ms": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", - "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "node_modules/@tokenizer/inflate": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", + "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "fflate": "^0.8.2", + "token-types": "^6.0.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/@pinojs/redact": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", "license": "MIT" }, "node_modules/@types/node": { @@ -642,12 +697,25 @@ "undici-types": "~6.21.0" } }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "node_modules/@types/validator": { + "version": "13.15.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", "license": "MIT" }, + "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/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -657,67 +725,32 @@ "node": ">= 14" } }, - "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "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": { - "ajv": "^8.0.0" + "color-convert": "^2.0.1" }, - "peerDependencies": { - "ajv": "^8.0.0" + "engines": { + "node": ">=8" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/atomic-sleep": { + "node_modules/append-field": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" }, - "node_modules/avvio": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", - "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "@fastify/error": "^4.0.0", - "fastq": "^1.17.1" - } + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -748,12 +781,122 @@ "node": "*" } }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/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/body-parser/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/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, + "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-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/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/chess-ai-kong": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/chess-ai-kong/-/chess-ai-kong-0.3.3.tgz", @@ -779,6 +922,41 @@ "integrity": "sha512-BBJgrrtKQOzFLonR0l+k64A98NLemPwNsCskwb+29bRwobUa4iTm51E1kwGPbWXAcfdDa18nad6vpPPKPWarqw==", "license": "BSD-2-Clause" }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", + "license": "MIT" + }, + "node_modules/class-validator": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", + "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", + "license": "MIT", + "dependencies": { + "@types/validator": "^13.15.3", + "libphonenumber-js": "^1.11.1", + "validator": "^13.15.20" + } + }, + "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/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -788,17 +966,65 @@ "node": ">=0.1.90" } }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "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/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, "engines": { - "node": ">=18" + "node": ">= 0.6" + } + }, + "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/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "engines": { + "node": ">= 0.10" } }, "node_modules/debug": { @@ -818,13 +1044,44 @@ } } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "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": ">=6" + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" } }, "node_modules/drizzle-orm": { @@ -944,6 +1201,20 @@ } } }, + "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/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -953,6 +1224,51 @@ "safe-buffer": "^5.0.1" } }, + "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/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/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/esbuild": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", @@ -995,106 +1311,109 @@ "@esbuild/win32-x64": "0.27.3" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/fast-decode-uri-component": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", - "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", - "license": "MIT" - }, - "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==", + "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/fast-json-stringify": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.3.0.tgz", - "integrity": "sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], + "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", - "dependencies": { - "@fastify/merge-json-schemas": "^0.2.0", - "ajv": "^8.12.0", - "ajv-formats": "^3.0.1", - "fast-uri": "^3.0.0", - "json-schema-ref-resolver": "^3.0.0", - "rfdc": "^1.2.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/fast-querystring": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", - "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "license": "MIT", "dependencies": { - "fast-decode-uri-component": "^1.0.1" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" + "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/fastify": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.7.4.tgz", - "integrity": "sha512-e6l5NsRdaEP8rdD8VR0ErJASeyaRbzXYpmkrpr2SuvuMq6Si3lvsaVy5C+7gLanEkvjpMDzBXWE5HPeb/hgTxA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], + "node_modules/express/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": { - "@fastify/ajv-compiler": "^4.0.5", - "@fastify/error": "^4.0.0", - "@fastify/fast-json-stringify-compiler": "^5.0.0", - "@fastify/proxy-addr": "^5.0.0", - "abstract-logging": "^2.0.1", - "avvio": "^9.0.0", - "fast-json-stringify": "^6.0.0", - "find-my-way": "^9.0.0", - "light-my-request": "^6.0.0", - "pino": "^10.1.0", - "process-warning": "^5.0.0", - "rfdc": "^1.3.1", - "secure-json-parse": "^4.0.0", - "semver": "^7.6.0", - "toad-cache": "^3.7.0" + "ms": "2.0.0" } }, + "node_modules/express/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/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, "node_modules/fastify-plugin": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", @@ -1111,27 +1430,79 @@ ], "license": "MIT" }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, + "node_modules/file-type": { + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.4.1.tgz", + "integrity": "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==", + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "@tokenizer/inflate": "^0.2.6", + "strtok3": "^10.2.0", + "token-types": "^6.0.0", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, - "node_modules/find-my-way": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.5.0.tgz", - "integrity": "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==", + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-querystring": "^1.0.0", - "safe-regex2": "^5.0.0" + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=20" + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/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/finalhandler/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/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/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, "node_modules/fsevents": { @@ -1149,6 +1520,15 @@ "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/gaxios": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", @@ -1179,6 +1559,43 @@ "node": ">=14" } }, + "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/get-tsconfig": { "version": "4.13.6", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", @@ -1218,6 +1635,18 @@ "node": ">=14" } }, + "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/gtoken": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", @@ -1231,6 +1660,59 @@ "node": ">=14.0.0" } }, + "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-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/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/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": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -1244,15 +1726,44 @@ "node": ">= 14" } }, - "node_modules/ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { - "node": ">= 10" + "node": ">=0.10.0" } }, + "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/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/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -1265,6 +1776,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "license": "ISC", + "engines": { + "node": ">=6" + } + }, "node_modules/json-bigint": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", @@ -1274,31 +1794,6 @@ "bignumber.js": "^9.0.0" } }, - "node_modules/json-schema-ref-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", - "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, "node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", @@ -1320,42 +1815,107 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/light-my-request": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", - "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause", + "node_modules/libphonenumber-js": { + "version": "1.12.37", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.37.tgz", + "integrity": "sha512-rDU6bkpuMs8YRt/UpkuYEAsYSoNuDEbrE41I3KNvmXREGH6DGBJ8Wbak4by29wNOQ27zk4g4HL82zf0OGhwRuw==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "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": "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/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/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": { - "cookie": "^1.0.1", - "process-warning": "^4.0.0", - "set-cookie-parser": "^2.6.0" + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/light-my-request/node_modules/process-warning": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", - "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } }, "node_modules/mnemonist": { "version": "0.40.0", @@ -1372,6 +1932,33 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/multer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", + "object-assign": "^4.1.1", + "type-is": "^1.6.18", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "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/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -1392,56 +1979,58 @@ } } }, + "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/obliterator": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", "license": "MIT" }, - "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/pino": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", - "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", + "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": { - "@pinojs/redact": "^0.4.0", - "atomic-sleep": "^1.0.0", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^3.0.0", - "pino-std-serializers": "^7.0.0", - "process-warning": "^5.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^4.0.1", - "thread-stream": "^4.0.0" + "ee-first": "1.1.1" }, - "bin": { - "pino": "bin.js" + "engines": { + "node": ">= 0.8" } }, - "node_modules/pino-abstract-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", - "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "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", - "dependencies": { - "split2": "^4.0.0" + "engines": { + "node": ">= 0.8" } }, - "node_modules/pino-std-serializers": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", - "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", "license": "MIT" }, "node_modules/postgres": { @@ -1457,46 +2046,87 @@ "url": "https://github.com/sponsors/porsager" } }, - "node_modules/process-warning": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", - "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" + "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/quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", - "license": "MIT" + "node_modules/proxy-addr/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/real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": ">= 12.13.0" + "node": ">= 0.6" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, + "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/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -1507,31 +2137,15 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/ret": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", - "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "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/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "license": "MIT" - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1552,96 +2166,196 @@ ], "license": "MIT" }, - "node_modules/safe-regex2": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", - "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], + "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/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { - "ret": "~0.5.0" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "node_modules/send/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/send/node_modules/debug/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/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/secure-json-parse": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", - "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" + "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/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" + "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": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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/sonic-boom": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", - "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", + "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": { - "atomic-sleep": "^1.0.0" + "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/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", + "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": ">= 10.x" + "node": ">= 0.8" } }, - "node_modules/thread-stream": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", - "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", + "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/strtok3": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", + "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "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": { - "real-require": "^0.2.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=20" + "node": ">=8" } }, "node_modules/toad-cache": { @@ -1653,12 +2367,45 @@ "node": ">=12" } }, + "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/token-types": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", + "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.2.1", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "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/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/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", @@ -1679,6 +2426,25 @@ "fsevents": "~2.3.3" } }, + "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/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/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -1693,6 +2459,30 @@ "node": ">=14.17" } }, + "node_modules/uid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "license": "MIT", + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/underscore": { "version": "1.13.8", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", @@ -1714,6 +2504,30 @@ "dev": true, "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/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/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -1727,6 +2541,24 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/validator": { + "version": "13.15.26", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz", + "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -1742,6 +2574,15 @@ "tr46": "~0.0.3", "webidl-conversions": "^3.0.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" + } } } } diff --git a/package.json b/package.json index 91d0b7e..953587c 100644 --- a/package.json +++ b/package.json @@ -5,19 +5,26 @@ "type": "module", "description": "General chess API (TypeScript)", "scripts": { - "dev": "tsx src/server.ts", + "dev": "tsx watch src/main.ts", "build": "tsc -p tsconfig.json", - "start": "node dist/server.js" + "start": "node dist/main.js" }, "dependencies": { "chess.js": "^1.4.0", - "fastify": "^5.0.0", "chess-ai-kong": "^0.3.3", "@fastify/cors": "^10.0.1", "@fastify/rate-limit": "^10.1.0", "drizzle-orm": "^0.39.0", "postgres": "^3.4.5", - "google-auth-library": "^9.15.1" + "google-auth-library": "^9.15.1", + "@nestjs/common": "^10.4.2", + "@nestjs/core": "^10.4.2", + "@nestjs/platform-express": "^10.4.2", + "@nestjs/config": "^3.2.3", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.1", + "class-validator": "^0.14.1", + "class-transformer": "^0.5.1" }, "devDependencies": { "typescript": "^5.7.3", diff --git a/src/app.module.ts b/src/app.module.ts new file mode 100644 index 0000000..bbe86f6 --- /dev/null +++ b/src/app.module.ts @@ -0,0 +1,19 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { DatabaseModule } from './database/database.module.js'; +import { AuthModule } from './modules/auth/auth.module.js'; +import { UsersModule } from './modules/users/users.module.js'; +import { ChessModule } from './modules/chess/chess.module.js'; +import { HealthModule } from './modules/health/health.module.js'; + +@Module({ + imports: [ + ConfigModule.forRoot({ isGlobal: true }), + DatabaseModule, + AuthModule, + UsersModule, + ChessModule, + HealthModule, + ], +}) +export class AppModule {} diff --git a/src/bootstrap.ts b/src/bootstrap.ts deleted file mode 100644 index 790ad50..0000000 --- a/src/bootstrap.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { client } from './db.js'; - -export async function ensureSchema() { - await client` - create table if not exists users ( - id text primary key, - email text not null unique, - name text not null, - picture text, - created_at timestamptz not null default now() - ); - `; - - await client` - create table if not exists sessions ( - token text primary key, - user_id text not null references users(id) on delete cascade, - expires_at timestamptz not null, - created_at timestamptz not null default now() - ); - `; - - await client` - create table if not exists api_keys ( - id text primary key, - user_id text not null references users(id) on delete cascade, - name text not null, - key_hash text not null unique, - key_prefix text not null, - active boolean not null default true, - created_at timestamptz not null default now(), - last_used_at timestamptz - ); - `; - - await client` - create table if not exists games ( - id text primary key, - user_id text not null references users(id) on delete cascade, - mode text not null, - ai_color text, - fen text not null, - pgn text not null, - turn text not null, - status text not null, - result_reason text, - result_winner text, - history jsonb not null, - initial_ms integer, - increment_ms integer, - remaining_w integer, - remaining_b integer, - running text, - last_tick_at integer, - created_at timestamptz not null default now(), - updated_at timestamptz not null default now() - ); - `; -} diff --git a/src/common/guards/api-key.guard.ts b/src/common/guards/api-key.guard.ts new file mode 100644 index 0000000..2f9b316 --- /dev/null +++ b/src/common/guards/api-key.guard.ts @@ -0,0 +1,30 @@ +import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common'; +import { and, eq } from 'drizzle-orm'; +import { DatabaseService } from '../../database/database.service.js'; +import { apiKeys } from '../../database/schema.js'; +import { sha256 } from '../../config/crypto.js'; + +@Injectable() +export class ApiKeyGuard implements CanActivate { + constructor(private readonly dbs: DatabaseService) {} + + async canActivate(context: ExecutionContext): Promise { + const req = context.switchToHttp().getRequest(); + const key = req.headers['x-api-key'] as string | undefined; + if (!key) throw new UnauthorizedException('Missing x-api-key'); + + const keyHash = sha256(key); + const rows = await this.dbs.db + .select({ id: apiKeys.id, userId: apiKeys.userId }) + .from(apiKeys) + .where(and(eq(apiKeys.keyHash, keyHash), eq(apiKeys.active, true))) + .limit(1); + + const api = rows[0]; + if (!api) throw new UnauthorizedException('Invalid API key'); + + await this.dbs.db.update(apiKeys).set({ lastUsedAt: new Date() }).where(eq(apiKeys.id, api.id)); + req.apiUserId = api.userId; + return true; + } +} diff --git a/src/common/guards/session.guard.ts b/src/common/guards/session.guard.ts new file mode 100644 index 0000000..b518091 --- /dev/null +++ b/src/common/guards/session.guard.ts @@ -0,0 +1,15 @@ +import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common'; +import { AuthService } from '../../modules/auth/auth.service.js'; + +@Injectable() +export class SessionGuard implements CanActivate { + constructor(private readonly auth: AuthService) {} + + async canActivate(context: ExecutionContext): Promise { + const req = context.switchToHttp().getRequest(); + const session = await this.auth.sessionFromBearer(req.headers.authorization); + if (!session) throw new UnauthorizedException('Invalid session'); + req.user = { id: session.userId, email: session.email, name: session.name }; + return true; + } +} diff --git a/src/config/crypto.ts b/src/config/crypto.ts new file mode 100644 index 0000000..8996db1 --- /dev/null +++ b/src/config/crypto.ts @@ -0,0 +1,5 @@ +import crypto from 'node:crypto'; + +export const randomId = () => crypto.randomUUID(); +export const randomToken = (bytes = 32) => crypto.randomBytes(bytes).toString('hex'); +export const sha256 = (s: string) => crypto.createHash('sha256').update(s).digest('hex'); diff --git a/src/crypto.ts b/src/crypto.ts deleted file mode 100644 index a7377f5..0000000 --- a/src/crypto.ts +++ /dev/null @@ -1,13 +0,0 @@ -import crypto from 'node:crypto'; - -export function randomId() { - return crypto.randomUUID(); -} - -export function randomToken(bytes = 32) { - return crypto.randomBytes(bytes).toString('hex'); -} - -export function sha256(input: string) { - return crypto.createHash('sha256').update(input).digest('hex'); -} diff --git a/src/database/database.module.ts b/src/database/database.module.ts new file mode 100644 index 0000000..fd2d5d8 --- /dev/null +++ b/src/database/database.module.ts @@ -0,0 +1,9 @@ +import { Global, Module } from '@nestjs/common'; +import { DatabaseService } from './database.service.js'; + +@Global() +@Module({ + providers: [DatabaseService], + exports: [DatabaseService], +}) +export class DatabaseModule {} diff --git a/src/database/database.service.ts b/src/database/database.service.ts new file mode 100644 index 0000000..507314f --- /dev/null +++ b/src/database/database.service.ts @@ -0,0 +1,67 @@ +import { Injectable, OnModuleInit } from '@nestjs/common'; +import postgres from 'postgres'; +import { drizzle } from 'drizzle-orm/postgres-js'; + +@Injectable() +export class DatabaseService implements OnModuleInit { + readonly client; + readonly db; + + constructor() { + const url = process.env.DATABASE_URL; + if (!url) throw new Error('DATABASE_URL is required'); + this.client = postgres(url, { prepare: false }); + this.db = drizzle(this.client); + } + + async onModuleInit() { + await this.client` + create table if not exists users ( + id text primary key, + email text not null unique, + name text not null, + picture text, + created_at timestamptz not null default now() + );`; + await this.client` + create table if not exists sessions ( + token text primary key, + user_id text not null references users(id) on delete cascade, + expires_at timestamptz not null, + created_at timestamptz not null default now() + );`; + await this.client` + create table if not exists api_keys ( + id text primary key, + user_id text not null references users(id) on delete cascade, + name text not null, + key_hash text not null unique, + key_prefix text not null, + active boolean not null default true, + created_at timestamptz not null default now(), + last_used_at timestamptz + );`; + await this.client` + create table if not exists games ( + id text primary key, + user_id text not null references users(id) on delete cascade, + mode text not null, + ai_color text, + fen text not null, + pgn text not null, + turn text not null, + status text not null, + result_reason text, + result_winner text, + history jsonb not null, + initial_ms integer, + increment_ms integer, + remaining_w integer, + remaining_b integer, + running text, + last_tick_at integer, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now() + );`; + } +} diff --git a/src/schema.ts b/src/database/schema.ts similarity index 93% rename from src/schema.ts rename to src/database/schema.ts index 3097f8b..85822c2 100644 --- a/src/schema.ts +++ b/src/database/schema.ts @@ -5,14 +5,14 @@ export const users = pgTable('users', { email: text('email').notNull().unique(), name: text('name').notNull(), picture: text('picture'), - createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow() + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), }); export const sessions = pgTable('sessions', { token: text('token').primaryKey(), userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }), expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(), - createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow() + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), }); export const apiKeys = pgTable('api_keys', { @@ -23,7 +23,7 @@ export const apiKeys = pgTable('api_keys', { keyPrefix: text('key_prefix').notNull(), active: boolean('active').notNull().default(true), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), - lastUsedAt: timestamp('last_used_at', { withTimezone: true }) + lastUsedAt: timestamp('last_used_at', { withTimezone: true }), }); export const games = pgTable('games', { @@ -45,5 +45,5 @@ export const games = pgTable('games', { running: text('running'), lastTickAt: integer('last_tick_at'), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), - updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow() + updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(), }); diff --git a/src/db.ts b/src/db.ts deleted file mode 100644 index 6856044..0000000 --- a/src/db.ts +++ /dev/null @@ -1,11 +0,0 @@ -import postgres from 'postgres'; -import { drizzle } from 'drizzle-orm/postgres-js'; - -const connection = process.env.DATABASE_URL; -if (!connection) { - throw new Error('DATABASE_URL is required'); -} - -const client = postgres(connection, { prepare: false }); -export const db = drizzle(client); -export { client }; diff --git a/src/google.ts b/src/google.ts deleted file mode 100644 index dc7848c..0000000 --- a/src/google.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { OAuth2Client } from 'google-auth-library'; - -const googleClientId = process.env.GOOGLE_CLIENT_ID; -if (!googleClientId) { - throw new Error('GOOGLE_CLIENT_ID is required'); -} - -const client = new OAuth2Client(googleClientId); - -export async function verifyGoogleIdToken(idToken: string) { - const ticket = await client.verifyIdToken({ idToken, audience: googleClientId }); - const payload = ticket.getPayload(); - if (!payload?.sub || !payload.email || !payload.name) { - throw new Error('Invalid Google token payload'); - } - - return { - googleId: payload.sub, - email: payload.email, - name: payload.name, - picture: payload.picture ?? null - }; -} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..7b89fe9 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,11 @@ +import { NestFactory } from '@nestjs/core'; +import { ValidationPipe } from '@nestjs/common'; +import { AppModule } from './app.module.js'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true })); + await app.listen(process.env.PORT ? Number(process.env.PORT) : 3000); +} + +bootstrap(); diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts new file mode 100644 index 0000000..7bc720e --- /dev/null +++ b/src/modules/auth/auth.controller.ts @@ -0,0 +1,12 @@ +import { Body, Controller, Post } from '@nestjs/common'; +import { AuthService } from './auth.service.js'; + +@Controller('auth') +export class AuthController { + constructor(private readonly auth: AuthService) {} + + @Post('google') + google(@Body() body: { idToken?: string }) { + return this.auth.loginWithGoogle(body.idToken || ''); + } +} diff --git a/src/modules/auth/auth.module.ts b/src/modules/auth/auth.module.ts new file mode 100644 index 0000000..5e39306 --- /dev/null +++ b/src/modules/auth/auth.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { AuthController } from './auth.controller.js'; +import { AuthService } from './auth.service.js'; + +@Module({ + controllers: [AuthController], + providers: [AuthService], + exports: [AuthService], +}) +export class AuthModule {} diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts new file mode 100644 index 0000000..b61bba8 --- /dev/null +++ b/src/modules/auth/auth.service.ts @@ -0,0 +1,63 @@ +import { BadRequestException, Injectable } from '@nestjs/common'; +import { OAuth2Client } from 'google-auth-library'; +import { and, eq, gt } from 'drizzle-orm'; +import { DatabaseService } from '../../database/database.service.js'; +import { sessions, users } from '../../database/schema.js'; +import { randomId, randomToken } from '../../config/crypto.js'; + +@Injectable() +export class AuthService { + private google = new OAuth2Client(process.env.GOOGLE_CLIENT_ID); + + constructor(private readonly dbs: DatabaseService) {} + + async loginWithGoogle(idToken: string) { + if (!idToken) throw new BadRequestException('idToken is required'); + if (!process.env.GOOGLE_CLIENT_ID) throw new BadRequestException('GOOGLE_CLIENT_ID missing'); + + const ticket = await this.google.verifyIdToken({ idToken, audience: process.env.GOOGLE_CLIENT_ID }); + const payload = ticket.getPayload(); + if (!payload?.email || !payload.name) throw new BadRequestException('Invalid Google token payload'); + + const existing = await this.dbs.db.select().from(users).where(eq(users.email, payload.email)).limit(1); + const userId = existing[0]?.id ?? randomId(); + + if (!existing.length) { + await this.dbs.db.insert(users).values({ + id: userId, + email: payload.email, + name: payload.name, + picture: payload.picture ?? null, + }); + } + + const token = randomToken(32); + const expiresAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); + await this.dbs.db.insert(sessions).values({ token, userId, expiresAt }); + + return { + accessToken: token, + expiresAt, + user: { + id: userId, + email: payload.email, + name: payload.name, + picture: payload.picture ?? null, + }, + }; + } + + async sessionFromBearer(authHeader?: string) { + if (!authHeader?.startsWith('Bearer ')) return null; + const token = authHeader.slice('Bearer '.length); + + const rows = await this.dbs.db + .select({ userId: sessions.userId, email: users.email, name: users.name }) + .from(sessions) + .innerJoin(users, eq(users.id, sessions.userId)) + .where(and(eq(sessions.token, token), gt(sessions.expiresAt, new Date()))) + .limit(1); + + return rows[0] ?? null; + } +} diff --git a/src/modules/chess/chess.controller.ts b/src/modules/chess/chess.controller.ts new file mode 100644 index 0000000..ada4bfe --- /dev/null +++ b/src/modules/chess/chess.controller.ts @@ -0,0 +1,46 @@ +import { Body, Controller, Delete, Get, Param, Post, Query, Req, UseGuards } from '@nestjs/common'; +import { ApiKeyGuard } from '../../common/guards/api-key.guard.js'; +import { ChessService } from './chess.service.js'; + +@Controller('games') +@UseGuards(ApiKeyGuard) +export class ChessController { + constructor(private readonly chess: ChessService) {} + + @Post() + create(@Req() req: any, @Body() body: any) { + return this.chess.create(req.apiUserId, body || {}); + } + + @Get(':id') + get(@Req() req: any, @Param('id') id: string) { + return this.chess.get(req.apiUserId, id); + } + + @Delete(':id') + async remove(@Req() req: any, @Param('id') id: string) { + await this.chess.remove(req.apiUserId, id); + return { ok: true }; + } + + @Get(':id/moves') + moves(@Req() req: any, @Param('id') id: string, @Query('from') from?: string) { + return this.chess.moves(req.apiUserId, id, from); + } + + @Post(':id/moves') + move(@Req() req: any, @Param('id') id: string, @Body() body: any) { + return this.chess.makeMove(req.apiUserId, id, body || {}); + } + + @Post(':id/ai-move') + aiMove(@Req() req: any, @Param('id') id: string) { + return this.chess.makeAiMove(req.apiUserId, id); + } + + @Post(':id/resign') + resign(@Req() req: any, @Param('id') id: string, @Body() body: { color?: 'w' | 'b' }) { + if (!body?.color || !['w', 'b'].includes(body.color)) return { error: 'color must be w or b' }; + return this.chess.makeResign(req.apiUserId, id, body.color); + } +} diff --git a/src/modules/chess/chess.engine.ts b/src/modules/chess/chess.engine.ts new file mode 100644 index 0000000..aded704 --- /dev/null +++ b/src/modules/chess/chess.engine.ts @@ -0,0 +1,178 @@ +import { Chess, type Square } from 'chess.js'; +import { createRequire } from 'node:module'; + +export type GameMode = 'pvp' | 'pve'; +export type Color = 'w' | 'b'; + +const require = createRequire(import.meta.url); +const chessAI: { play: (history: string[]) => string; setOptions: (opts: any) => void } = require('chess-ai-kong'); +chessAI.setOptions({ depth: 3, monitor: false, strategy: 'basic', timeout: 5000 }); + +export type GameState = { + mode: GameMode; + aiColor: Color | null; + chess: Chess; + status: 'active' | 'finished'; + result: { reason: 'checkmate' | 'draw' | 'timeout' | 'resign'; winner: Color | null } | null; + timeControl: null | { + initialMs: number; + incrementMs: number; + remaining: Record; + running: Color; + lastTickAt: number; + }; +}; + +const opposite = (c: Color): Color => (c === 'w' ? 'b' : 'w'); + +export function createState(input: { mode?: GameMode; fen?: string; aiColor?: Color; timeControl?: { initialSeconds: number; incrementSeconds?: number } }) { + const chess = new Chess(); + if (input.fen) chess.load(input.fen); + const turn = chess.turn(); + const tc = input.timeControl; + + const state: GameState = { + mode: input.mode ?? 'pvp', + aiColor: (input.mode ?? 'pvp') === 'pve' ? input.aiColor ?? 'b' : null, + chess, + status: 'active', + result: null, + timeControl: tc + ? { + initialMs: tc.initialSeconds * 1000, + incrementMs: (tc.incrementSeconds ?? 0) * 1000, + remaining: { w: tc.initialSeconds * 1000, b: tc.initialSeconds * 1000 }, + running: turn, + lastTickAt: Date.now(), + } + : null, + }; + return state; +} + +export function hydrate(row: any): GameState { + const chess = new Chess(row.fen); + return { + mode: row.mode, + aiColor: row.aiColor, + chess, + status: row.status, + result: row.resultReason ? { reason: row.resultReason, winner: row.resultWinner } : null, + timeControl: + row.initialMs !== null + ? { + initialMs: row.initialMs, + incrementMs: row.incrementMs, + remaining: { w: row.remainingW, b: row.remainingB }, + running: row.running, + lastTickAt: row.lastTickAt, + } + : null, + }; +} + +export function serialize(s: GameState) { + return { + mode: s.mode, + aiColor: s.aiColor, + fen: s.chess.fen(), + pgn: s.chess.pgn(), + turn: s.chess.turn(), + status: s.status, + resultReason: s.result?.reason ?? null, + resultWinner: s.result?.winner ?? null, + history: s.chess.history({ verbose: true }), + initialMs: s.timeControl?.initialMs ?? null, + incrementMs: s.timeControl?.incrementMs ?? null, + remainingW: s.timeControl?.remaining.w ?? null, + remainingB: s.timeControl?.remaining.b ?? null, + running: s.timeControl?.running ?? null, + lastTickAt: s.timeControl?.lastTickAt ?? null, + }; +} + +export function tick(s: GameState) { + if (!s.timeControl || s.status !== 'active') return; + const now = Date.now(); + const elapsed = Math.max(0, now - s.timeControl.lastTickAt); + s.timeControl.remaining[s.timeControl.running] = Math.max(0, s.timeControl.remaining[s.timeControl.running] - elapsed); + s.timeControl.lastTickAt = now; + if (s.timeControl.remaining[s.timeControl.running] <= 0) { + s.status = 'finished'; + s.result = { reason: 'timeout', winner: opposite(s.timeControl.running) }; + } +} + +function finalize(s: GameState, mover: Color) { + if (s.timeControl) { + s.timeControl.remaining[mover] += s.timeControl.incrementMs; + s.timeControl.running = s.chess.turn(); + s.timeControl.lastTickAt = Date.now(); + } + if (s.chess.isGameOver()) { + s.status = 'finished'; + s.result = s.chess.isCheckmate() ? { reason: 'checkmate', winner: opposite(s.chess.turn()) } : { reason: 'draw', winner: null }; + } +} + +export function legalMoves(s: GameState, from?: string) { + tick(s); + if (s.status !== 'active') return [] as string[]; + return from ? s.chess.moves({ square: from as Square }) : s.chess.moves(); +} + +export function move(s: GameState, payload: { san?: string; from?: string; to?: string; promotion?: 'q' | 'r' | 'b' | 'n' }) { + tick(s); + if (s.status !== 'active') return { error: 'Game is already finished' } as const; + const mover = s.chess.turn(); + const m = payload.san ? s.chess.move(payload.san) : payload.from && payload.to ? s.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) : null; + if (!m) return { error: 'Illegal move' } as const; + finalize(s, mover); + return { move: m } as const; +} + +export async function aiMove(s: GameState) { + tick(s); + if (s.status !== 'active') return { error: 'Game is already finished' } as const; + if (s.mode !== 'pve') return { error: 'AI move only supported for pve games' } as const; + if (s.aiColor !== s.chess.turn()) return { error: 'Not AI turn' } as const; + + const mover = s.chess.turn(); + const legal = s.chess.moves(); + if (!legal.length) return { error: 'No legal AI moves' } as const; + + let m: ReturnType | null = null; + try { + const san = chessAI.play(s.chess.history()); + m = s.chess.move(san); + } catch { + m = null; + } + if (!m) m = s.chess.move(legal[Math.floor(Math.random() * legal.length)]!); + if (!m) return { error: 'AI failed to move' } as const; + finalize(s, mover); + return { move: m } as const; +} + +export function resign(s: GameState, color: Color) { + if (s.status !== 'active') return; + s.status = 'finished'; + s.result = { reason: 'resign', winner: opposite(color) }; +} + +export function present(id: string, s: GameState) { + tick(s); + return { + id, + mode: s.mode, + status: s.status, + result: s.result, + fen: s.chess.fen(), + pgn: s.chess.pgn(), + turn: s.chess.turn(), + history: s.chess.history({ verbose: true }), + timeControl: s.timeControl + ? { initialMs: s.timeControl.initialMs, incrementMs: s.timeControl.incrementMs, remaining: s.timeControl.remaining, running: s.timeControl.running } + : null, + }; +} diff --git a/src/modules/chess/chess.module.ts b/src/modules/chess/chess.module.ts new file mode 100644 index 0000000..0307461 --- /dev/null +++ b/src/modules/chess/chess.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ChessController } from './chess.controller.js'; +import { ChessService } from './chess.service.js'; + +@Module({ + controllers: [ChessController], + providers: [ChessService], +}) +export class ChessModule {} diff --git a/src/modules/chess/chess.service.ts b/src/modules/chess/chess.service.ts new file mode 100644 index 0000000..0fcb7c0 --- /dev/null +++ b/src/modules/chess/chess.service.ts @@ -0,0 +1,74 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { and, eq } from 'drizzle-orm'; +import { DatabaseService } from '../../database/database.service.js'; +import { games } from '../../database/schema.js'; +import { randomId } from '../../config/crypto.js'; +import { aiMove, createState, hydrate, legalMoves, move, present, resign, serialize, type Color, type GameMode } from './chess.engine.js'; + +@Injectable() +export class ChessService { + constructor(private readonly dbs: DatabaseService) {} + + async create(userId: string, body: { mode?: GameMode; fen?: string; aiColor?: Color; timeControl?: { initialSeconds: number; incrementSeconds?: number } }) { + const id = randomId(); + const state = createState(body); + await this.dbs.db.insert(games).values({ id, userId, ...serialize(state), updatedAt: new Date() }); + return present(id, state); + } + + async get(userId: string, id: string) { + const row = await this.load(userId, id); + const state = hydrate(row); + await this.save(id, state); + return present(id, state); + } + + async remove(userId: string, id: string) { + await this.dbs.db.delete(games).where(and(eq(games.id, id), eq(games.userId, userId))); + } + + async moves(userId: string, id: string, from?: string) { + const row = await this.load(userId, id); + const state = hydrate(row); + const m = legalMoves(state, from); + await this.save(id, state); + return { gameId: id, from: from ?? null, count: m.length, moves: m }; + } + + async makeMove(userId: string, id: string, body: { san?: string; from?: string; to?: string; promotion?: 'q' | 'r' | 'b' | 'n' }) { + const row = await this.load(userId, id); + const state = hydrate(row); + const r = move(state, body); + if ('error' in r) return r; + await this.save(id, state); + return { move: r.move, state: present(id, state) }; + } + + async makeAiMove(userId: string, id: string) { + const row = await this.load(userId, id); + const state = hydrate(row); + const r = await aiMove(state); + if ('error' in r) return r; + await this.save(id, state); + return { move: r.move, state: present(id, state) }; + } + + async makeResign(userId: string, id: string, color: Color) { + const row = await this.load(userId, id); + const state = hydrate(row); + resign(state, color); + await this.save(id, state); + return present(id, state); + } + + private async load(userId: string, id: string) { + const rows = await this.dbs.db.select().from(games).where(and(eq(games.id, id), eq(games.userId, userId))).limit(1); + const row = rows[0]; + if (!row) throw new NotFoundException('Game not found'); + return row as any; + } + + private async save(id: string, state: any) { + await this.dbs.db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); + } +} diff --git a/src/modules/health/health.controller.ts b/src/modules/health/health.controller.ts new file mode 100644 index 0000000..cd54653 --- /dev/null +++ b/src/modules/health/health.controller.ts @@ -0,0 +1,26 @@ +import { Controller, Get } from '@nestjs/common'; + +@Controller() +export class HealthController { + @Get() + root() { + return { ok: true, service: 'chess-api', docs: '/api' }; + } + + @Get('api') + api() { + return { + message: 'Chess API (NestJS modular rewrite)', + auth: ['POST /auth/google', 'GET /me', 'GET/POST/DELETE /me/api-keys'], + chess: [ + 'POST /games', + 'GET /games/:id', + 'DELETE /games/:id', + 'GET /games/:id/moves', + 'POST /games/:id/moves', + 'POST /games/:id/ai-move', + 'POST /games/:id/resign', + ], + }; + } +} diff --git a/src/modules/health/health.module.ts b/src/modules/health/health.module.ts new file mode 100644 index 0000000..4bc6527 --- /dev/null +++ b/src/modules/health/health.module.ts @@ -0,0 +1,5 @@ +import { Module } from '@nestjs/common'; +import { HealthController } from './health.controller.js'; + +@Module({ controllers: [HealthController] }) +export class HealthModule {} diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts new file mode 100644 index 0000000..60e9ef9 --- /dev/null +++ b/src/modules/users/users.controller.ts @@ -0,0 +1,30 @@ +import { Body, Controller, Delete, Get, Param, Post, Req, UseGuards } from '@nestjs/common'; +import { SessionGuard } from '../../common/guards/session.guard.js'; +import { UsersService } from './users.service.js'; + +@Controller('me') +@UseGuards(SessionGuard) +export class UsersController { + constructor(private readonly users: UsersService) {} + + @Get() + me(@Req() req: any) { + return { user: req.user }; + } + + @Get('api-keys') + async list(@Req() req: any) { + return { items: await this.users.listApiKeys(req.user.id) }; + } + + @Post('api-keys') + create(@Req() req: any, @Body() body: { name?: string }) { + return this.users.createApiKey(req.user.id, body?.name || 'default'); + } + + @Delete('api-keys/:id') + async revoke(@Req() req: any, @Param('id') id: string) { + await this.users.revokeApiKey(req.user.id, id); + return { ok: true }; + } +} diff --git a/src/modules/users/users.module.ts b/src/modules/users/users.module.ts new file mode 100644 index 0000000..b4e07cb --- /dev/null +++ b/src/modules/users/users.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { UsersController } from './users.controller.js'; +import { UsersService } from './users.service.js'; +import { AuthModule } from '../auth/auth.module.js'; + +@Module({ + imports: [AuthModule], + controllers: [UsersController], + providers: [UsersService], +}) +export class UsersModule {} diff --git a/src/modules/users/users.service.ts b/src/modules/users/users.service.ts new file mode 100644 index 0000000..22c03a5 --- /dev/null +++ b/src/modules/users/users.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@nestjs/common'; +import { and, eq } from 'drizzle-orm'; +import { DatabaseService } from '../../database/database.service.js'; +import { apiKeys } from '../../database/schema.js'; +import { randomId, randomToken, sha256 } from '../../config/crypto.js'; + +@Injectable() +export class UsersService { + constructor(private readonly dbs: DatabaseService) {} + + async listApiKeys(userId: string) { + return this.dbs.db + .select({ + id: apiKeys.id, + name: apiKeys.name, + keyPrefix: apiKeys.keyPrefix, + active: apiKeys.active, + createdAt: apiKeys.createdAt, + lastUsedAt: apiKeys.lastUsedAt, + }) + .from(apiKeys) + .where(eq(apiKeys.userId, userId)); + } + + async createApiKey(userId: string, name = 'default') { + const rawKey = `chess_${randomToken(24)}`; + await this.dbs.db.insert(apiKeys).values({ + id: randomId(), + userId, + name: name.slice(0, 80), + keyHash: sha256(rawKey), + keyPrefix: rawKey.slice(0, 12), + active: true, + }); + return { apiKey: rawKey }; + } + + async revokeApiKey(userId: string, id: string) { + await this.dbs.db + .update(apiKeys) + .set({ active: false }) + .where(and(eq(apiKeys.id, id), eq(apiKeys.userId, userId))); + } +} diff --git a/src/server.ts b/src/server.ts deleted file mode 100644 index 1dae071..0000000 --- a/src/server.ts +++ /dev/null @@ -1,272 +0,0 @@ -import Fastify from 'fastify'; -import rateLimit from '@fastify/rate-limit'; -import cors from '@fastify/cors'; -import { and, eq, gt } from 'drizzle-orm'; -import { db } from './db.js'; -import { apiKeys, games, sessions, users } from './schema.js'; -import { ensureSchema } from './bootstrap.js'; -import { randomId, randomToken, sha256 } from './crypto.js'; -import { verifyGoogleIdToken } from './google.js'; -import { - aiMove, - hydrate, - legalMoves, - makeMove, - newGameState, - present, - resign, - serialize, - type Color, - type GameMode -} from './store.js'; - -const app = Fastify({ logger: true }); -await app.register(cors, { origin: true }); -await app.register(rateLimit, { max: 200, timeWindow: '1 minute' }); -await ensureSchema(); - -type SessionUser = { id: string; email: string; name: string }; - -declare module 'fastify' { - interface FastifyRequest { - sessionUser?: SessionUser; - apiUserId?: string; - } -} - -async function requireSession(request: any, reply: any) { - const auth = request.headers.authorization as string | undefined; - if (!auth?.startsWith('Bearer ')) return reply.code(401).send({ error: 'Missing bearer token' }); - - const token = auth.slice('Bearer '.length); - const rows = await db - .select({ userId: sessions.userId, email: users.email, name: users.name }) - .from(sessions) - .innerJoin(users, eq(users.id, sessions.userId)) - .where(and(eq(sessions.token, token), gt(sessions.expiresAt, new Date()))) - .limit(1); - - if (!rows.length) return reply.code(401).send({ error: 'Invalid session' }); - request.sessionUser = { id: rows[0]!.userId, email: rows[0]!.email, name: rows[0]!.name }; -} - -async function requireApiKey(request: any, reply: any) { - const key = request.headers['x-api-key'] as string | undefined; - if (!key) return reply.code(401).send({ error: 'Missing x-api-key' }); - - const keyHash = sha256(key); - const rows = await db - .select({ id: apiKeys.id, userId: apiKeys.userId }) - .from(apiKeys) - .where(and(eq(apiKeys.keyHash, keyHash), eq(apiKeys.active, true))) - .limit(1); - - if (!rows.length) return reply.code(401).send({ error: 'Invalid API key' }); - - await db.update(apiKeys).set({ lastUsedAt: new Date() }).where(eq(apiKeys.id, rows[0]!.id)); - request.apiUserId = rows[0]!.userId; -} - -app.get('/', async () => ({ ok: true, service: 'chess-api', docs: '/api' })); - -app.get('/api', async () => ({ - message: 'Production Chess API', - auth: { - login: 'POST /auth/google', - me: 'GET /me', - apiKeys: 'POST/GET/DELETE /me/api-keys' - }, - chess: ['POST /games', 'GET /games/:id', 'DELETE /games/:id', 'GET /games/:id/moves', 'POST /games/:id/moves', 'POST /games/:id/ai-move', 'POST /games/:id/resign'] -})); - -app.post('/auth/google', async (request, reply) => { - const body = (request.body ?? {}) as { idToken?: string }; - if (!body.idToken) return reply.code(400).send({ error: 'idToken is required' }); - - const profile = await verifyGoogleIdToken(body.idToken); - - const existing = await db.select().from(users).where(eq(users.email, profile.email)).limit(1); - const userId = existing[0]?.id ?? randomId(); - - if (!existing.length) { - await db.insert(users).values({ id: userId, email: profile.email, name: profile.name, picture: profile.picture }); - } - - const token = randomToken(32); - const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 30); - await db.insert(sessions).values({ token, userId, expiresAt }); - - return { accessToken: token, expiresAt, user: { id: userId, email: profile.email, name: profile.name, picture: profile.picture } }; -}); - -app.get('/me', { preHandler: requireSession }, async (request) => { - return { user: request.sessionUser }; -}); - -app.get('/me/api-keys', { preHandler: requireSession }, async (request) => { - const rows = await db - .select({ id: apiKeys.id, name: apiKeys.name, keyPrefix: apiKeys.keyPrefix, active: apiKeys.active, createdAt: apiKeys.createdAt, lastUsedAt: apiKeys.lastUsedAt }) - .from(apiKeys) - .where(eq(apiKeys.userId, request.sessionUser!.id)); - - return { items: rows }; -}); - -app.post('/me/api-keys', { preHandler: requireSession }, async (request, reply) => { - const body = (request.body ?? {}) as { name?: string }; - const name = (body.name ?? 'default').slice(0, 80); - - const rawKey = `chess_${randomToken(24)}`; - const keyHash = sha256(rawKey); - const keyPrefix = rawKey.slice(0, 12); - - await db.insert(apiKeys).values({ - id: randomId(), - userId: request.sessionUser!.id, - name, - keyHash, - keyPrefix, - active: true - }); - - reply.code(201); - return { apiKey: rawKey, prefix: keyPrefix, name }; -}); - -app.delete('/me/api-keys/:id', { preHandler: requireSession }, async (request, reply) => { - const { id } = request.params as { id: string }; - await db - .update(apiKeys) - .set({ active: false }) - .where(and(eq(apiKeys.id, id), eq(apiKeys.userId, request.sessionUser!.id))); - return reply.code(204).send(); -}); - -app.post('/games', { preHandler: requireApiKey }, async (request, reply) => { - const body = (request.body ?? {}) as { - mode?: GameMode; - fen?: string; - aiColor?: Color; - timeControl?: { initialSeconds: number; incrementSeconds?: number }; - }; - - const gameId = randomId(); - const state = newGameState(body); - const payload = serialize(state); - - await db.insert(games).values({ - id: gameId, - userId: request.apiUserId!, - ...payload, - updatedAt: new Date() - }); - - reply.code(201); - return present(gameId, state); -}); - -app.get('/games/:id', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params as { id: string }; - const rows = await db - .select() - .from(games) - .where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))) - .limit(1); - - const row = rows[0]; - if (!row) return reply.code(404).send({ error: 'Game not found' }); - - const state = hydrate(row as any); - const view = present(id, state); - - await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); - return view; -}); - -app.delete('/games/:id', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params as { id: string }; - await db.delete(games).where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))); - return reply.code(204).send(); -}); - -app.get('/games/:id/moves', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params as { id: string }; - const { from } = (request.query ?? {}) as { from?: string }; - const rows = await db - .select() - .from(games) - .where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))) - .limit(1); - const row = rows[0]; - if (!row) return reply.code(404).send({ error: 'Game not found' }); - - const state = hydrate(row as any); - const moves = legalMoves(state, from); - await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); - return { gameId: id, from: from ?? null, count: moves.length, moves }; -}); - -app.post('/games/:id/moves', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params as { id: string }; - const body = (request.body ?? {}) as { san?: string; from?: string; to?: string; promotion?: 'q' | 'r' | 'b' | 'n' }; - - const rows = await db - .select() - .from(games) - .where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))) - .limit(1); - const row = rows[0]; - if (!row) return reply.code(404).send({ error: 'Game not found' }); - - const state = hydrate(row as any); - const result = makeMove(state, body); - if ('error' in result) return reply.code(422).send(result); - - await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); - return { move: result.move, state: present(id, state) }; -}); - -app.post('/games/:id/ai-move', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params as { id: string }; - - const rows = await db - .select() - .from(games) - .where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))) - .limit(1); - const row = rows[0]; - if (!row) return reply.code(404).send({ error: 'Game not found' }); - - const state = hydrate(row as any); - const result = await aiMove(state); - if ('error' in result) return reply.code(422).send(result); - - await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); - return { move: result.move, state: present(id, state) }; -}); - -app.post('/games/:id/resign', { preHandler: requireApiKey }, async (request, reply) => { - const { id } = request.params as { id: string }; - const body = (request.body ?? {}) as { color?: Color }; - if (!body.color || !['w', 'b'].includes(body.color)) { - return reply.code(400).send({ error: 'color must be w or b' }); - } - - const rows = await db - .select() - .from(games) - .where(and(eq(games.id, id), eq(games.userId, request.apiUserId!))) - .limit(1); - const row = rows[0]; - if (!row) return reply.code(404).send({ error: 'Game not found' }); - - const state = hydrate(row as any); - resign(state, body.color); - await db.update(games).set({ ...serialize(state), updatedAt: new Date() }).where(eq(games.id, id)); - return present(id, state); -}); - -const port = Number(process.env.PORT || 3000); -app.listen({ port, host: '0.0.0.0' }).then(() => { - app.log.info(`chess-api listening on ${port}`); -}); diff --git a/src/store.ts b/src/store.ts deleted file mode 100644 index c1880c3..0000000 --- a/src/store.ts +++ /dev/null @@ -1,236 +0,0 @@ -import { Chess, type Square } from 'chess.js'; -import { createRequire } from 'node:module'; - -export type GameMode = 'pvp' | 'pve'; -export type Color = 'w' | 'b'; - -const require = createRequire(import.meta.url); -const chessAI: { - play: (history: string[]) => string; - setOptions: (opts: { depth?: number; monitor?: boolean; strategy?: string; timeout?: number }) => void; -} = require('chess-ai-kong'); - -chessAI.setOptions({ depth: 3, monitor: false, strategy: 'basic', timeout: 5000 }); - -export interface TimeControl { - initialMs: number; - incrementMs: number; - remaining: Record; - running: Color; - lastTickAt: number; -} - -export interface GameState { - mode: GameMode; - aiColor: Color | null; - chess: Chess; - status: 'active' | 'finished'; - result: { reason: 'checkmate' | 'draw' | 'timeout' | 'resign'; winner: Color | null } | null; - timeControl: TimeControl | null; -} - -function opposite(c: Color): Color { - return c === 'w' ? 'b' : 'w'; -} - -export function newGameState(input: { - mode?: GameMode; - fen?: string; - aiColor?: Color; - timeControl?: { initialSeconds: number; incrementSeconds?: number }; -}): GameState { - const chess = new Chess(); - if (input.fen) chess.load(input.fen); - const turn = chess.turn(); - - return { - mode: input.mode ?? 'pvp', - aiColor: (input.mode ?? 'pvp') === 'pve' ? input.aiColor ?? 'b' : null, - chess, - status: 'active', - result: null, - timeControl: input.timeControl - ? { - initialMs: Math.max(1, input.timeControl.initialSeconds) * 1000, - incrementMs: Math.max(0, input.timeControl.incrementSeconds ?? 0) * 1000, - remaining: { - w: Math.max(1, input.timeControl.initialSeconds) * 1000, - b: Math.max(1, input.timeControl.initialSeconds) * 1000 - }, - running: turn, - lastTickAt: Date.now() - } - : null - }; -} - -export function hydrate(row: { - mode: string; - aiColor: string | null; - fen: string; - status: string; - resultReason: string | null; - resultWinner: string | null; - initialMs: number | null; - incrementMs: number | null; - remainingW: number | null; - remainingB: number | null; - running: string | null; - lastTickAt: number | null; -}): GameState { - const chess = new Chess(row.fen); - const timeControl = - row.initialMs && row.incrementMs !== null && row.remainingW !== null && row.remainingB !== null && row.running && row.lastTickAt - ? { - initialMs: row.initialMs, - incrementMs: row.incrementMs, - remaining: { w: row.remainingW, b: row.remainingB }, - running: row.running as Color, - lastTickAt: row.lastTickAt - } - : null; - - return { - mode: row.mode as GameMode, - aiColor: (row.aiColor as Color | null) ?? null, - chess, - status: row.status as 'active' | 'finished', - result: row.resultReason - ? { reason: row.resultReason as 'checkmate' | 'draw' | 'timeout' | 'resign', winner: (row.resultWinner as Color | null) ?? null } - : null, - timeControl - }; -} - -export function serialize(state: GameState) { - return { - mode: state.mode, - aiColor: state.aiColor, - fen: state.chess.fen(), - pgn: state.chess.pgn(), - turn: state.chess.turn(), - status: state.status, - resultReason: state.result?.reason ?? null, - resultWinner: state.result?.winner ?? null, - history: state.chess.history({ verbose: true }), - initialMs: state.timeControl?.initialMs ?? null, - incrementMs: state.timeControl?.incrementMs ?? null, - remainingW: state.timeControl?.remaining.w ?? null, - remainingB: state.timeControl?.remaining.b ?? null, - running: state.timeControl?.running ?? null, - lastTickAt: state.timeControl?.lastTickAt ?? null - }; -} - -function finishIfGameOver(state: GameState) { - if (!state.chess.isGameOver()) return; - state.status = 'finished'; - if (state.chess.isCheckmate()) { - state.result = { reason: 'checkmate', winner: opposite(state.chess.turn()) }; - return; - } - state.result = { reason: 'draw', winner: null }; -} - -export function tick(state: GameState) { - if (!state.timeControl || state.status !== 'active') return; - const now = Date.now(); - const elapsed = Math.max(0, now - state.timeControl.lastTickAt); - state.timeControl.remaining[state.timeControl.running] = Math.max( - 0, - state.timeControl.remaining[state.timeControl.running] - elapsed - ); - state.timeControl.lastTickAt = now; - - if (state.timeControl.remaining[state.timeControl.running] <= 0) { - state.status = 'finished'; - state.result = { reason: 'timeout', winner: opposite(state.timeControl.running) }; - } -} - -function afterMove(state: GameState, mover: Color) { - if (state.timeControl) { - state.timeControl.remaining[mover] += state.timeControl.incrementMs; - state.timeControl.running = state.chess.turn(); - state.timeControl.lastTickAt = Date.now(); - } - finishIfGameOver(state); -} - -export function legalMoves(state: GameState, from?: string) { - tick(state); - if (state.status !== 'active') return [] as string[]; - return from ? state.chess.moves({ square: from as Square }) : state.chess.moves(); -} - -export function makeMove(state: GameState, payload: { san?: string; from?: string; to?: string; promotion?: 'q' | 'r' | 'b' | 'n' }) { - tick(state); - if (state.status !== 'active') return { error: 'Game is already finished' } as const; - - const mover = state.chess.turn(); - const move = payload.san - ? state.chess.move(payload.san) - : payload.from && payload.to - ? state.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) - : null; - - if (!move) return { error: 'Illegal move' } as const; - afterMove(state, mover); - return { move } as const; -} - -export async function aiMove(state: GameState) { - tick(state); - if (state.status !== 'active') return { error: 'Game is already finished' } as const; - if (state.mode !== 'pve') return { error: 'AI move only supported for pve games' } as const; - if (state.aiColor !== state.chess.turn()) return { error: 'Not AI turn' } as const; - - const mover = state.chess.turn(); - const legal = state.chess.moves(); - if (!legal.length) return { error: 'No legal AI moves' } as const; - - let move = null as ReturnType | null; - try { - const san = chessAI.play(state.chess.history()); - move = state.chess.move(san); - } catch { - move = null; - } - - if (!move) { - const pick = legal[Math.floor(Math.random() * legal.length)]!; - move = state.chess.move(pick); - } - - if (!move) return { error: 'AI failed to move' } as const; - afterMove(state, mover); - return { move } as const; -} - -export function resign(state: GameState, color: Color) { - if (state.status !== 'active') return; - state.status = 'finished'; - state.result = { reason: 'resign', winner: opposite(color) }; -} - -export function present(id: string, state: GameState) { - tick(state); - return { - id, - mode: state.mode, - status: state.status, - result: state.result, - fen: state.chess.fen(), - pgn: state.chess.pgn(), - turn: state.chess.turn(), - history: state.chess.history({ verbose: true }), - timeControl: state.timeControl - ? { - initialMs: state.timeControl.initialMs, - incrementMs: state.timeControl.incrementMs, - remaining: state.timeControl.remaining, - running: state.timeControl.running - } - : null - }; -} diff --git a/tsconfig.json b/tsconfig.json index 87e9440..d5b7b97 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,13 +1,15 @@ { "compilerOptions": { - "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", + "target": "ES2022", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, "strict": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, "skipLibCheck": true, + "esModuleInterop": true, "outDir": "dist", + "sourceMap": true, "types": ["node"] }, "include": ["src/**/*.ts"] From 20fce80efd0c59fe930707b71117b0938b7dfb92 Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 20:12:38 +0100 Subject: [PATCH 10/59] feat(api): add DTO validation classes and chess engine tests --- dist/modules/auth/auth.controller.js | 5 +- dist/modules/auth/auth.controller.js.map | 2 +- dist/modules/auth/dto/google-login.dto.js | 19 +++++++ dist/modules/auth/dto/google-login.dto.js.map | 1 + dist/modules/chess/chess.controller.js | 11 ++-- dist/modules/chess/chess.controller.js.map | 2 +- dist/modules/chess/chess.engine.js | 12 +++- dist/modules/chess/chess.engine.js.map | 2 +- dist/modules/chess/dto/create-game.dto.js | 57 +++++++++++++++++++ dist/modules/chess/dto/create-game.dto.js.map | 1 + dist/modules/chess/dto/move.dto.js | 39 +++++++++++++ dist/modules/chess/dto/move.dto.js.map | 1 + dist/modules/chess/dto/resign.dto.js | 18 ++++++ dist/modules/chess/dto/resign.dto.js.map | 1 + dist/modules/users/dto/create-api-key.dto.js | 20 +++++++ .../users/dto/create-api-key.dto.js.map | 1 + dist/modules/users/users.controller.js | 3 +- dist/modules/users/users.controller.js.map | 2 +- package.json | 3 +- src/modules/auth/auth.controller.ts | 5 +- src/modules/auth/dto/google-login.dto.ts | 7 +++ src/modules/chess/chess.controller.ts | 10 ++-- src/modules/chess/chess.engine.ts | 13 ++++- src/modules/chess/dto/create-game.dto.ts | 35 ++++++++++++ src/modules/chess/dto/move.dto.ts | 21 +++++++ src/modules/chess/dto/resign.dto.ts | 6 ++ src/modules/users/dto/create-api-key.dto.ts | 8 +++ src/modules/users/users.controller.ts | 3 +- test/chess.engine.test.ts | 30 ++++++++++ 29 files changed, 316 insertions(+), 22 deletions(-) create mode 100644 dist/modules/auth/dto/google-login.dto.js create mode 100644 dist/modules/auth/dto/google-login.dto.js.map create mode 100644 dist/modules/chess/dto/create-game.dto.js create mode 100644 dist/modules/chess/dto/create-game.dto.js.map create mode 100644 dist/modules/chess/dto/move.dto.js create mode 100644 dist/modules/chess/dto/move.dto.js.map create mode 100644 dist/modules/chess/dto/resign.dto.js create mode 100644 dist/modules/chess/dto/resign.dto.js.map create mode 100644 dist/modules/users/dto/create-api-key.dto.js create mode 100644 dist/modules/users/dto/create-api-key.dto.js.map create mode 100644 src/modules/auth/dto/google-login.dto.ts create mode 100644 src/modules/chess/dto/create-game.dto.ts create mode 100644 src/modules/chess/dto/move.dto.ts create mode 100644 src/modules/chess/dto/resign.dto.ts create mode 100644 src/modules/users/dto/create-api-key.dto.ts create mode 100644 test/chess.engine.test.ts diff --git a/dist/modules/auth/auth.controller.js b/dist/modules/auth/auth.controller.js index fb8eecd..3db5551 100644 --- a/dist/modules/auth/auth.controller.js +++ b/dist/modules/auth/auth.controller.js @@ -12,20 +12,21 @@ var __param = (this && this.__param) || function (paramIndex, decorator) { }; import { Body, Controller, Post } from '@nestjs/common'; import { AuthService } from './auth.service.js'; +import { GoogleLoginDto } from './dto/google-login.dto.js'; let AuthController = class AuthController { auth; constructor(auth) { this.auth = auth; } google(body) { - return this.auth.loginWithGoogle(body.idToken || ''); + return this.auth.loginWithGoogle(body.idToken); } }; __decorate([ Post('google'), __param(0, Body()), __metadata("design:type", Function), - __metadata("design:paramtypes", [Object]), + __metadata("design:paramtypes", [GoogleLoginDto]), __metadata("design:returntype", void 0) ], AuthController.prototype, "google", null); AuthController = __decorate([ diff --git a/dist/modules/auth/auth.controller.js.map b/dist/modules/auth/auth.controller.js.map index c6f1cb1..b484926 100644 --- a/dist/modules/auth/auth.controller.js.map +++ b/dist/modules/auth/auth.controller.js.map @@ -1 +1 @@ -{"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../../src/modules/auth/auth.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGzC,IAAM,cAAc,GAApB,MAAM,cAAc;IACI;IAA7B,YAA6B,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAAG,CAAC;IAGlD,MAAM,CAAS,IAA0B;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;CACF,CAAA;AAHC;IADC,IAAI,CAAC,QAAQ,CAAC;IACP,WAAA,IAAI,EAAE,CAAA;;;;4CAEb;AANU,cAAc;IAD1B,UAAU,CAAC,MAAM,CAAC;qCAEkB,WAAW;GADnC,cAAc,CAO1B"} \ No newline at end of file +{"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../../src/modules/auth/auth.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGpD,IAAM,cAAc,GAApB,MAAM,cAAc;IACI;IAA7B,YAA6B,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAAG,CAAC;IAGlD,MAAM,CAAS,IAAoB;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;CACF,CAAA;AAHC;IADC,IAAI,CAAC,QAAQ,CAAC;IACP,WAAA,IAAI,EAAE,CAAA;;qCAAO,cAAc;;4CAElC;AANU,cAAc;IAD1B,UAAU,CAAC,MAAM,CAAC;qCAEkB,WAAW;GADnC,cAAc,CAO1B"} \ No newline at end of file diff --git a/dist/modules/auth/dto/google-login.dto.js b/dist/modules/auth/dto/google-login.dto.js new file mode 100644 index 0000000..ec18918 --- /dev/null +++ b/dist/modules/auth/dto/google-login.dto.js @@ -0,0 +1,19 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { IsString, MinLength } from 'class-validator'; +export class GoogleLoginDto { + idToken; +} +__decorate([ + IsString(), + MinLength(10), + __metadata("design:type", String) +], GoogleLoginDto.prototype, "idToken", void 0); +//# sourceMappingURL=google-login.dto.js.map \ No newline at end of file diff --git a/dist/modules/auth/dto/google-login.dto.js.map b/dist/modules/auth/dto/google-login.dto.js.map new file mode 100644 index 0000000..00ea62e --- /dev/null +++ b/dist/modules/auth/dto/google-login.dto.js.map @@ -0,0 +1 @@ +{"version":3,"file":"google-login.dto.js","sourceRoot":"","sources":["../../../../src/modules/auth/dto/google-login.dto.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,OAAO,cAAc;IAGzB,OAAO,CAAU;CAClB;AADC;IAFC,QAAQ,EAAE;IACV,SAAS,CAAC,EAAE,CAAC;;+CACG"} \ No newline at end of file diff --git a/dist/modules/chess/chess.controller.js b/dist/modules/chess/chess.controller.js index df8e043..d2ef29d 100644 --- a/dist/modules/chess/chess.controller.js +++ b/dist/modules/chess/chess.controller.js @@ -13,6 +13,9 @@ var __param = (this && this.__param) || function (paramIndex, decorator) { import { Body, Controller, Delete, Get, Param, Post, Query, Req, UseGuards } from '@nestjs/common'; import { ApiKeyGuard } from '../../common/guards/api-key.guard.js'; import { ChessService } from './chess.service.js'; +import { CreateGameDto } from './dto/create-game.dto.js'; +import { MoveDto } from './dto/move.dto.js'; +import { ResignDto } from './dto/resign.dto.js'; let ChessController = class ChessController { chess; constructor(chess) { @@ -38,8 +41,6 @@ let ChessController = class ChessController { return this.chess.makeAiMove(req.apiUserId, id); } resign(req, id, body) { - if (!body?.color || !['w', 'b'].includes(body.color)) - return { error: 'color must be w or b' }; return this.chess.makeResign(req.apiUserId, id, body.color); } }; @@ -48,7 +49,7 @@ __decorate([ __param(0, Req()), __param(1, Body()), __metadata("design:type", Function), - __metadata("design:paramtypes", [Object, Object]), + __metadata("design:paramtypes", [Object, CreateGameDto]), __metadata("design:returntype", void 0) ], ChessController.prototype, "create", null); __decorate([ @@ -82,7 +83,7 @@ __decorate([ __param(1, Param('id')), __param(2, Body()), __metadata("design:type", Function), - __metadata("design:paramtypes", [Object, String, Object]), + __metadata("design:paramtypes", [Object, String, MoveDto]), __metadata("design:returntype", void 0) ], ChessController.prototype, "move", null); __decorate([ @@ -99,7 +100,7 @@ __decorate([ __param(1, Param('id')), __param(2, Body()), __metadata("design:type", Function), - __metadata("design:paramtypes", [Object, String, Object]), + __metadata("design:paramtypes", [Object, String, ResignDto]), __metadata("design:returntype", void 0) ], ChessController.prototype, "resign", null); ChessController = __decorate([ diff --git a/dist/modules/chess/chess.controller.js.map b/dist/modules/chess/chess.controller.js.map index 3863843..c0d75da 100644 --- a/dist/modules/chess/chess.controller.js.map +++ b/dist/modules/chess/chess.controller.js.map @@ -1 +1 @@ -{"version":3,"file":"chess.controller.js","sourceRoot":"","sources":["../../../src/modules/chess/chess.controller.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chess.controller.js","sourceRoot":"","sources":["../../../src/modules/chess/chess.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIzC,IAAM,eAAe,GAArB,MAAM,eAAe;IACG;IAA7B,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAGpD,MAAM,CAAQ,GAAQ,EAAU,IAAmB;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAGD,GAAG,CAAQ,GAAQ,EAAe,EAAU;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM,CAAQ,GAAQ,EAAe,EAAU;QACnD,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAGD,KAAK,CAAQ,GAAQ,EAAe,EAAU,EAAiB,IAAa;QAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAGD,IAAI,CAAQ,GAAQ,EAAe,EAAU,EAAU,IAAa;QAClE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAGD,MAAM,CAAQ,GAAQ,EAAe,EAAU;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IAGD,MAAM,CAAQ,GAAQ,EAAe,EAAU,EAAU,IAAe;QACtE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;CACF,CAAA;AAlCC;IADC,IAAI,EAAE;IACC,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,IAAI,EAAE,CAAA;;6CAAO,aAAa;;6CAElD;AAGD;IADC,GAAG,CAAC,KAAK,CAAC;IACN,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;;;;0CAEhC;AAGK;IADL,MAAM,CAAC,KAAK,CAAC;IACA,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;;;;6CAGzC;AAGD;IADC,GAAG,CAAC,WAAW,CAAC;IACV,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;IAAc,WAAA,KAAK,CAAC,MAAM,CAAC,CAAA;;;;4CAE7D;AAGD;IADC,IAAI,CAAC,WAAW,CAAC;IACZ,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;IAAc,WAAA,IAAI,EAAE,CAAA;;qDAAO,OAAO;;2CAEnE;AAGD;IADC,IAAI,CAAC,aAAa,CAAC;IACZ,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;;;;6CAEnC;AAGD;IADC,IAAI,CAAC,YAAY,CAAC;IACX,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;IAAc,WAAA,IAAI,EAAE,CAAA;;qDAAO,SAAS;;6CAEvE;AArCU,eAAe;IAF3B,UAAU,CAAC,OAAO,CAAC;IACnB,SAAS,CAAC,WAAW,CAAC;qCAEe,YAAY;GADrC,eAAe,CAsC3B"} \ No newline at end of file diff --git a/dist/modules/chess/chess.engine.js b/dist/modules/chess/chess.engine.js index ae325e0..4915b80 100644 --- a/dist/modules/chess/chess.engine.js +++ b/dist/modules/chess/chess.engine.js @@ -100,7 +100,17 @@ export function move(s, payload) { if (s.status !== 'active') return { error: 'Game is already finished' }; const mover = s.chess.turn(); - const m = payload.san ? s.chess.move(payload.san) : payload.from && payload.to ? s.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) : null; + let m = null; + try { + m = payload.san + ? s.chess.move(payload.san) + : payload.from && payload.to + ? s.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) + : null; + } + catch { + m = null; + } if (!m) return { error: 'Illegal move' }; finalize(s, mover); diff --git a/dist/modules/chess/chess.engine.js.map b/dist/modules/chess/chess.engine.js.map index 9ba977e..32755b6 100644 --- a/dist/modules/chess/chess.engine.js.map +++ b/dist/modules/chess/chess.engine.js.map @@ -1 +1 @@ -{"version":3,"file":"chess.engine.js","sourceRoot":"","sources":["../../../src/modules/chess/chess.engine.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chess.engine.js","sourceRoot":"","sources":["../../../src/modules/chess/chess.engine.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/modules/chess/dto/create-game.dto.js b/dist/modules/chess/dto/create-game.dto.js new file mode 100644 index 0000000..6a84031 --- /dev/null +++ b/dist/modules/chess/dto/create-game.dto.js @@ -0,0 +1,57 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { Type } from 'class-transformer'; +import { IsIn, IsInt, IsObject, IsOptional, IsString, Min, ValidateNested } from 'class-validator'; +class TimeControlDto { + initialSeconds; + incrementSeconds; +} +__decorate([ + Type(() => Number), + IsInt(), + Min(1), + __metadata("design:type", Number) +], TimeControlDto.prototype, "initialSeconds", void 0); +__decorate([ + IsOptional(), + Type(() => Number), + IsInt(), + Min(0), + __metadata("design:type", Number) +], TimeControlDto.prototype, "incrementSeconds", void 0); +export class CreateGameDto { + mode; + fen; + aiColor; + timeControl; +} +__decorate([ + IsOptional(), + IsIn(['pvp', 'pve']), + __metadata("design:type", String) +], CreateGameDto.prototype, "mode", void 0); +__decorate([ + IsOptional(), + IsString(), + __metadata("design:type", String) +], CreateGameDto.prototype, "fen", void 0); +__decorate([ + IsOptional(), + IsIn(['w', 'b']), + __metadata("design:type", String) +], CreateGameDto.prototype, "aiColor", void 0); +__decorate([ + IsOptional(), + IsObject(), + ValidateNested(), + Type(() => TimeControlDto), + __metadata("design:type", TimeControlDto) +], CreateGameDto.prototype, "timeControl", void 0); +//# sourceMappingURL=create-game.dto.js.map \ No newline at end of file diff --git a/dist/modules/chess/dto/create-game.dto.js.map b/dist/modules/chess/dto/create-game.dto.js.map new file mode 100644 index 0000000..d9cbf69 --- /dev/null +++ b/dist/modules/chess/dto/create-game.dto.js.map @@ -0,0 +1 @@ +{"version":3,"file":"create-game.dto.js","sourceRoot":"","sources":["../../../../src/modules/chess/dto/create-game.dto.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEnG,MAAM,cAAc;IAIlB,cAAc,CAAU;IAMxB,gBAAgB,CAAU;CAC3B;AAPC;IAHC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,KAAK,EAAE;IACP,GAAG,CAAC,CAAC,CAAC;;sDACiB;AAMxB;IAJC,UAAU,EAAE;IACZ,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,KAAK,EAAE;IACP,GAAG,CAAC,CAAC,CAAC;;wDACmB;AAG5B,MAAM,OAAO,aAAa;IAGxB,IAAI,CAAiB;IAIrB,GAAG,CAAU;IAIb,OAAO,CAAa;IAMpB,WAAW,CAAkB;CAC9B;AAfC;IAFC,UAAU,EAAE;IACZ,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;;2CACA;AAIrB;IAFC,UAAU,EAAE;IACZ,QAAQ,EAAE;;0CACE;AAIb;IAFC,UAAU,EAAE;IACZ,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;;8CACG;AAMpB;IAJC,UAAU,EAAE;IACZ,QAAQ,EAAE;IACV,cAAc,EAAE;IAChB,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC;8BACb,cAAc;kDAAC"} \ No newline at end of file diff --git a/dist/modules/chess/dto/move.dto.js b/dist/modules/chess/dto/move.dto.js new file mode 100644 index 0000000..70ff611 --- /dev/null +++ b/dist/modules/chess/dto/move.dto.js @@ -0,0 +1,39 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { IsIn, IsOptional, IsString, Length } from 'class-validator'; +export class MoveDto { + san; + from; + to; + promotion; +} +__decorate([ + IsOptional(), + IsString(), + __metadata("design:type", String) +], MoveDto.prototype, "san", void 0); +__decorate([ + IsOptional(), + IsString(), + Length(2, 2), + __metadata("design:type", String) +], MoveDto.prototype, "from", void 0); +__decorate([ + IsOptional(), + IsString(), + Length(2, 2), + __metadata("design:type", String) +], MoveDto.prototype, "to", void 0); +__decorate([ + IsOptional(), + IsIn(['q', 'r', 'b', 'n']), + __metadata("design:type", String) +], MoveDto.prototype, "promotion", void 0); +//# sourceMappingURL=move.dto.js.map \ No newline at end of file diff --git a/dist/modules/chess/dto/move.dto.js.map b/dist/modules/chess/dto/move.dto.js.map new file mode 100644 index 0000000..e18f8f2 --- /dev/null +++ b/dist/modules/chess/dto/move.dto.js.map @@ -0,0 +1 @@ +{"version":3,"file":"move.dto.js","sourceRoot":"","sources":["../../../../src/modules/chess/dto/move.dto.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,OAAO,OAAO;IAGlB,GAAG,CAAU;IAKb,IAAI,CAAU;IAKd,EAAE,CAAU;IAIZ,SAAS,CAAyB;CACnC;AAfC;IAFC,UAAU,EAAE;IACZ,QAAQ,EAAE;;oCACE;AAKb;IAHC,UAAU,EAAE;IACZ,QAAQ,EAAE;IACV,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;;qCACC;AAKd;IAHC,UAAU,EAAE;IACZ,QAAQ,EAAE;IACV,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;;mCACD;AAIZ;IAFC,UAAU,EAAE;IACZ,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;;0CACO"} \ No newline at end of file diff --git a/dist/modules/chess/dto/resign.dto.js b/dist/modules/chess/dto/resign.dto.js new file mode 100644 index 0000000..63f859f --- /dev/null +++ b/dist/modules/chess/dto/resign.dto.js @@ -0,0 +1,18 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { IsIn } from 'class-validator'; +export class ResignDto { + color; +} +__decorate([ + IsIn(['w', 'b']), + __metadata("design:type", String) +], ResignDto.prototype, "color", void 0); +//# sourceMappingURL=resign.dto.js.map \ No newline at end of file diff --git a/dist/modules/chess/dto/resign.dto.js.map b/dist/modules/chess/dto/resign.dto.js.map new file mode 100644 index 0000000..df62804 --- /dev/null +++ b/dist/modules/chess/dto/resign.dto.js.map @@ -0,0 +1 @@ +{"version":3,"file":"resign.dto.js","sourceRoot":"","sources":["../../../../src/modules/chess/dto/resign.dto.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,MAAM,OAAO,SAAS;IAEpB,KAAK,CAAa;CACnB;AADC;IADC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;;wCACC"} \ No newline at end of file diff --git a/dist/modules/users/dto/create-api-key.dto.js b/dist/modules/users/dto/create-api-key.dto.js new file mode 100644 index 0000000..4c0dfbf --- /dev/null +++ b/dist/modules/users/dto/create-api-key.dto.js @@ -0,0 +1,20 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { IsOptional, IsString, MaxLength } from 'class-validator'; +export class CreateApiKeyDto { + name; +} +__decorate([ + IsOptional(), + IsString(), + MaxLength(80), + __metadata("design:type", String) +], CreateApiKeyDto.prototype, "name", void 0); +//# sourceMappingURL=create-api-key.dto.js.map \ No newline at end of file diff --git a/dist/modules/users/dto/create-api-key.dto.js.map b/dist/modules/users/dto/create-api-key.dto.js.map new file mode 100644 index 0000000..2a993b4 --- /dev/null +++ b/dist/modules/users/dto/create-api-key.dto.js.map @@ -0,0 +1 @@ +{"version":3,"file":"create-api-key.dto.js","sourceRoot":"","sources":["../../../../src/modules/users/dto/create-api-key.dto.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,OAAO,eAAe;IAI1B,IAAI,CAAU;CACf;AADC;IAHC,UAAU,EAAE;IACZ,QAAQ,EAAE;IACV,SAAS,CAAC,EAAE,CAAC;;6CACA"} \ No newline at end of file diff --git a/dist/modules/users/users.controller.js b/dist/modules/users/users.controller.js index 16561f0..7cbda4a 100644 --- a/dist/modules/users/users.controller.js +++ b/dist/modules/users/users.controller.js @@ -13,6 +13,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) { import { Body, Controller, Delete, Get, Param, Post, Req, UseGuards } from '@nestjs/common'; import { SessionGuard } from '../../common/guards/session.guard.js'; import { UsersService } from './users.service.js'; +import { CreateApiKeyDto } from './dto/create-api-key.dto.js'; let UsersController = class UsersController { users; constructor(users) { @@ -51,7 +52,7 @@ __decorate([ __param(0, Req()), __param(1, Body()), __metadata("design:type", Function), - __metadata("design:paramtypes", [Object, Object]), + __metadata("design:paramtypes", [Object, CreateApiKeyDto]), __metadata("design:returntype", void 0) ], UsersController.prototype, "create", null); __decorate([ diff --git a/dist/modules/users/users.controller.js.map b/dist/modules/users/users.controller.js.map index e2957d0..caa2661 100644 --- a/dist/modules/users/users.controller.js.map +++ b/dist/modules/users/users.controller.js.map @@ -1 +1 @@ -{"version":3,"file":"users.controller.js","sourceRoot":"","sources":["../../../src/modules/users/users.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI3C,IAAM,eAAe,GAArB,MAAM,eAAe;IACG;IAA7B,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAGpD,EAAE,CAAQ,GAAQ;QAChB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAGK,AAAN,KAAK,CAAC,IAAI,CAAQ,GAAQ;QACxB,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9D,CAAC;IAGD,MAAM,CAAQ,GAAQ,EAAU,IAAuB;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC,CAAC;IACvE,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM,CAAQ,GAAQ,EAAe,EAAU;QACnD,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAA;AAnBC;IADC,GAAG,EAAE;IACF,WAAA,GAAG,EAAE,CAAA;;;;yCAER;AAGK;IADL,GAAG,CAAC,UAAU,CAAC;IACJ,WAAA,GAAG,EAAE,CAAA;;;;2CAEhB;AAGD;IADC,IAAI,CAAC,UAAU,CAAC;IACT,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,IAAI,EAAE,CAAA;;;;6CAE9B;AAGK;IADL,MAAM,CAAC,cAAc,CAAC;IACT,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;;;;6CAGzC;AAtBU,eAAe;IAF3B,UAAU,CAAC,IAAI,CAAC;IAChB,SAAS,CAAC,YAAY,CAAC;qCAEc,YAAY;GADrC,eAAe,CAuB3B"} \ No newline at end of file +{"version":3,"file":"users.controller.js","sourceRoot":"","sources":["../../../src/modules/users/users.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAIvD,IAAM,eAAe,GAArB,MAAM,eAAe;IACG;IAA7B,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAGpD,EAAE,CAAQ,GAAQ;QAChB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAGK,AAAN,KAAK,CAAC,IAAI,CAAQ,GAAQ;QACxB,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9D,CAAC;IAGD,MAAM,CAAQ,GAAQ,EAAU,IAAqB;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC,CAAC;IACvE,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM,CAAQ,GAAQ,EAAe,EAAU;QACnD,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAA;AAnBC;IADC,GAAG,EAAE;IACF,WAAA,GAAG,EAAE,CAAA;;;;yCAER;AAGK;IADL,GAAG,CAAC,UAAU,CAAC;IACJ,WAAA,GAAG,EAAE,CAAA;;;;2CAEhB;AAGD;IADC,IAAI,CAAC,UAAU,CAAC;IACT,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,IAAI,EAAE,CAAA;;6CAAO,eAAe;;6CAEpD;AAGK;IADL,MAAM,CAAC,cAAc,CAAC;IACT,WAAA,GAAG,EAAE,CAAA;IAAY,WAAA,KAAK,CAAC,IAAI,CAAC,CAAA;;;;6CAGzC;AAtBU,eAAe;IAF3B,UAAU,CAAC,IAAI,CAAC;IAChB,SAAS,CAAC,YAAY,CAAC;qCAEc,YAAY;GADrC,eAAe,CAuB3B"} \ No newline at end of file diff --git a/package.json b/package.json index 953587c..2825830 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "scripts": { "dev": "tsx watch src/main.ts", "build": "tsc -p tsconfig.json", - "start": "node dist/main.js" + "start": "node dist/main.js", + "test": "tsx --test test/**/*.test.ts" }, "dependencies": { "chess.js": "^1.4.0", diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 7bc720e..ec7f809 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -1,12 +1,13 @@ import { Body, Controller, Post } from '@nestjs/common'; import { AuthService } from './auth.service.js'; +import { GoogleLoginDto } from './dto/google-login.dto.js'; @Controller('auth') export class AuthController { constructor(private readonly auth: AuthService) {} @Post('google') - google(@Body() body: { idToken?: string }) { - return this.auth.loginWithGoogle(body.idToken || ''); + google(@Body() body: GoogleLoginDto) { + return this.auth.loginWithGoogle(body.idToken); } } diff --git a/src/modules/auth/dto/google-login.dto.ts b/src/modules/auth/dto/google-login.dto.ts new file mode 100644 index 0000000..fc469af --- /dev/null +++ b/src/modules/auth/dto/google-login.dto.ts @@ -0,0 +1,7 @@ +import { IsString, MinLength } from 'class-validator'; + +export class GoogleLoginDto { + @IsString() + @MinLength(10) + idToken!: string; +} diff --git a/src/modules/chess/chess.controller.ts b/src/modules/chess/chess.controller.ts index ada4bfe..85437e3 100644 --- a/src/modules/chess/chess.controller.ts +++ b/src/modules/chess/chess.controller.ts @@ -1,6 +1,9 @@ import { Body, Controller, Delete, Get, Param, Post, Query, Req, UseGuards } from '@nestjs/common'; import { ApiKeyGuard } from '../../common/guards/api-key.guard.js'; import { ChessService } from './chess.service.js'; +import { CreateGameDto } from './dto/create-game.dto.js'; +import { MoveDto } from './dto/move.dto.js'; +import { ResignDto } from './dto/resign.dto.js'; @Controller('games') @UseGuards(ApiKeyGuard) @@ -8,7 +11,7 @@ export class ChessController { constructor(private readonly chess: ChessService) {} @Post() - create(@Req() req: any, @Body() body: any) { + create(@Req() req: any, @Body() body: CreateGameDto) { return this.chess.create(req.apiUserId, body || {}); } @@ -29,7 +32,7 @@ export class ChessController { } @Post(':id/moves') - move(@Req() req: any, @Param('id') id: string, @Body() body: any) { + move(@Req() req: any, @Param('id') id: string, @Body() body: MoveDto) { return this.chess.makeMove(req.apiUserId, id, body || {}); } @@ -39,8 +42,7 @@ export class ChessController { } @Post(':id/resign') - resign(@Req() req: any, @Param('id') id: string, @Body() body: { color?: 'w' | 'b' }) { - if (!body?.color || !['w', 'b'].includes(body.color)) return { error: 'color must be w or b' }; + resign(@Req() req: any, @Param('id') id: string, @Body() body: ResignDto) { return this.chess.makeResign(req.apiUserId, id, body.color); } } diff --git a/src/modules/chess/chess.engine.ts b/src/modules/chess/chess.engine.ts index aded704..98de8df 100644 --- a/src/modules/chess/chess.engine.ts +++ b/src/modules/chess/chess.engine.ts @@ -125,7 +125,18 @@ export function move(s: GameState, payload: { san?: string; from?: string; to?: tick(s); if (s.status !== 'active') return { error: 'Game is already finished' } as const; const mover = s.chess.turn(); - const m = payload.san ? s.chess.move(payload.san) : payload.from && payload.to ? s.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) : null; + let m: ReturnType | null = null; + + try { + m = payload.san + ? s.chess.move(payload.san) + : payload.from && payload.to + ? s.chess.move({ from: payload.from, to: payload.to, promotion: payload.promotion ?? 'q' }) + : null; + } catch { + m = null; + } + if (!m) return { error: 'Illegal move' } as const; finalize(s, mover); return { move: m } as const; diff --git a/src/modules/chess/dto/create-game.dto.ts b/src/modules/chess/dto/create-game.dto.ts new file mode 100644 index 0000000..9c0f360 --- /dev/null +++ b/src/modules/chess/dto/create-game.dto.ts @@ -0,0 +1,35 @@ +import { Type } from 'class-transformer'; +import { IsIn, IsInt, IsObject, IsOptional, IsString, Min, ValidateNested } from 'class-validator'; + +class TimeControlDto { + @Type(() => Number) + @IsInt() + @Min(1) + initialSeconds!: number; + + @IsOptional() + @Type(() => Number) + @IsInt() + @Min(0) + incrementSeconds?: number; +} + +export class CreateGameDto { + @IsOptional() + @IsIn(['pvp', 'pve']) + mode?: 'pvp' | 'pve'; + + @IsOptional() + @IsString() + fen?: string; + + @IsOptional() + @IsIn(['w', 'b']) + aiColor?: 'w' | 'b'; + + @IsOptional() + @IsObject() + @ValidateNested() + @Type(() => TimeControlDto) + timeControl?: TimeControlDto; +} diff --git a/src/modules/chess/dto/move.dto.ts b/src/modules/chess/dto/move.dto.ts new file mode 100644 index 0000000..02fbc03 --- /dev/null +++ b/src/modules/chess/dto/move.dto.ts @@ -0,0 +1,21 @@ +import { IsIn, IsOptional, IsString, Length } from 'class-validator'; + +export class MoveDto { + @IsOptional() + @IsString() + san?: string; + + @IsOptional() + @IsString() + @Length(2, 2) + from?: string; + + @IsOptional() + @IsString() + @Length(2, 2) + to?: string; + + @IsOptional() + @IsIn(['q', 'r', 'b', 'n']) + promotion?: 'q' | 'r' | 'b' | 'n'; +} diff --git a/src/modules/chess/dto/resign.dto.ts b/src/modules/chess/dto/resign.dto.ts new file mode 100644 index 0000000..8493726 --- /dev/null +++ b/src/modules/chess/dto/resign.dto.ts @@ -0,0 +1,6 @@ +import { IsIn } from 'class-validator'; + +export class ResignDto { + @IsIn(['w', 'b']) + color!: 'w' | 'b'; +} diff --git a/src/modules/users/dto/create-api-key.dto.ts b/src/modules/users/dto/create-api-key.dto.ts new file mode 100644 index 0000000..5344ecd --- /dev/null +++ b/src/modules/users/dto/create-api-key.dto.ts @@ -0,0 +1,8 @@ +import { IsOptional, IsString, MaxLength } from 'class-validator'; + +export class CreateApiKeyDto { + @IsOptional() + @IsString() + @MaxLength(80) + name?: string; +} diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts index 60e9ef9..9dd6641 100644 --- a/src/modules/users/users.controller.ts +++ b/src/modules/users/users.controller.ts @@ -1,6 +1,7 @@ import { Body, Controller, Delete, Get, Param, Post, Req, UseGuards } from '@nestjs/common'; import { SessionGuard } from '../../common/guards/session.guard.js'; import { UsersService } from './users.service.js'; +import { CreateApiKeyDto } from './dto/create-api-key.dto.js'; @Controller('me') @UseGuards(SessionGuard) @@ -18,7 +19,7 @@ export class UsersController { } @Post('api-keys') - create(@Req() req: any, @Body() body: { name?: string }) { + create(@Req() req: any, @Body() body: CreateApiKeyDto) { return this.users.createApiKey(req.user.id, body?.name || 'default'); } diff --git a/test/chess.engine.test.ts b/test/chess.engine.test.ts new file mode 100644 index 0000000..4974659 --- /dev/null +++ b/test/chess.engine.test.ts @@ -0,0 +1,30 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { createState, move, legalMoves, resign } from '../src/modules/chess/chess.engine.js'; + +test('create state and perform legal move', () => { + const state = createState({ mode: 'pvp' }); + const res = move(state, { from: 'e2', to: 'e4' }); + assert.equal('error' in res, false); + assert.equal(state.chess.turn(), 'b'); +}); + +test('illegal move is rejected', () => { + const state = createState({ mode: 'pvp' }); + const res = move(state, { from: 'e2', to: 'e5' }); + assert.equal('error' in res, true); +}); + +test('legal moves from e2 include e4 at start', () => { + const state = createState({ mode: 'pvp' }); + const moves = legalMoves(state, 'e2'); + assert.ok(moves.includes('e4')); +}); + +test('resign ends game', () => { + const state = createState({ mode: 'pvp' }); + resign(state, 'w'); + assert.equal(state.status, 'finished'); + assert.equal(state.result?.reason, 'resign'); + assert.equal(state.result?.winner, 'b'); +}); From 6a12f03487cc992efe773791f204cc504307777e Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 20:14:31 +0100 Subject: [PATCH 11/59] test(modules): add auth/users/chess/health module tests and keep DTO coverage --- test/auth.module.test.ts | 43 ++++++++++++++++++++++++++++++++++++++ test/chess.module.test.ts | 28 +++++++++++++++++++++++++ test/health.module.test.ts | 12 +++++++++++ test/users.module.test.ts | 28 +++++++++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 test/auth.module.test.ts create mode 100644 test/chess.module.test.ts create mode 100644 test/health.module.test.ts create mode 100644 test/users.module.test.ts diff --git a/test/auth.module.test.ts b/test/auth.module.test.ts new file mode 100644 index 0000000..5bb688e --- /dev/null +++ b/test/auth.module.test.ts @@ -0,0 +1,43 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { AuthService } from '../src/modules/auth/auth.service.js'; + +function makeDbMock() { + const db: any = {}; + db.select = () => ({ + from: () => ({ + where: () => ({ + limit: async () => [], + }), + innerJoin: () => ({ + where: () => ({ limit: async () => [] }), + }), + }), + }); + db.insert = () => ({ values: async () => undefined }); + return { db }; +} + +test('auth service returns null for missing bearer', async () => { + const auth = new AuthService(makeDbMock() as any); + const session = await auth.sessionFromBearer(undefined); + assert.equal(session, null); +}); + +test('auth service loginWithGoogle validates token', async () => { + const prev = process.env.GOOGLE_CLIENT_ID; + process.env.GOOGLE_CLIENT_ID = 'test-client-id'; + const auth = new AuthService(makeDbMock() as any); + + (auth as any).google = { + verifyIdToken: async () => ({ + getPayload: () => ({ email: 'a@b.com', name: 'A', picture: null }), + }), + }; + + const result = await auth.loginWithGoogle('valid-id-token-123'); + assert.equal(typeof result.accessToken, 'string'); + assert.equal(result.user.email, 'a@b.com'); + + process.env.GOOGLE_CLIENT_ID = prev; +}); diff --git a/test/chess.module.test.ts b/test/chess.module.test.ts new file mode 100644 index 0000000..200439e --- /dev/null +++ b/test/chess.module.test.ts @@ -0,0 +1,28 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { ChessService } from '../src/modules/chess/chess.service.js'; +import { createState, serialize } from '../src/modules/chess/chess.engine.js'; + +function makeDbMock(row?: any) { + const db: any = { + insert: () => ({ values: async () => undefined }), + delete: () => ({ where: async () => undefined }), + update: () => ({ set: () => ({ where: async () => undefined }) }), + select: () => ({ from: () => ({ where: () => ({ limit: async () => (row ? [row] : []) }) }) }), + }; + return { db }; +} + +test('chess service create returns game id', async () => { + const svc = new ChessService(makeDbMock() as any); + const game = await svc.create('u1', { mode: 'pvp' }); + assert.equal(typeof game.id, 'string'); +}); + +test('chess service move flow works', async () => { + const state = createState({ mode: 'pvp' }); + const row = { id: 'g1', userId: 'u1', ...serialize(state) }; + const svc = new ChessService(makeDbMock(row) as any); + const out: any = await svc.makeMove('u1', 'g1', { from: 'e2', to: 'e4' }); + assert.equal(out.move.san, 'e4'); +}); diff --git a/test/health.module.test.ts b/test/health.module.test.ts new file mode 100644 index 0000000..c3147c2 --- /dev/null +++ b/test/health.module.test.ts @@ -0,0 +1,12 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { HealthController } from '../src/modules/health/health.controller.js'; + +test('health root and api shape', () => { + const h = new HealthController(); + const root = h.root(); + const api = h.api(); + assert.equal(root.ok, true); + assert.equal(typeof api.message, 'string'); + assert.ok(Array.isArray(api.chess)); +}); diff --git a/test/users.module.test.ts b/test/users.module.test.ts new file mode 100644 index 0000000..2407aef --- /dev/null +++ b/test/users.module.test.ts @@ -0,0 +1,28 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { UsersService } from '../src/modules/users/users.service.js'; + +function makeDbMock() { + const calls: any = { inserted: null, updated: null }; + const db: any = { + select: () => ({ from: () => ({ where: async () => [] }) }), + insert: () => ({ values: async (v: any) => (calls.inserted = v) }), + update: () => ({ set: (v: any) => ({ where: async () => (calls.updated = v) }) }), + }; + return { db, calls }; +} + +test('users service creates api key', async () => { + const mock = makeDbMock(); + const users = new UsersService(mock as any); + const out = await users.createApiKey('u1', 'main'); + assert.ok(out.apiKey.startsWith('chess_')); + assert.equal(mock.calls.inserted.userId, 'u1'); +}); + +test('users service revokes api key', async () => { + const mock = makeDbMock(); + const users = new UsersService(mock as any); + await users.revokeApiKey('u1', 'k1'); + assert.equal(mock.calls.updated.active, false); +}); From 3481540ffa5d6e12a3d48f05b6e71bb081b988a9 Mon Sep 17 00:00:00 2001 From: Anze Mur Date: Sun, 22 Feb 2026 20:19:54 +0100 Subject: [PATCH 12/59] feat(web): add Next.js landing page with shadcn-style UI components --- README.md | 11 +- web/.next/BUILD_ID | 1 + web/.next/app-build-manifest.json | 26 + web/.next/app-path-routes-manifest.json | 1 + web/.next/build-manifest.json | 32 + web/.next/cache/.tsbuildinfo | 1 + .../cache/webpack/client-production/0.pack | Bin 0 -> 12175093 bytes .../webpack/client-production/index.pack | Bin 0 -> 2164940 bytes .../webpack/edge-server-production/0.pack | Bin 0 -> 274 bytes .../webpack/edge-server-production/index.pack | Bin 0 -> 12020 bytes .../cache/webpack/server-production/0.pack | Bin 0 -> 8340298 bytes .../webpack/server-production/index.pack | Bin 0 -> 1242014 bytes web/.next/export-marker.json | 1 + web/.next/images-manifest.json | 1 + web/.next/next-minimal-server.js.nft.json | 1 + web/.next/next-server.js.nft.json | 1 + web/.next/package.json | 1 + web/.next/prerender-manifest.js | 1 + web/.next/prerender-manifest.json | 1 + web/.next/react-loadable-manifest.json | 1 + web/.next/required-server-files.json | 1 + web/.next/routes-manifest.json | 1 + web/.next/server/app-paths-manifest.json | 4 + web/.next/server/app/_not-found.html | 1 + web/.next/server/app/_not-found.meta | 6 + web/.next/server/app/_not-found.rsc | 9 + web/.next/server/app/_not-found/page.js | 1 + .../server/app/_not-found/page.js.nft.json | 1 + .../page_client-reference-manifest.js | 1 + web/.next/server/app/index.html | 1 + web/.next/server/app/index.meta | 5 + web/.next/server/app/index.rsc | 5 + web/.next/server/app/page.js | 16 + web/.next/server/app/page.js.nft.json | 1 + .../app/page_client-reference-manifest.js | 1 + web/.next/server/chunks/682.js | 6 + web/.next/server/chunks/819.js | 3 + web/.next/server/chunks/font-manifest.json | 1 + web/.next/server/font-manifest.json | 1 + .../server/functions-config-manifest.json | 1 + .../interception-route-rewrite-manifest.js | 1 + web/.next/server/middleware-build-manifest.js | 1 + web/.next/server/middleware-manifest.json | 6 + .../middleware-react-loadable-manifest.js | 1 + web/.next/server/next-font-manifest.js | 1 + web/.next/server/next-font-manifest.json | 1 + web/.next/server/pages-manifest.json | 1 + web/.next/server/pages/404.html | 1 + web/.next/server/pages/500.html | 1 + web/.next/server/pages/_app.js | 1 + web/.next/server/pages/_app.js.nft.json | 1 + web/.next/server/pages/_document.js | 1 + web/.next/server/pages/_document.js.nft.json | 1 + web/.next/server/pages/_error.js | 1 + web/.next/server/pages/_error.js.nft.json | 1 + web/.next/server/server-reference-manifest.js | 1 + .../server/server-reference-manifest.json | 1 + web/.next/server/webpack-runtime.js | 1 + web/.next/standalone/.next/BUILD_ID | 1 + .../standalone/.next/app-build-manifest.json | 26 + .../.next/app-path-routes-manifest.json | 1 + .../standalone/.next/build-manifest.json | 32 + web/.next/standalone/.next/package.json | 1 + .../standalone/.next/prerender-manifest.js | 1 + .../standalone/.next/prerender-manifest.json | 1 + .../.next/react-loadable-manifest.json | 1 + .../.next/required-server-files.json | 1 + .../standalone/.next/routes-manifest.json | 1 + .../.next/server/app-paths-manifest.json | 4 + .../.next/server/app/_not-found.html | 1 + .../.next/server/app/_not-found.meta | 6 + .../.next/server/app/_not-found.rsc | 9 + .../.next/server/app/_not-found/page.js | 1 + .../server/app/_not-found/page.js.nft.json | 1 + .../page_client-reference-manifest.js | 1 + .../standalone/.next/server/app/index.html | 1 + .../standalone/.next/server/app/index.meta | 5 + .../standalone/.next/server/app/index.rsc | 5 + web/.next/standalone/.next/server/app/page.js | 16 + .../.next/server/app/page.js.nft.json | 1 + .../app/page_client-reference-manifest.js | 1 + .../standalone/.next/server/chunks/682.js | 6 + .../standalone/.next/server/chunks/819.js | 3 + .../.next/server/font-manifest.json | 1 + .../.next/server/middleware-build-manifest.js | 1 + .../.next/server/middleware-manifest.json | 6 + .../middleware-react-loadable-manifest.js | 1 + .../.next/server/next-font-manifest.js | 1 + .../.next/server/next-font-manifest.json | 1 + .../.next/server/pages-manifest.json | 1 + .../standalone/.next/server/pages/404.html | 1 + .../standalone/.next/server/pages/500.html | 1 + .../standalone/.next/server/pages/_app.js | 1 + .../.next/server/pages/_app.js.nft.json | 1 + .../.next/server/pages/_document.js | 1 + .../.next/server/pages/_document.js.nft.json | 1 + .../standalone/.next/server/pages/_error.js | 1 + .../.next/server/pages/_error.js.nft.json | 1 + .../.next/server/server-reference-manifest.js | 1 + .../server/server-reference-manifest.json | 1 + .../.next/server/webpack-runtime.js | 1 + web/.next/standalone/package.json | 27 + web/.next/standalone/server.js | 38 + .../cHUzN4z_98OzBCy5GS4wM/_buildManifest.js | 1 + .../cHUzN4z_98OzBCy5GS4wM/_ssgManifest.js | 1 + .../static/chunks/23-b75664ace61c0abb.js | 2 + .../app/_not-found/page-05886c10710171db.js | 1 + .../chunks/app/layout-14e52935212f756e.js | 1 + .../chunks/app/page-ffc06cd4473239c6.js | 1 + .../chunks/fd9d1056-2821b0f0cabcd8bd.js | 1 + .../chunks/framework-f66176bb897dc684.js | 33 + .../chunks/main-app-5f908c77ac395ab4.js | 1 + .../static/chunks/main-d256c1e9f6f10fe6.js | 1 + .../chunks/pages/_app-6a626577ffa902a4.js | 1 + .../chunks/pages/_error-1be831200e60c5c0.js | 1 + .../chunks/polyfills-78c92fac7aa8fdd8.js | 1 + .../static/chunks/webpack-879f858537244e02.js | 1 + web/.next/static/css/e1bfd2d7c9f38fa3.css | 3 + web/.next/trace | 14 + web/.next/types/app/layout.ts | 79 + web/.next/types/app/page.ts | 79 + web/.next/types/package.json | 1 + web/next-env.d.ts | 5 + web/next.config.mjs | 6 + web/package-lock.json | 1654 +++++++++++++++++ web/package.json | 27 + web/postcss.config.js | 6 + web/src/app/globals.css | 19 + web/src/app/layout.tsx | 15 + web/src/app/page.tsx | 60 + web/src/components/ui/button.tsx | 29 + web/src/components/ui/card.tsx | 10 + web/src/lib/utils.ts | 6 + web/tailwind.config.ts | 23 + web/tsconfig.json | 22 + 135 files changed, 2488 insertions(+), 1 deletion(-) create mode 100644 web/.next/BUILD_ID create mode 100644 web/.next/app-build-manifest.json create mode 100644 web/.next/app-path-routes-manifest.json create mode 100644 web/.next/build-manifest.json create mode 100644 web/.next/cache/.tsbuildinfo create mode 100644 web/.next/cache/webpack/client-production/0.pack create mode 100644 web/.next/cache/webpack/client-production/index.pack create mode 100644 web/.next/cache/webpack/edge-server-production/0.pack create mode 100644 web/.next/cache/webpack/edge-server-production/index.pack create mode 100644 web/.next/cache/webpack/server-production/0.pack create mode 100644 web/.next/cache/webpack/server-production/index.pack create mode 100644 web/.next/export-marker.json create mode 100644 web/.next/images-manifest.json create mode 100644 web/.next/next-minimal-server.js.nft.json create mode 100644 web/.next/next-server.js.nft.json create mode 100644 web/.next/package.json create mode 100644 web/.next/prerender-manifest.js create mode 100644 web/.next/prerender-manifest.json create mode 100644 web/.next/react-loadable-manifest.json create mode 100644 web/.next/required-server-files.json create mode 100644 web/.next/routes-manifest.json create mode 100644 web/.next/server/app-paths-manifest.json create mode 100644 web/.next/server/app/_not-found.html create mode 100644 web/.next/server/app/_not-found.meta create mode 100644 web/.next/server/app/_not-found.rsc create mode 100644 web/.next/server/app/_not-found/page.js create mode 100644 web/.next/server/app/_not-found/page.js.nft.json create mode 100644 web/.next/server/app/_not-found/page_client-reference-manifest.js create mode 100644 web/.next/server/app/index.html create mode 100644 web/.next/server/app/index.meta create mode 100644 web/.next/server/app/index.rsc create mode 100644 web/.next/server/app/page.js create mode 100644 web/.next/server/app/page.js.nft.json create mode 100644 web/.next/server/app/page_client-reference-manifest.js create mode 100644 web/.next/server/chunks/682.js create mode 100644 web/.next/server/chunks/819.js create mode 100644 web/.next/server/chunks/font-manifest.json create mode 100644 web/.next/server/font-manifest.json create mode 100644 web/.next/server/functions-config-manifest.json create mode 100644 web/.next/server/interception-route-rewrite-manifest.js create mode 100644 web/.next/server/middleware-build-manifest.js create mode 100644 web/.next/server/middleware-manifest.json create mode 100644 web/.next/server/middleware-react-loadable-manifest.js create mode 100644 web/.next/server/next-font-manifest.js create mode 100644 web/.next/server/next-font-manifest.json create mode 100644 web/.next/server/pages-manifest.json create mode 100644 web/.next/server/pages/404.html create mode 100644 web/.next/server/pages/500.html create mode 100644 web/.next/server/pages/_app.js create mode 100644 web/.next/server/pages/_app.js.nft.json create mode 100644 web/.next/server/pages/_document.js create mode 100644 web/.next/server/pages/_document.js.nft.json create mode 100644 web/.next/server/pages/_error.js create mode 100644 web/.next/server/pages/_error.js.nft.json create mode 100644 web/.next/server/server-reference-manifest.js create mode 100644 web/.next/server/server-reference-manifest.json create mode 100644 web/.next/server/webpack-runtime.js create mode 100644 web/.next/standalone/.next/BUILD_ID create mode 100644 web/.next/standalone/.next/app-build-manifest.json create mode 100644 web/.next/standalone/.next/app-path-routes-manifest.json create mode 100644 web/.next/standalone/.next/build-manifest.json create mode 100644 web/.next/standalone/.next/package.json create mode 100644 web/.next/standalone/.next/prerender-manifest.js create mode 100644 web/.next/standalone/.next/prerender-manifest.json create mode 100644 web/.next/standalone/.next/react-loadable-manifest.json create mode 100644 web/.next/standalone/.next/required-server-files.json create mode 100644 web/.next/standalone/.next/routes-manifest.json create mode 100644 web/.next/standalone/.next/server/app-paths-manifest.json create mode 100644 web/.next/standalone/.next/server/app/_not-found.html create mode 100644 web/.next/standalone/.next/server/app/_not-found.meta create mode 100644 web/.next/standalone/.next/server/app/_not-found.rsc create mode 100644 web/.next/standalone/.next/server/app/_not-found/page.js create mode 100644 web/.next/standalone/.next/server/app/_not-found/page.js.nft.json create mode 100644 web/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js create mode 100644 web/.next/standalone/.next/server/app/index.html create mode 100644 web/.next/standalone/.next/server/app/index.meta create mode 100644 web/.next/standalone/.next/server/app/index.rsc create mode 100644 web/.next/standalone/.next/server/app/page.js create mode 100644 web/.next/standalone/.next/server/app/page.js.nft.json create mode 100644 web/.next/standalone/.next/server/app/page_client-reference-manifest.js create mode 100644 web/.next/standalone/.next/server/chunks/682.js create mode 100644 web/.next/standalone/.next/server/chunks/819.js create mode 100644 web/.next/standalone/.next/server/font-manifest.json create mode 100644 web/.next/standalone/.next/server/middleware-build-manifest.js create mode 100644 web/.next/standalone/.next/server/middleware-manifest.json create mode 100644 web/.next/standalone/.next/server/middleware-react-loadable-manifest.js create mode 100644 web/.next/standalone/.next/server/next-font-manifest.js create mode 100644 web/.next/standalone/.next/server/next-font-manifest.json create mode 100644 web/.next/standalone/.next/server/pages-manifest.json create mode 100644 web/.next/standalone/.next/server/pages/404.html create mode 100644 web/.next/standalone/.next/server/pages/500.html create mode 100644 web/.next/standalone/.next/server/pages/_app.js create mode 100644 web/.next/standalone/.next/server/pages/_app.js.nft.json create mode 100644 web/.next/standalone/.next/server/pages/_document.js create mode 100644 web/.next/standalone/.next/server/pages/_document.js.nft.json create mode 100644 web/.next/standalone/.next/server/pages/_error.js create mode 100644 web/.next/standalone/.next/server/pages/_error.js.nft.json create mode 100644 web/.next/standalone/.next/server/server-reference-manifest.js create mode 100644 web/.next/standalone/.next/server/server-reference-manifest.json create mode 100644 web/.next/standalone/.next/server/webpack-runtime.js create mode 100644 web/.next/standalone/package.json create mode 100644 web/.next/standalone/server.js create mode 100644 web/.next/static/cHUzN4z_98OzBCy5GS4wM/_buildManifest.js create mode 100644 web/.next/static/cHUzN4z_98OzBCy5GS4wM/_ssgManifest.js create mode 100644 web/.next/static/chunks/23-b75664ace61c0abb.js create mode 100644 web/.next/static/chunks/app/_not-found/page-05886c10710171db.js create mode 100644 web/.next/static/chunks/app/layout-14e52935212f756e.js create mode 100644 web/.next/static/chunks/app/page-ffc06cd4473239c6.js create mode 100644 web/.next/static/chunks/fd9d1056-2821b0f0cabcd8bd.js create mode 100644 web/.next/static/chunks/framework-f66176bb897dc684.js create mode 100644 web/.next/static/chunks/main-app-5f908c77ac395ab4.js create mode 100644 web/.next/static/chunks/main-d256c1e9f6f10fe6.js create mode 100644 web/.next/static/chunks/pages/_app-6a626577ffa902a4.js create mode 100644 web/.next/static/chunks/pages/_error-1be831200e60c5c0.js create mode 100644 web/.next/static/chunks/polyfills-78c92fac7aa8fdd8.js create mode 100644 web/.next/static/chunks/webpack-879f858537244e02.js create mode 100644 web/.next/static/css/e1bfd2d7c9f38fa3.css create mode 100644 web/.next/trace create mode 100644 web/.next/types/app/layout.ts create mode 100644 web/.next/types/app/page.ts create mode 100644 web/.next/types/package.json create mode 100644 web/next-env.d.ts create mode 100644 web/next.config.mjs create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/postcss.config.js create mode 100644 web/src/app/globals.css create mode 100644 web/src/app/layout.tsx create mode 100644 web/src/app/page.tsx create mode 100644 web/src/components/ui/button.tsx create mode 100644 web/src/components/ui/card.tsx create mode 100644 web/src/lib/utils.ts create mode 100644 web/tailwind.config.ts create mode 100644 web/tsconfig.json diff --git a/README.md b/README.md index 87fc485..9cf565b 100644 --- a/README.md +++ b/README.md @@ -22,12 +22,21 @@ GOOGLE_CLIENT_ID=your-google-client-id.apps.googleusercontent.com PORT=3000 ``` -## Run +## Run API ```bash npm install npm run dev ``` +## Landing page (shadcn-style UI) +A separate Next.js app lives in `web/`. + +```bash +cd web +npm install +npm run dev +``` + ## Auth routes - `POST /auth/google` with `{ idToken }` - `GET /me` (Bearer session token) diff --git a/web/.next/BUILD_ID b/web/.next/BUILD_ID new file mode 100644 index 0000000..f1a4269 --- /dev/null +++ b/web/.next/BUILD_ID @@ -0,0 +1 @@ +cHUzN4z_98OzBCy5GS4wM \ No newline at end of file diff --git a/web/.next/app-build-manifest.json b/web/.next/app-build-manifest.json new file mode 100644 index 0000000..92dfa73 --- /dev/null +++ b/web/.next/app-build-manifest.json @@ -0,0 +1,26 @@ +{ + "pages": { + "/_not-found/page": [ + "static/chunks/webpack-879f858537244e02.js", + "static/chunks/fd9d1056-2821b0f0cabcd8bd.js", + "static/chunks/23-b75664ace61c0abb.js", + "static/chunks/main-app-5f908c77ac395ab4.js", + "static/chunks/app/_not-found/page-05886c10710171db.js" + ], + "/layout": [ + "static/chunks/webpack-879f858537244e02.js", + "static/chunks/fd9d1056-2821b0f0cabcd8bd.js", + "static/chunks/23-b75664ace61c0abb.js", + "static/chunks/main-app-5f908c77ac395ab4.js", + "static/css/e1bfd2d7c9f38fa3.css", + "static/chunks/app/layout-14e52935212f756e.js" + ], + "/page": [ + "static/chunks/webpack-879f858537244e02.js", + "static/chunks/fd9d1056-2821b0f0cabcd8bd.js", + "static/chunks/23-b75664ace61c0abb.js", + "static/chunks/main-app-5f908c77ac395ab4.js", + "static/chunks/app/page-ffc06cd4473239c6.js" + ] + } +} \ No newline at end of file diff --git a/web/.next/app-path-routes-manifest.json b/web/.next/app-path-routes-manifest.json new file mode 100644 index 0000000..92a8d84 --- /dev/null +++ b/web/.next/app-path-routes-manifest.json @@ -0,0 +1 @@ +{"/_not-found/page":"/_not-found","/page":"/"} \ No newline at end of file diff --git a/web/.next/build-manifest.json b/web/.next/build-manifest.json new file mode 100644 index 0000000..6a3ae1d --- /dev/null +++ b/web/.next/build-manifest.json @@ -0,0 +1,32 @@ +{ + "polyfillFiles": [ + "static/chunks/polyfills-78c92fac7aa8fdd8.js" + ], + "devFiles": [], + "ampDevFiles": [], + "lowPriorityFiles": [ + "static/cHUzN4z_98OzBCy5GS4wM/_buildManifest.js", + "static/cHUzN4z_98OzBCy5GS4wM/_ssgManifest.js" + ], + "rootMainFiles": [ + "static/chunks/webpack-879f858537244e02.js", + "static/chunks/fd9d1056-2821b0f0cabcd8bd.js", + "static/chunks/23-b75664ace61c0abb.js", + "static/chunks/main-app-5f908c77ac395ab4.js" + ], + "pages": { + "/_app": [ + "static/chunks/webpack-879f858537244e02.js", + "static/chunks/framework-f66176bb897dc684.js", + "static/chunks/main-d256c1e9f6f10fe6.js", + "static/chunks/pages/_app-6a626577ffa902a4.js" + ], + "/_error": [ + "static/chunks/webpack-879f858537244e02.js", + "static/chunks/framework-f66176bb897dc684.js", + "static/chunks/main-d256c1e9f6f10fe6.js", + "static/chunks/pages/_error-1be831200e60c5c0.js" + ] + }, + "ampFirstPages": [] +} \ No newline at end of file diff --git a/web/.next/cache/.tsbuildinfo b/web/.next/cache/.tsbuildinfo new file mode 100644 index 0000000..3c80cbc --- /dev/null +++ b/web/.next/cache/.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/typescript/lib/lib.esnext.error.d.ts","../../node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/next/dist/styled-jsx/types/css.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/next/dist/styled-jsx/types/index.d.ts","../../node_modules/next/dist/styled-jsx/types/macro.d.ts","../../node_modules/next/dist/styled-jsx/types/style.d.ts","../../node_modules/next/dist/styled-jsx/types/global.d.ts","../../node_modules/next/dist/shared/lib/amp.d.ts","../../node_modules/next/amp.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/next/dist/server/get-page-files.d.ts","../../node_modules/@types/react/canary.d.ts","../../node_modules/@types/react/experimental.d.ts","../../node_modules/next/dist/compiled/webpack/webpack.d.ts","../../node_modules/next/dist/server/config.d.ts","../../node_modules/next/dist/lib/load-custom-routes.d.ts","../../node_modules/next/dist/shared/lib/image-config.d.ts","../../node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","../../node_modules/next/dist/server/body-streams.d.ts","../../node_modules/next/dist/server/future/route-kind.d.ts","../../node_modules/next/dist/server/future/route-definitions/route-definition.d.ts","../../node_modules/next/dist/server/future/route-matches/route-match.d.ts","../../node_modules/next/dist/client/components/app-router-headers.d.ts","../../node_modules/next/dist/server/request-meta.d.ts","../../node_modules/next/dist/server/lib/revalidate.d.ts","../../node_modules/next/dist/server/config-shared.d.ts","../../node_modules/next/dist/server/base-http/index.d.ts","../../node_modules/next/dist/server/api-utils/index.d.ts","../../node_modules/next/dist/server/node-environment.d.ts","../../node_modules/next/dist/server/require-hook.d.ts","../../node_modules/next/dist/server/node-polyfill-crypto.d.ts","../../node_modules/next/dist/lib/page-types.d.ts","../../node_modules/next/dist/build/analysis/get-page-static-info.d.ts","../../node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","../../node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","../../node_modules/next/dist/server/render-result.d.ts","../../node_modules/next/dist/server/future/helpers/i18n-provider.d.ts","../../node_modules/next/dist/server/web/next-url.d.ts","../../node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","../../node_modules/next/dist/server/web/spec-extension/cookies.d.ts","../../node_modules/next/dist/server/web/spec-extension/request.d.ts","../../node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","../../node_modules/next/dist/server/web/spec-extension/response.d.ts","../../node_modules/next/dist/server/web/types.d.ts","../../node_modules/next/dist/lib/setup-exception-listeners.d.ts","../../node_modules/next/dist/lib/constants.d.ts","../../node_modules/next/dist/build/index.d.ts","../../node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","../../node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","../../node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","../../node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","../../node_modules/next/dist/server/base-http/node.d.ts","../../node_modules/next/dist/server/font-utils.d.ts","../../node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","../../node_modules/next/dist/server/future/route-modules/route-module.d.ts","../../node_modules/next/dist/server/load-components.d.ts","../../node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","../../node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","../../node_modules/next/dist/server/future/route-definitions/locale-route-definition.d.ts","../../node_modules/next/dist/server/future/route-definitions/pages-route-definition.d.ts","../../node_modules/next/dist/shared/lib/mitt.d.ts","../../node_modules/next/dist/client/with-router.d.ts","../../node_modules/next/dist/client/router.d.ts","../../node_modules/next/dist/client/route-loader.d.ts","../../node_modules/next/dist/client/page-loader.d.ts","../../node_modules/next/dist/shared/lib/bloom-filter.d.ts","../../node_modules/next/dist/shared/lib/router/router.d.ts","../../node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","../../node_modules/next/dist/server/future/route-definitions/app-page-route-definition.d.ts","../../node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","../../node_modules/next/dist/shared/lib/constants.d.ts","../../node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","../../node_modules/next/dist/build/page-extensions-type.d.ts","../../node_modules/next/dist/build/webpack/loaders/next-app-loader.d.ts","../../node_modules/next/dist/server/lib/app-dir-module.d.ts","../../node_modules/next/dist/server/response-cache/types.d.ts","../../node_modules/next/dist/server/response-cache/index.d.ts","../../node_modules/next/dist/server/lib/incremental-cache/index.d.ts","../../node_modules/next/dist/client/components/hooks-server-context.d.ts","../../node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","../../node_modules/next/dist/client/components/static-generation-async-storage-instance.d.ts","../../node_modules/next/dist/client/components/static-generation-async-storage.external.d.ts","../../node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","../../node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","../../node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","../../node_modules/next/dist/client/components/request-async-storage-instance.d.ts","../../node_modules/next/dist/client/components/request-async-storage.external.d.ts","../../node_modules/next/dist/server/app-render/create-error-handler.d.ts","../../node_modules/next/dist/server/app-render/app-render.d.ts","../../node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","../../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.d.ts","../../node_modules/next/dist/server/future/route-modules/app-page/module.compiled.d.ts","../../node_modules/@types/react/jsx-runtime.d.ts","../../node_modules/next/dist/client/components/error-boundary.d.ts","../../node_modules/next/dist/client/components/router-reducer/create-initial-router-state.d.ts","../../node_modules/next/dist/client/components/app-router.d.ts","../../node_modules/next/dist/client/components/layout-router.d.ts","../../node_modules/next/dist/client/components/render-from-template-context.d.ts","../../node_modules/next/dist/client/components/action-async-storage-instance.d.ts","../../node_modules/next/dist/client/components/action-async-storage.external.d.ts","../../node_modules/next/dist/client/components/client-page.d.ts","../../node_modules/next/dist/client/components/search-params.d.ts","../../node_modules/next/dist/client/components/not-found-boundary.d.ts","../../node_modules/next/dist/server/app-render/rsc/preloads.d.ts","../../node_modules/next/dist/server/app-render/rsc/postpone.d.ts","../../node_modules/next/dist/server/app-render/rsc/taint.d.ts","../../node_modules/next/dist/server/app-render/entry-base.d.ts","../../node_modules/next/dist/build/templates/app-page.d.ts","../../node_modules/next/dist/server/future/route-modules/app-page/module.d.ts","../../node_modules/next/dist/server/app-render/types.d.ts","../../node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","../../node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","../../node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","../../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.d.ts","../../node_modules/next/dist/server/future/route-modules/pages/module.compiled.d.ts","../../node_modules/next/dist/build/templates/pages.d.ts","../../node_modules/next/dist/server/future/route-modules/pages/module.d.ts","../../node_modules/next/dist/server/render.d.ts","../../node_modules/next/dist/server/future/route-definitions/pages-api-route-definition.d.ts","../../node_modules/next/dist/server/future/route-matches/pages-api-route-match.d.ts","../../node_modules/next/dist/server/future/route-matchers/route-matcher.d.ts","../../node_modules/next/dist/server/future/route-matcher-providers/route-matcher-provider.d.ts","../../node_modules/next/dist/server/future/route-matcher-managers/route-matcher-manager.d.ts","../../node_modules/next/dist/server/future/normalizers/normalizer.d.ts","../../node_modules/next/dist/server/future/normalizers/locale-route-normalizer.d.ts","../../node_modules/next/dist/server/future/normalizers/request/pathname-normalizer.d.ts","../../node_modules/next/dist/server/future/normalizers/request/suffix.d.ts","../../node_modules/next/dist/server/future/normalizers/request/rsc.d.ts","../../node_modules/next/dist/server/future/normalizers/request/prefix.d.ts","../../node_modules/next/dist/server/future/normalizers/request/postponed.d.ts","../../node_modules/next/dist/server/future/normalizers/request/action.d.ts","../../node_modules/next/dist/server/future/normalizers/request/prefetch-rsc.d.ts","../../node_modules/next/dist/server/future/normalizers/request/next-data.d.ts","../../node_modules/next/dist/server/base-server.d.ts","../../node_modules/next/dist/server/image-optimizer.d.ts","../../node_modules/next/dist/server/next-server.d.ts","../../node_modules/next/dist/lib/coalesced-function.d.ts","../../node_modules/next/dist/server/lib/router-utils/types.d.ts","../../node_modules/next/dist/trace/types.d.ts","../../node_modules/next/dist/trace/trace.d.ts","../../node_modules/next/dist/trace/shared.d.ts","../../node_modules/next/dist/trace/index.d.ts","../../node_modules/next/dist/build/load-jsconfig.d.ts","../../node_modules/next/dist/build/webpack-config.d.ts","../../node_modules/next/dist/build/webpack/plugins/define-env-plugin.d.ts","../../node_modules/next/dist/build/swc/index.d.ts","../../node_modules/next/dist/server/dev/parse-version-info.d.ts","../../node_modules/next/dist/server/dev/hot-reloader-types.d.ts","../../node_modules/next/dist/telemetry/storage.d.ts","../../node_modules/next/dist/server/lib/types.d.ts","../../node_modules/next/dist/server/lib/render-server.d.ts","../../node_modules/next/dist/server/lib/router-server.d.ts","../../node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","../../node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","../../node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","../../node_modules/next/dist/server/lib/dev-bundler-service.d.ts","../../node_modules/next/dist/server/dev/static-paths-worker.d.ts","../../node_modules/next/dist/server/dev/next-dev-server.d.ts","../../node_modules/next/dist/server/next.d.ts","../../node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","../../node_modules/next/dist/lib/metadata/types/extra-types.d.ts","../../node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","../../node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","../../node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","../../node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","../../node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","../../node_modules/next/types/index.d.ts","../../node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","../../node_modules/@next/env/dist/index.d.ts","../../node_modules/next/dist/shared/lib/utils.d.ts","../../node_modules/next/dist/pages/_app.d.ts","../../node_modules/next/app.d.ts","../../node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","../../node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","../../node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","../../node_modules/next/cache.d.ts","../../node_modules/next/dist/shared/lib/runtime-config.external.d.ts","../../node_modules/next/config.d.ts","../../node_modules/next/dist/pages/_document.d.ts","../../node_modules/next/document.d.ts","../../node_modules/next/dist/shared/lib/dynamic.d.ts","../../node_modules/next/dynamic.d.ts","../../node_modules/next/dist/pages/_error.d.ts","../../node_modules/next/error.d.ts","../../node_modules/next/dist/shared/lib/head.d.ts","../../node_modules/next/head.d.ts","../../node_modules/next/dist/client/components/draft-mode.d.ts","../../node_modules/next/dist/client/components/headers.d.ts","../../node_modules/next/headers.d.ts","../../node_modules/next/dist/shared/lib/get-img-props.d.ts","../../node_modules/next/dist/client/image-component.d.ts","../../node_modules/next/dist/shared/lib/image-external.d.ts","../../node_modules/next/image.d.ts","../../node_modules/next/dist/client/link.d.ts","../../node_modules/next/link.d.ts","../../node_modules/next/dist/client/components/redirect-status-code.d.ts","../../node_modules/next/dist/client/components/redirect.d.ts","../../node_modules/next/dist/client/components/not-found.d.ts","../../node_modules/next/dist/client/components/navigation.react-server.d.ts","../../node_modules/next/dist/client/components/navigation.d.ts","../../node_modules/next/navigation.d.ts","../../node_modules/next/router.d.ts","../../node_modules/next/dist/client/script.d.ts","../../node_modules/next/script.d.ts","../../node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","../../node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","../../node_modules/next/dist/server/web/spec-extension/image-response.d.ts","../../node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","../../node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","../../node_modules/next/dist/compiled/@vercel/og/types.d.ts","../../node_modules/next/server.d.ts","../../node_modules/next/types/global.d.ts","../../node_modules/next/types/compiled.d.ts","../../node_modules/next/index.d.ts","../../node_modules/next/image-types/global.d.ts","../../next-env.d.ts","../../node_modules/source-map-js/source-map.d.ts","../../node_modules/postcss/lib/previous-map.d.ts","../../node_modules/postcss/lib/input.d.ts","../../node_modules/postcss/lib/css-syntax-error.d.ts","../../node_modules/postcss/lib/declaration.d.ts","../../node_modules/postcss/lib/root.d.ts","../../node_modules/postcss/lib/warning.d.ts","../../node_modules/postcss/lib/lazy-result.d.ts","../../node_modules/postcss/lib/no-work-result.d.ts","../../node_modules/postcss/lib/processor.d.ts","../../node_modules/postcss/lib/result.d.ts","../../node_modules/postcss/lib/document.d.ts","../../node_modules/postcss/lib/rule.d.ts","../../node_modules/postcss/lib/node.d.ts","../../node_modules/postcss/lib/comment.d.ts","../../node_modules/postcss/lib/container.d.ts","../../node_modules/postcss/lib/at-rule.d.ts","../../node_modules/postcss/lib/list.d.ts","../../node_modules/postcss/lib/postcss.d.ts","../../node_modules/postcss/lib/postcss.d.mts","../../node_modules/tailwindcss/types/generated/corepluginlist.d.ts","../../node_modules/tailwindcss/types/generated/colors.d.ts","../../node_modules/tailwindcss/types/config.d.ts","../../node_modules/tailwindcss/types/index.d.ts","../../tailwind.config.ts","../../node_modules/clsx/clsx.d.mts","../../node_modules/tailwind-merge/dist/types.d.ts","../../src/lib/utils.ts","../../src/app/layout.tsx","../../node_modules/lucide-react/dist/lucide-react.d.ts","../../node_modules/class-variance-authority/dist/types.d.ts","../../node_modules/class-variance-authority/dist/index.d.ts","../../src/components/ui/button.tsx","../../src/components/ui/card.tsx","../../src/app/page.tsx","../types/app/layout.ts","../types/app/page.ts","../../../node_modules/@types/validator/lib/isboolean.d.ts","../../../node_modules/@types/validator/lib/isemail.d.ts","../../../node_modules/@types/validator/lib/isfqdn.d.ts","../../../node_modules/@types/validator/lib/isiban.d.ts","../../../node_modules/@types/validator/lib/isiso31661alpha2.d.ts","../../../node_modules/@types/validator/lib/isiso4217.d.ts","../../../node_modules/@types/validator/lib/isiso6391.d.ts","../../../node_modules/@types/validator/lib/istaxid.d.ts","../../../node_modules/@types/validator/lib/isurl.d.ts","../../../node_modules/@types/validator/index.d.ts"],"fileIdsList":[[99,147,164,165,447,448,449,450,451,452,453,454,455],[99,147,164,165],[99,147,164,165,359,438],[99,147,164,165,359,444],[99,147,164,165,407,408],[99,144,145,147,164,165],[99,146,147,164,165],[147,164,165],[99,147,152,164,165,182],[99,147,148,153,158,164,165,167,179,190],[99,147,148,149,158,164,165,167],[94,95,96,99,147,164,165],[99,147,150,164,165,191],[99,147,151,152,159,164,165,168],[99,147,152,164,165,179,187],[99,147,153,155,158,164,165,167],[99,146,147,154,164,165],[99,147,155,156,164,165],[99,147,157,158,164,165],[99,146,147,158,164,165],[99,147,158,159,160,164,165,179,190],[99,147,158,159,160,164,165,174,179,182],[99,140,147,155,158,161,164,165,167,179,190],[99,147,158,159,161,162,164,165,167,179,187,190],[99,147,161,163,164,165,179,187,190],[97,98,99,100,101,102,103,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196],[99,147,158,164,165],[99,147,164,165,166,190],[99,147,155,158,164,165,167,179],[99,147,164,165,168],[99,147,164,165,169],[99,146,147,164,165,170],[99,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196],[99,147,164,165,172],[99,147,164,165,173],[99,147,158,164,165,174,175],[99,147,164,165,174,176,191,193],[99,147,159,164,165],[99,147,158,164,165,179,180,182],[99,147,164,165,181,182],[99,147,164,165,179,180],[99,147,164,165,182],[99,147,164,165,183],[99,144,147,164,165,179,184,190],[99,147,158,164,165,185,186],[99,147,164,165,185,186],[99,147,152,164,165,167,179,187],[99,147,164,165,188],[99,147,164,165,167,189],[99,147,161,164,165,173,190],[99,147,152,164,165,191],[99,147,164,165,179,192],[99,147,164,165,166,193],[99,147,164,165,194],[99,140,147,164,165],[99,140,147,158,160,164,165,170,179,182,190,192,193,195],[99,147,164,165,179,196],[87,91,99,147,164,165,200,360,403],[87,91,99,147,164,165,199,360,403],[84,85,86,99,147,164,165],[87,99,147,164,165],[99,147,164,165,435,440],[99,147,164,165,435],[92,99,147,164,165],[99,147,164,165,364],[99,147,164,165,366,367,368],[99,147,164,165,370],[99,147,164,165,203,213,219,221,360],[99,147,164,165,203,210,212,215,233],[99,147,164,165,213],[99,147,164,165,213,338],[99,147,164,165,267,285,300,406],[99,147,164,165,308],[99,147,164,165,203,213,220,253,263,335,336,406],[99,147,164,165,220,406],[99,147,164,165,213,263,264,265,406],[99,147,164,165,213,220,253,406],[99,147,164,165,406],[99,147,164,165,203,220,221,406],[99,147,164,165,293],[99,146,147,164,165,197,292],[87,99,147,164,165,286,287,288,305,306],[87,99,147,164,165,286],[99,147,164,165,276],[99,147,164,165,275,277,380],[87,99,147,164,165,286,287,303],[99,147,164,165,282,306,392],[99,147,164,165,390,391],[99,147,164,165,227,389],[99,147,164,165,279],[99,146,147,164,165,197,227,275,276,277,278],[87,99,147,164,165,303,305,306],[99,147,164,165,303,305],[99,147,164,165,303,304,306],[99,147,164,165,173,197],[99,147,164,165,274],[99,146,147,164,165,197,212,214,270,271,272,273],[87,99,147,164,165,204,383],[87,99,147,164,165,190,197],[87,99,147,164,165,220,251],[87,99,147,164,165,220],[99,147,164,165,249,254],[87,99,147,164,165,250,363],[87,91,99,147,161,164,165,197,199,200,360,401,402],[99,147,164,165,360],[99,147,164,165,202],[99,147,164,165,353,354,355,356,357,358],[99,147,164,165,355],[87,99,147,164,165,250,286,363],[87,99,147,164,165,286,361,363],[87,99,147,164,165,286,363],[99,147,161,164,165,197,214,363],[99,147,161,164,165,197,211,212,223,241,274,279,280,302,303],[99,147,164,165,271,274,279,287,289,290,291,293,294,295,296,297,298,299,406],[99,147,164,165,272],[87,99,147,164,165,173,197,212,213,241,243,245,270,302,306,360,406],[99,147,161,164,165,197,214,215,227,228,275],[99,147,161,164,165,197,213,215],[99,147,161,164,165,179,197,211,214,215],[99,147,161,164,165,173,190,197,211,212,213,214,215,220,223,224,234,235,237,240,241,243,244,245,269,270,303,311,313,316,318,321,323,324,325,326],[99,147,161,164,165,179,197],[99,147,164,165,203,204,205,211,212,360,363,406],[99,147,161,164,165,179,190,197,208,337,339,340,406],[99,147,164,165,173,190,197,208,211,214,231,235,237,238,239,243,270,316,327,329,335,349,350],[99,147,164,165,213,217,270],[99,147,164,165,211,213],[99,147,164,165,224,317],[99,147,164,165,319,320],[99,147,164,165,319],[99,147,164,165,317],[99,147,164,165,319,322],[99,147,164,165,207,208],[99,147,164,165,207,246],[99,147,164,165,207],[99,147,164,165,209,224,315],[99,147,164,165,314],[99,147,164,165,208,209],[99,147,164,165,209,312],[99,147,164,165,208],[99,147,164,165,302],[99,147,161,164,165,197,211,223,242,261,267,281,284,301,303],[99,147,164,165,255,256,257,258,259,260,282,283,306,361],[99,147,164,165,310],[99,147,161,164,165,197,211,223,242,247,307,309,311,360,363],[99,147,161,164,165,190,197,204,211,213,269],[99,147,164,165,266],[99,147,161,164,165,197,343,348],[99,147,164,165,234,269,363],[99,147,164,165,331,335,349,352],[99,147,161,164,165,217,335,343,344,352],[99,147,164,165,203,213,234,244,346],[99,147,161,164,165,197,213,220,244,330,331,341,342,345,347],[99,147,164,165,198,241,242,360,363],[99,147,161,164,165,173,190,197,209,211,212,214,217,222,223,231,234,235,237,238,239,240,243,245,269,270,313,327,328,363],[99,147,161,164,165,197,211,213,217,329,351],[99,147,161,164,165,197,212,214],[87,99,147,161,164,165,173,197,202,204,211,212,215,223,240,241,243,245,310,360,363],[99,147,161,164,165,173,190,197,206,209,210,214],[99,147,164,165,207,268],[99,147,161,164,165,197,207,212,223],[99,147,161,164,165,197,213,224],[99,147,161,164,165,197],[99,147,164,165,227],[99,147,164,165,226],[99,147,164,165,228],[99,147,164,165,213,225,227,231],[99,147,164,165,213,225,227],[99,147,161,164,165,197,206,213,214,220,228,229,230],[87,99,147,164,165,303,304,305],[99,147,164,165,262],[87,99,147,164,165,204],[87,99,147,164,165,237],[87,99,147,164,165,198,240,245,360,363],[99,147,164,165,204,383,384],[87,99,147,164,165,254],[87,99,147,164,165,173,190,197,202,248,250,252,253,363],[99,147,164,165,214,220,237],[99,147,164,165,236],[87,99,147,159,161,164,165,173,197,202,254,263,360,361,362],[83,87,88,89,90,99,147,164,165,199,200,360,403],[99,147,152,164,165],[99,147,164,165,332,333,334],[99,147,164,165,332],[99,147,164,165,372],[99,147,164,165,374],[99,147,164,165,376],[99,147,164,165,378],[99,147,164,165,381],[99,147,164,165,385],[91,93,99,147,164,165,360,365,369,371,373,375,377,379,382,386,388,394,395,397,404,405,406],[99,147,164,165,387],[99,147,164,165,393],[99,147,164,165,250],[99,147,164,165,396],[99,146,147,164,165,228,229,230,231,398,399,400,403],[99,147,164,165,197],[87,91,99,147,161,163,164,165,173,197,199,200,202,215,352,359,363,403],[99,147,164,165,425],[99,147,164,165,423,425],[99,147,164,165,414,422,423,424,426,428],[99,147,164,165,412],[99,147,164,165,415,420,425,428],[99,147,164,165,411,428],[99,147,164,165,415,416,419,420,421,428],[99,147,164,165,415,416,417,419,420,428],[99,147,164,165,412,413,414,415,416,420,421,422,424,425,426,428],[99,147,164,165,428],[99,147,164,165,410,412,413,414,415,416,417,419,420,421,422,423,424,425,426,427],[99,147,164,165,410,428],[99,147,164,165,415,417,418,420,421,428],[99,147,164,165,419,428],[99,147,164,165,420,421,425,428],[99,147,164,165,413,423],[99,147,164,165,430,431],[99,147,164,165,429,432],[99,112,116,147,164,165,190],[99,112,147,164,165,179,190],[99,107,147,164,165],[99,109,112,147,164,165,187,190],[99,147,164,165,167,187],[99,107,147,164,165,197],[99,109,112,147,164,165,167,190],[99,104,105,108,111,147,158,164,165,179,190],[99,112,119,147,164,165],[99,104,110,147,164,165],[99,112,133,134,147,164,165],[99,108,112,147,164,165,182,190,197],[99,133,147,164,165,197],[99,106,107,147,164,165,197],[99,112,147,164,165],[99,106,107,108,109,110,111,112,113,114,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,134,135,136,137,138,139,147,164,165],[99,112,127,147,164,165],[99,112,119,120,147,164,165],[99,110,112,120,121,147,164,165],[99,111,147,164,165],[99,104,107,112,147,164,165],[99,112,116,120,121,147,164,165],[99,116,147,164,165],[99,110,112,115,147,164,165,190],[99,104,109,112,119,147,164,165],[99,147,164,165,179],[99,107,112,133,147,164,165,195,197],[99,147,164,165,439,442,443],[87,99,147,164,165,437,441],[87,99,147,164,165,437],[99,147,164,165,435,436],[99,147,164,165,433]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","signature":false,"impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","signature":false,"impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","signature":false,"impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","signature":false,"impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","signature":false,"impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","signature":false,"impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","signature":false,"impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","signature":false,"impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","signature":false,"impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","signature":false,"impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","signature":false,"impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29","signature":false,"impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","signature":false,"impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","signature":false,"impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","signature":false,"impliedFormat":1},{"version":"8bc6c94ff4f2af1f4023b7bb2379b08d3d7dd80c698c9f0b07431ea16101f05f","signature":false,"impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","signature":false,"impliedFormat":1},{"version":"57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","signature":false,"impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","signature":false,"impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","signature":false,"impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","signature":false,"impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","signature":false,"impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","signature":false,"impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","signature":false,"impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","signature":false,"impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","signature":false,"impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","signature":false,"impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","signature":false,"impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","signature":false,"impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","signature":false,"impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","signature":false,"impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","signature":false,"impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","signature":false,"impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","signature":false,"impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","signature":false,"impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","signature":false,"impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","signature":false,"impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","signature":false,"impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","signature":false,"impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","signature":false,"impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","signature":false,"impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","signature":false,"impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","signature":false,"impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","signature":false,"impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","signature":false,"impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","signature":false,"impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","signature":false,"impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","signature":false,"impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","signature":false,"impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","signature":false,"impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","signature":false,"impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","signature":false,"impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","signature":false,"impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","signature":false,"impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","signature":false,"impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","signature":false,"impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","signature":false,"impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","signature":false,"impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","signature":false,"impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","signature":false,"impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","signature":false,"impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","signature":false,"impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","signature":false,"impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","signature":false,"impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","signature":false,"impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","signature":false,"impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","signature":false,"impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","signature":false,"impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","signature":false,"impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","signature":false,"impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","signature":false,"impliedFormat":1},{"version":"f949f7f6c7802a338039cfc2156d1fe285cdd1e092c64437ebe15ae8edc854e0","signature":false,"impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","signature":false,"impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","signature":false,"impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","signature":false,"impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","signature":false,"impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","signature":false,"impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","signature":false,"impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","signature":false,"impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","signature":false,"impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","signature":false,"impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","signature":false,"impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","signature":false,"impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","signature":false,"impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","signature":false,"impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","signature":false,"impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","signature":false,"impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","signature":false,"impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","signature":false,"impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","signature":false,"impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","signature":false,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","signature":false,"impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","signature":false,"impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","signature":false,"impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","signature":false,"impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","signature":false,"impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","signature":false,"impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","signature":false,"impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","signature":false,"impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","signature":false,"impliedFormat":1},{"version":"8caa5c86be1b793cd5f599e27ecb34252c41e011980f7d61ae4989a149ff6ccc","signature":false,"impliedFormat":1},{"version":"f9fd93190acb1ffe0bc0fb395df979452f8d625071e9ffc8636e4dfb86ab2508","signature":false,"impliedFormat":1},{"version":"5f41fd8732a89e940c58ce22206e3df85745feb8983e2b4c6257fb8cbb118493","signature":false,"impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","signature":false,"impliedFormat":1},{"version":"cfe4ef4710c3786b6e23dae7c086c70b4f4835a2e4d77b75d39f9046106e83d3","signature":false,"impliedFormat":1},{"version":"cbea99888785d49bb630dcbb1613c73727f2b5a2cf02e1abcaab7bcf8d6bf3c5","signature":false,"impliedFormat":1},{"version":"98817124fd6c4f60e0b935978c207309459fb71ab112cf514f26f333bf30830e","signature":false,"impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","signature":false,"impliedFormat":1},{"version":"2dad084c67e649f0f354739ec7df7c7df0779a28a4f55c97c6b6883ae850d1ce","signature":false,"impliedFormat":1},{"version":"fa5bbc7ab4130dd8cdc55ea294ec39f76f2bc507a0f75f4f873e38631a836ca7","signature":false,"impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","signature":false,"impliedFormat":1},{"version":"cf86de1054b843e484a3c9300d62fbc8c97e77f168bbffb131d560ca0474d4a8","signature":false,"impliedFormat":1},{"version":"196c960b12253fde69b204aa4fbf69470b26daf7a430855d7f94107a16495ab0","signature":false,"impliedFormat":1},{"version":"fb760b3dded1fadb56c3dde1992b6068bb64d65c4d60d65dc93659f5f44ccddf","signature":false,"impliedFormat":1},{"version":"bf24f6d35f7318e246010ffe9924395893c4e96d34324cde77151a73f078b9ad","signature":false,"impliedFormat":1},{"version":"596ccf4070268c4f5a8c459d762d8a934fa9b9317c7bf7a953e921bc9d78ce3c","signature":false,"impliedFormat":1},{"version":"10595c7ff5094dd5b6a959ccb1c00e6a06441b4e10a87bc09c15f23755d34439","signature":false,"impliedFormat":1},{"version":"9620c1ff645afb4a9ab4044c85c26676f0a93e8c0e4b593aea03a89ccb47b6d0","signature":false,"impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","signature":false,"impliedFormat":1},{"version":"a9af0e608929aaf9ce96bd7a7b99c9360636c31d73670e4af09a09950df97841","signature":false,"impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","signature":false,"impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","signature":false,"impliedFormat":1},{"version":"08ed0b3f0166787f84a6606f80aa3b1388c7518d78912571b203817406e471da","signature":false,"impliedFormat":1},{"version":"47e5af2a841356a961f815e7c55d72554db0c11b4cba4d0caab91f8717846a94","signature":false,"impliedFormat":1},{"version":"9a1a0dc84fecc111e83281743f003e1ae9048e0f83c2ae2028d17bc58fd93cc7","signature":false,"impliedFormat":1},{"version":"f5f541902bf7ae0512a177295de9b6bcd6809ea38307a2c0a18bfca72212f368","signature":false,"impliedFormat":1},{"version":"e8da637cbd6ed1cf6c36e9424f6bcee4515ca2c677534d4006cbd9a05f930f0c","signature":false,"impliedFormat":1},{"version":"ca1b882a105a1972f82cc58e3be491e7d750a1eb074ffd13b198269f57ed9e1b","signature":false,"impliedFormat":1},{"version":"fc3e1c87b39e5ba1142f27ec089d1966da168c04a859a4f6aab64dceae162c2b","signature":false,"impliedFormat":1},{"version":"3867ca0e9757cc41e04248574f4f07b8f9e3c0c2a796a5eb091c65bfd2fc8bdb","signature":false,"impliedFormat":1},{"version":"61888522cec948102eba94d831c873200aa97d00d8989fdfd2a3e0ee75ec65a2","signature":false,"impliedFormat":1},{"version":"4e10622f89fea7b05dd9b52fb65e1e2b5cbd96d4cca3d9e1a60bb7f8a9cb86a1","signature":false,"impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","signature":false,"impliedFormat":1},{"version":"59bf32919de37809e101acffc120596a9e45fdbab1a99de5087f31fdc36e2f11","signature":false,"impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","signature":false,"impliedFormat":1},{"version":"3df3abb3e7c1a74ab419f95500a998b55dd9bc985e295de96ff315dd94c7446f","signature":false,"impliedFormat":1},{"version":"c40c848daad198266370c1c72a7a8c3d18d2f50727c7859fcfefd3ff69a7f288","signature":false,"impliedFormat":1},{"version":"ac60bbee0d4235643cc52b57768b22de8c257c12bd8c2039860540cab1fa1d82","signature":false,"impliedFormat":1},{"version":"973b59a17aaa817eb205baf6c132b83475a5c0a44e8294a472af7793b1817e89","signature":false,"impliedFormat":1},{"version":"ada39cbb2748ab2873b7835c90c8d4620723aedf323550e8489f08220e477c7f","signature":false,"impliedFormat":1},{"version":"6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","signature":false,"impliedFormat":1},{"version":"8dba67056cbb27628e9b9a1cba8e57036d359dceded0725c72a3abe4b6c79cd4","signature":false,"impliedFormat":1},{"version":"70f3814c457f54a7efe2d9ce9d2686de9250bb42eb7f4c539bd2280a42e52d33","signature":false,"impliedFormat":1},{"version":"5cbd32af037805215112472e35773bad9d4e03f0e72b1129a0d0c12d9cd63cc7","signature":false,"impliedFormat":1},{"version":"ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","signature":false,"impliedFormat":1},{"version":"afcb759e8e3ad6549d5798820697002bc07bdd039899fad0bf522e7e8a9f5866","signature":false,"impliedFormat":1},{"version":"f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","signature":false,"impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","signature":false,"impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","signature":false,"impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","signature":false,"impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","signature":false,"impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","signature":false,"impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","signature":false,"impliedFormat":1},{"version":"566e5fb812082f8cf929c6727d40924843246cf19ee4e8b9437a6315c4792b03","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","signature":false,"impliedFormat":1},{"version":"903e299a28282fa7b714586e28409ed73c3b63f5365519776bf78e8cf173db36","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","signature":false,"impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","signature":false,"impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","signature":false,"impliedFormat":1},{"version":"dd3900b24a6a8745efeb7ad27629c0f8a626470ac229c1d73f1fe29d67e44dca","signature":false,"impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","signature":false,"impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","signature":false,"impliedFormat":1},{"version":"ec29be0737d39268696edcec4f5e97ce26f449fa9b7afc2f0f99a86def34a418","signature":false,"impliedFormat":1},{"version":"68a06fb972b2c7e671bf090dc5a5328d22ba07d771376c3d9acd9e7ed786a9db","signature":false,"impliedFormat":1},{"version":"ec6cba1c02c675e4dd173251b156792e8d3b0c816af6d6ad93f1a55d674591aa","signature":false,"impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","signature":false,"impliedFormat":1},{"version":"d729408dfde75b451530bcae944cf89ee8277e2a9df04d1f62f2abfd8b03c1e1","signature":false,"impliedFormat":1},{"version":"e15d3c84d5077bb4a3adee4c791022967b764dc41cb8fa3cfa44d4379b2c95f5","signature":false,"impliedFormat":1},{"version":"78244a2a8ab1080e0dd8fc3633c204c9a4be61611d19912f4b157f7ef7367049","signature":false,"impliedFormat":1},{"version":"e1fc1a1045db5aa09366be2b330e4ce391550041fc3e925f60998ca0b647aa97","signature":false,"impliedFormat":1},{"version":"73636e5e138db738b0e1e00c17bcd688c45eead3798d0d585e0bd9ff98262ebe","signature":false,"impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","signature":false,"impliedFormat":1},{"version":"31fb49ef3aa3d76f0beb644984e01eab0ea222372ea9b49bb6533be5722d756c","signature":false,"impliedFormat":1},{"version":"33cd131e1461157e3e06b06916b5176e7a8ec3fce15a5cfe145e56de744e07d2","signature":false,"impliedFormat":1},{"version":"889ef863f90f4917221703781d9723278db4122d75596b01c429f7c363562b86","signature":false,"impliedFormat":1},{"version":"3556cfbab7b43da96d15a442ddbb970e1f2fc97876d055b6555d86d7ac57dae5","signature":false,"impliedFormat":1},{"version":"437751e0352c6e924ddf30e90849f1d9eb00ca78c94d58d6a37202ec84eb8393","signature":false,"impliedFormat":1},{"version":"48e8af7fdb2677a44522fd185d8c87deff4d36ee701ea003c6c780b1407a1397","signature":false,"impliedFormat":1},{"version":"d11308de5a36c7015bb73adb5ad1c1bdaac2baede4cc831a05cf85efa3cc7f2f","signature":false,"impliedFormat":1},{"version":"8c9f19c480c747b6d8067c53fcc3cef641619029afb0a903672daed3f5acaed2","signature":false,"impliedFormat":1},{"version":"f9812cfc220ecf7557183379531fa409acd249b9e5b9a145d0d52b76c20862de","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"7b068371563d0396a065ed64b049cffeb4eed89ad433ae7730fc31fb1e00ebf3","signature":false,"impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","signature":false,"impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","signature":false,"impliedFormat":1},{"version":"680793958f6a70a44c8d9ae7d46b7a385361c69ac29dcab3ed761edce1c14ab8","signature":false,"impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","signature":false,"impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","signature":false,"impliedFormat":1},{"version":"913ddbba170240070bd5921b8f33ea780021bdf42fbdfcd4fcb2691b1884ddde","signature":false,"impliedFormat":1},{"version":"74c105214ddd747037d2a75da6588ec8aa1882f914e1f8a312c528f86feca2b9","signature":false,"impliedFormat":1},{"version":"5fe23bd829e6be57d41929ac374ee9551ccc3c44cee893167b7b5b77be708014","signature":false,"impliedFormat":1},{"version":"4d85f80132e24d9a5b5c5e0734e4ecd6878d8c657cc990ecc70845ef384ca96f","signature":false,"impliedFormat":1},{"version":"438c7513b1df91dcef49b13cd7a1c4720f91a36e88c1df731661608b7c055f10","signature":false,"impliedFormat":1},{"version":"cf185cc4a9a6d397f416dd28cca95c227b29f0f27b160060a95c0e5e36cda865","signature":false,"impliedFormat":1},{"version":"0086f3e4ad898fd7ca56bb223098acfacf3fa065595182aaf0f6c4a6a95e6fbd","signature":false,"impliedFormat":1},{"version":"efaa078e392f9abda3ee8ade3f3762ab77f9c50b184e6883063a911742a4c96a","signature":false,"impliedFormat":1},{"version":"54a8bb487e1dc04591a280e7a673cdfb272c83f61e28d8a64cf1ac2e63c35c51","signature":false,"impliedFormat":1},{"version":"021a9498000497497fd693dd315325484c58a71b5929e2bbb91f419b04b24cea","signature":false,"impliedFormat":1},{"version":"9385cdc09850950bc9b59cca445a3ceb6fcca32b54e7b626e746912e489e535e","signature":false,"impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","signature":false,"impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","signature":false,"impliedFormat":1},{"version":"84124384abae2f6f66b7fbfc03862d0c2c0b71b826f7dbf42c8085d31f1d3f95","signature":false,"impliedFormat":1},{"version":"63a8e96f65a22604eae82737e409d1536e69a467bb738bec505f4f97cce9d878","signature":false,"impliedFormat":1},{"version":"3fd78152a7031315478f159c6a5872c712ece6f01212c78ea82aef21cb0726e2","signature":false,"impliedFormat":1},{"version":"3a6ed8e1d630cfa1f7edf0dc46a6e20ca6c714dbe754409699008571dfe473a6","signature":false,"impliedFormat":1},{"version":"512fc15cca3a35b8dbbf6e23fe9d07e6f87ad03c895acffd3087ce09f352aad0","signature":false,"impliedFormat":1},{"version":"9a0946d15a005832e432ea0cd4da71b57797efb25b755cc07f32274296d62355","signature":false,"impliedFormat":1},{"version":"a52ff6c0a149e9f370372fc3c715d7f2beee1f3bab7980e271a7ab7d313ec677","signature":false,"impliedFormat":1},{"version":"fd933f824347f9edd919618a76cdb6a0c0085c538115d9a287fa0c7f59957ab3","signature":false,"impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","signature":false,"impliedFormat":1},{"version":"6a1aa3e55bdc50503956c5cd09ae4cd72e3072692d742816f65c66ca14f4dfdd","signature":false,"impliedFormat":1},{"version":"ab75cfd9c4f93ffd601f7ca1753d6a9d953bbedfbd7a5b3f0436ac8a1de60dfa","signature":false,"impliedFormat":1},{"version":"59c68235df3905989afa0399381c1198313aaaf1ed387f57937eb616625dff15","signature":false,"impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","signature":false,"impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","signature":false,"impliedFormat":1},{"version":"1364f64d2fb03bbb514edc42224abd576c064f89be6a990136774ecdd881a1da","signature":false,"impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","signature":false,"impliedFormat":1},{"version":"950fb67a59be4c2dbe69a5786292e60a5cb0e8612e0e223537784c731af55db1","signature":false,"impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","signature":false,"impliedFormat":1},{"version":"07ca44e8d8288e69afdec7a31fa408ce6ab90d4f3d620006701d5544646da6aa","signature":false,"impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","signature":false,"impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","signature":false,"impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","signature":false,"impliedFormat":1},{"version":"4e4475fba4ed93a72f167b061cd94a2e171b82695c56de9899275e880e06ba41","signature":false,"impliedFormat":1},{"version":"97c5f5d580ab2e4decd0a3135204050f9b97cd7908c5a8fbc041eadede79b2fa","signature":false,"impliedFormat":1},{"version":"c99a3a5f2215d5b9d735aa04cec6e61ed079d8c0263248e298ffe4604d4d0624","signature":false,"impliedFormat":1},{"version":"49b2375c586882c3ac7f57eba86680ff9742a8d8cb2fe25fe54d1b9673690d41","signature":false,"impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","signature":false,"impliedFormat":1},{"version":"b98ce74c2bc49a9b79408f049c49909190c747b0462e78f91c09618da86bae53","signature":false,"impliedFormat":1},{"version":"3ecfccf916fea7c6c34394413b55eb70e817a73e39b4417d6573e523784e3f8e","signature":false,"impliedFormat":1},{"version":"c05bc82af01e673afc99bdffd4ebafde22ab027d63e45be9e1f1db3bc39e2fc0","signature":false,"impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","signature":false,"impliedFormat":1},{"version":"f416c9c3eee9d47ff49132c34f96b9180e50485d435d5748f0e8b72521d28d2e","signature":false,"impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","signature":false,"impliedFormat":1},{"version":"14e5cdec6f8ae82dfd0694e64903a0a54abdfe37e1d966de3d4128362acbf35f","signature":false,"impliedFormat":1},{"version":"bbc183d2d69f4b59fd4dd8799ffdf4eb91173d1c4ad71cce91a3811c021bf80c","signature":false,"impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","signature":false,"impliedFormat":1},{"version":"8dbc4134a4b3623fc476be5f36de35c40f2768e2e3d9ed437e0d5f1c4cd850f6","signature":false,"impliedFormat":1},{"version":"4e06330a84dec7287f7ebdd64978f41a9f70a668d3b5edc69d5d4a50b9b376bb","signature":false,"impliedFormat":1},{"version":"65bfa72967fbe9fc33353e1ac03f0480aa2e2ea346d61ff3ea997dfd850f641a","signature":false,"impliedFormat":1},{"version":"8f88c6be9803fe5aaa80b00b27f230c824d4b8a33856b865bea5793cb52bb797","signature":false,"impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","signature":false,"impliedFormat":1},{"version":"872caaa31423f4345983d643e4649fb30f548e9883a334d6d1c5fff68ede22d4","signature":false,"impliedFormat":1},{"version":"94404c4a878fe291e7578a2a80264c6f18e9f1933fbb57e48f0eb368672e389c","signature":false,"impliedFormat":1},{"version":"5c1b7f03aa88be854bc15810bfd5bd5a1943c5a7620e1c53eddd2a013996343e","signature":false,"impliedFormat":1},{"version":"09dfc64fcd6a2785867f2368419859a6cc5a8d4e73cbe2538f205b1642eb0f51","signature":false,"impliedFormat":1},{"version":"bcf6f0a323653e72199105a9316d91463ad4744c546d1271310818b8cef7c608","signature":false,"impliedFormat":1},{"version":"01aa917531e116485beca44a14970834687b857757159769c16b228eb1e49c5f","signature":false,"impliedFormat":1},{"version":"351475f9c874c62f9b45b1f0dc7e2704e80dfd5f1af83a3a9f841f9dfe5b2912","signature":false,"impliedFormat":1},{"version":"ac457ad39e531b7649e7b40ee5847606eac64e236efd76c5d12db95bf4eacd17","signature":false,"impliedFormat":1},{"version":"187a6fdbdecb972510b7555f3caacb44b58415da8d5825d03a583c4b73fde4cf","signature":false,"impliedFormat":1},{"version":"d4c3250105a612202289b3a266bb7e323db144f6b9414f9dea85c531c098b811","signature":false,"impliedFormat":1},{"version":"95b444b8c311f2084f0fb51c616163f950fb2e35f4eaa07878f313a2d36c98a4","signature":false,"impliedFormat":1},{"version":"741067675daa6d4334a2dc80a4452ca3850e89d5852e330db7cb2b5f867173b1","signature":false,"impliedFormat":1},{"version":"f8acecec1114f11690956e007d920044799aefeb3cece9e7f4b1f8a1d542b2c9","signature":false,"impliedFormat":1},{"version":"131b1475d2045f20fb9f43b7aa6b7cb51f25250b5e4c6a1d4aa3cf4dd1a68793","signature":false,"impliedFormat":1},{"version":"3a17f09634c50cce884721f54fd9e7b98e03ac505889c560876291fcf8a09e90","signature":false,"impliedFormat":1},{"version":"32531dfbb0cdc4525296648f53b2b5c39b64282791e2a8c765712e49e6461046","signature":false,"impliedFormat":1},{"version":"0ce1b2237c1c3df49748d61568160d780d7b26693bd9feb3acb0744a152cd86d","signature":false,"impliedFormat":1},{"version":"e489985388e2c71d3542612685b4a7db326922b57ac880f299da7026a4e8a117","signature":false,"impliedFormat":1},{"version":"e1437c5f191edb7a494f7bbbc033b97d72d42e054d521402ee194ac5b6b7bf49","signature":false,"impliedFormat":1},{"version":"04d3aad777b6af5bd000bfc409907a159fe77e190b9d368da4ba649cdc28d39e","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"fd1b9d883b9446f1e1da1e1033a6a98995c25fbf3c10818a78960e2f2917d10c","signature":false,"impliedFormat":1},{"version":"19252079538942a69be1645e153f7dbbc1ef56b4f983c633bf31fe26aeac32cd","signature":false,"impliedFormat":1},{"version":"bc11f3ac00ac060462597add171220aed628c393f2782ac75dd29ff1e0db871c","signature":false,"impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","signature":false,"impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","signature":false,"impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","signature":false,"impliedFormat":1},{"version":"3b0b1d352b8d2e47f1c4df4fb0678702aee071155b12ef0185fce9eb4fa4af1e","signature":false,"impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","signature":false,"impliedFormat":1},{"version":"a344403e7a7384e0e7093942533d309194ad0a53eca2a3100c0b0ab4d3932773","signature":false,"impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","signature":false,"impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","signature":false,"impliedFormat":1},{"version":"bb18bf4a61a17b4a6199eb3938ecfa4a59eb7c40843ad4a82b975ab6f7e3d925","signature":false,"impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","signature":false,"impliedFormat":1},{"version":"e9b6fc05f536dfddcdc65dbcf04e09391b1c968ab967382e48924f5cb90d88e1","signature":false,"impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","signature":false,"impliedFormat":1},{"version":"2b664c3cc544d0e35276e1fb2d4989f7d4b4027ffc64da34ec83a6ccf2e5c528","signature":false,"impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","signature":false,"impliedFormat":1},{"version":"3cd8f0464e0939b47bfccbb9bb474a6d87d57210e304029cd8eb59c63a81935d","signature":false,"impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","signature":false,"impliedFormat":1},{"version":"3026abd48e5e312f2328629ede6e0f770d21c3cd32cee705c450e589d015ee09","signature":false,"impliedFormat":1},{"version":"8b140b398a6afbd17cc97c38aea5274b2f7f39b1ae5b62952cfe65bf493e3e75","signature":false,"impliedFormat":1},{"version":"7663d2c19ce5ef8288c790edba3d45af54e58c84f1b37b1249f6d49d962f3d91","signature":false,"impliedFormat":1},{"version":"30112425b2cf042fca1c79c19e35f88f44bfb2e97454527528cd639dd1a460ca","signature":false,"impliedFormat":1},{"version":"00bd6ebe607246b45296aa2b805bd6a58c859acecda154bfa91f5334d7c175c6","signature":false,"impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","signature":false,"impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","signature":false,"impliedFormat":1},{"version":"504f37ba38bfea8394ec4f397c9a2ade7c78055e41ef5a600073b515c4fd0fc9","signature":false,"impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","signature":false,"impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","signature":false,"impliedFormat":1},{"version":"87ac2fb61e629e777f4d161dff534c2023ee15afd9cb3b1589b9b1f014e75c58","signature":false,"impliedFormat":1},{"version":"13c8b4348db91e2f7d694adc17e7438e6776bc506d5c8f5de9ad9989707fa3fe","signature":false,"impliedFormat":1},{"version":"3c1051617aa50b38e9efaabce25e10a5dd9b1f42e372ef0e8a674076a68742ed","signature":false,"impliedFormat":1},{"version":"07a3e20cdcb0f1182f452c0410606711fbea922ca76929a41aacb01104bc0d27","signature":false,"impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","signature":false,"impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","signature":false,"impliedFormat":1},{"version":"4cd4b6b1279e9d744a3825cbd7757bbefe7f0708f3f1069179ad535f19e8ed2c","signature":false,"impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","signature":false,"impliedFormat":1},{"version":"c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","signature":false,"impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","signature":false,"impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","signature":false,"impliedFormat":1},{"version":"b95a6f019095dd1d48fd04965b50dfd63e5743a6e75478343c46d2582a5132bf","signature":false,"impliedFormat":99},{"version":"c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","signature":false,"impliedFormat":99},{"version":"b97cb5616d2ab82a98ec9ada7b9e9cabb1f5da880ec50ea2b8dc5baa4cbf3c16","signature":false,"impliedFormat":99},{"version":"d23df9ff06ae8bf1dcb7cc933e97ae7da418ac77749fecee758bb43a8d69f840","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"040c71dde2c406f869ad2f41e8d4ce579cc60c8dbe5aa0dd8962ac943b846572","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"3586f5ea3cc27083a17bd5c9059ede9421d587286d5a47f4341a4c2d00e4fa91","signature":false,"impliedFormat":1},{"version":"a6df929821e62f4719551f7955b9f42c0cd53c1370aec2dd322e24196a7dfe33","signature":false,"impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","signature":false,"impliedFormat":1},{"version":"9269d492817e359123ac64c8205e5d05dab63d71a3a7a229e68b5d9a0e8150bf","signature":false},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","signature":false,"impliedFormat":1},{"version":"8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","signature":false,"impliedFormat":1},{"version":"333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","signature":false,"impliedFormat":1},{"version":"e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","signature":false,"impliedFormat":1},{"version":"459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","signature":false,"impliedFormat":1},{"version":"4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","signature":false,"impliedFormat":1},{"version":"7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","signature":false,"impliedFormat":1},{"version":"70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","signature":false,"impliedFormat":1},{"version":"d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","signature":false,"impliedFormat":1},{"version":"a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","signature":false,"impliedFormat":1},{"version":"b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","signature":false,"impliedFormat":1},{"version":"644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","signature":false,"impliedFormat":1},{"version":"dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","signature":false,"impliedFormat":1},{"version":"1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","signature":false,"impliedFormat":1},{"version":"47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","signature":false,"impliedFormat":1},{"version":"4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","signature":false,"impliedFormat":1},{"version":"331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","signature":false,"impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","signature":false,"impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","signature":false,"impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","signature":false,"impliedFormat":99},{"version":"b558c9a18ea4e6e4157124465c3ef1063e64640da139e67be5edb22f534f2f08","signature":false,"impliedFormat":1},{"version":"01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692","signature":false,"impliedFormat":1},{"version":"b0dee183d4e65cf938242efaf3d833c6b645afb35039d058496965014f158141","signature":false,"impliedFormat":1},{"version":"c0bbbf84d3fbd85dd60d040c81e8964cc00e38124a52e9c5dcdedf45fea3f213","signature":false,"impliedFormat":1},{"version":"96123b63ccfca8ed14e7f301b668b37253bc1e834c2e5d4aefdbff20ea605621","signature":false},{"version":"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d","signature":false,"impliedFormat":99},{"version":"26c57c9f839e6d2048d6c25e81f805ba0ca32a28fd4d824399fd5456c9b0575b","signature":false,"impliedFormat":1},{"version":"746e4d9beb1a5b6f0e047ec19d5f1c542c9f8117f4ea7c80d7b9bd0fe2128e91","signature":false},{"version":"d8173d1c64b2befc13137efcc1c5d000609737613fb5a643450682d76a5769fc","signature":false},{"version":"5f0258de817857a01db5d1ab9aed63c4e88af54b62829fd4777c4325fa8ab2ef","signature":false,"impliedFormat":1},{"version":"2fbe402f0ee5aa8ab55367f88030f79d46211c0a0f342becaa9f648bf8534e9d","signature":false,"impliedFormat":1},{"version":"b94258ef37e67474ac5522e9c519489a55dcb3d4a8f645e335fc68ea2215fe88","signature":false,"impliedFormat":1},{"version":"07d64a28d2315d4ec17c5a2ef81424b4ce0a4001af717a020ccf0b6027d47c8b","signature":false},{"version":"95c5c86ab047db228d0e7f6c9f76f37ea9c781a6791c1c404fe7d994ffe36cb0","signature":false},{"version":"57c9c29ed5167e020c962e2d9322e21904bb093cb01627f7965e053ddfa973ba","signature":false},{"version":"f7299ca972f5ef17d8d8fd5d7752818e874b23326e646b5d7dd0192b64356285","signature":false},{"version":"5c261bb129ea596df315ad96c0b5d303fe476bcca382242843535e90068ae79e","signature":false},{"version":"c6cdcd12d577032b84eed1de4d2de2ae343463701a25961b202cff93989439fb","signature":false,"impliedFormat":1},{"version":"3dc633586d48fcd04a4f8acdbf7631b8e4a334632f252d5707e04b299069721e","signature":false,"impliedFormat":1},{"version":"3322858f01c0349ee7968a5ce93a1ca0c154c4692aa8f1721dc5192a9191a168","signature":false,"impliedFormat":1},{"version":"6dde0a77adad4173a49e6de4edd6ef70f5598cbebb5c80d76c111943854636ca","signature":false,"impliedFormat":1},{"version":"09acacae732e3cc67a6415026cfae979ebe900905500147a629837b790a366b3","signature":false,"impliedFormat":1},{"version":"f7b622759e094a3c2e19640e0cb233b21810d2762b3e894ef7f415334125eb22","signature":false,"impliedFormat":1},{"version":"99236ea5c4c583082975823fd19bcce6a44963c5c894e20384bc72e7eccf9b03","signature":false,"impliedFormat":1},{"version":"f6688a02946a3f7490aa9e26d76d1c97a388e42e77388cbab010b69982c86e9e","signature":false,"impliedFormat":1},{"version":"9f642953aba68babd23de41de85d4e97f0c39ef074cb8ab8aa7d55237f62aff6","signature":false,"impliedFormat":1},{"version":"159d95163a0ed369175ae7838fa21a9e9e703de5fdb0f978721293dd403d9f4a","signature":false,"impliedFormat":1}],"root":[409,434,437,438,[442,446]],"options":{"allowJs":false,"composite":false,"declarationMap":false,"emitDeclarationOnly":false,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./.tsbuildinfo"},"referencedMap":[[456,1],[447,2],[448,2],[449,2],[450,2],[451,2],[452,2],[453,2],[454,2],[455,2],[445,3],[446,4],[409,5],[362,2],[144,6],[145,6],[146,7],[99,8],[147,9],[148,10],[149,11],[94,2],[97,12],[95,2],[96,2],[150,13],[151,14],[152,15],[153,16],[154,17],[155,18],[156,18],[157,19],[158,20],[159,21],[160,22],[100,2],[98,2],[161,23],[162,24],[163,25],[197,26],[164,27],[165,2],[166,28],[167,29],[168,30],[169,31],[170,32],[171,33],[172,34],[173,35],[174,36],[175,36],[176,37],[177,2],[178,38],[179,39],[181,40],[180,41],[182,42],[183,43],[184,44],[185,45],[186,46],[187,47],[188,48],[189,49],[190,50],[191,51],[192,52],[193,53],[194,54],[101,2],[102,2],[103,2],[141,55],[142,2],[143,2],[195,56],[196,57],[86,2],[199,58],[200,59],[84,2],[87,60],[286,61],[441,62],[440,63],[435,2],[85,2],[439,61],[93,64],[365,65],[369,66],[371,67],[220,68],[234,69],[336,70],[265,2],[339,71],[301,72],[309,73],[337,74],[221,75],[264,2],[266,76],[338,77],[241,78],[222,79],[245,78],[235,78],[205,78],[292,80],[293,81],[210,2],[289,82],[294,83],[380,84],[287,83],[381,85],[271,2],[290,86],[393,87],[392,88],[296,83],[391,2],[389,2],[390,89],[291,61],[278,90],[279,91],[288,92],[304,93],[305,94],[295,95],[273,96],[274,97],[384,98],[387,99],[252,100],[251,101],[250,102],[396,61],[249,103],[226,2],[399,2],[402,2],[401,61],[403,104],[201,2],[330,2],[233,105],[203,106],[353,2],[354,2],[356,2],[359,107],[355,2],[357,108],[358,108],[219,2],[232,2],[364,109],[372,110],[376,111],[215,112],[281,113],[280,2],[272,96],[300,114],[298,115],[297,2],[299,2],[303,116],[276,117],[214,118],[239,119],[327,120],[206,121],[213,122],[202,70],[341,123],[351,124],[340,2],[350,125],[240,2],[224,126],[318,127],[317,2],[324,128],[326,129],[319,130],[323,131],[325,128],[322,130],[321,128],[320,130],[261,132],[246,132],[312,133],[247,133],[208,134],[207,2],[316,135],[315,136],[314,137],[313,138],[209,139],[285,140],[302,141],[284,142],[308,143],[310,144],[307,142],[242,139],[198,2],[328,145],[267,146],[349,147],[270,148],[344,149],[212,2],[345,150],[347,151],[348,152],[331,2],[343,121],[243,153],[329,154],[352,155],[216,2],[218,2],[223,156],[311,157],[211,158],[217,2],[269,159],[268,160],[225,161],[277,162],[275,163],[227,164],[229,165],[400,2],[228,166],[230,167],[367,2],[366,2],[368,2],[398,2],[231,168],[283,61],[92,2],[306,169],[253,2],[263,170],[374,61],[383,171],[260,61],[378,83],[259,172],[361,173],[258,171],[204,2],[385,174],[256,61],[257,61],[248,2],[262,2],[255,175],[254,176],[244,177],[238,95],[346,2],[237,178],[236,2],[370,2],[282,61],[363,179],[83,2],[91,180],[88,61],[89,2],[90,2],[342,181],[335,182],[334,2],[333,183],[332,2],[373,184],[375,185],[377,186],[379,187],[382,188],[408,189],[386,189],[407,190],[388,191],[394,192],[395,193],[397,194],[404,195],[406,2],[405,196],[360,197],[426,198],[424,199],[425,200],[413,201],[414,199],[421,202],[412,203],[417,204],[427,2],[418,205],[423,206],[429,207],[428,208],[411,209],[419,210],[420,211],[415,212],[422,198],[416,213],[410,2],[436,2],[432,214],[431,2],[430,2],[433,215],[81,2],[82,2],[13,2],[14,2],[16,2],[15,2],[2,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[3,2],[25,2],[26,2],[4,2],[27,2],[31,2],[28,2],[29,2],[30,2],[32,2],[33,2],[34,2],[5,2],[35,2],[36,2],[37,2],[38,2],[6,2],[42,2],[39,2],[40,2],[41,2],[43,2],[7,2],[44,2],[49,2],[50,2],[45,2],[46,2],[47,2],[48,2],[8,2],[54,2],[51,2],[52,2],[53,2],[55,2],[9,2],[56,2],[57,2],[58,2],[60,2],[59,2],[61,2],[62,2],[10,2],[63,2],[64,2],[65,2],[11,2],[66,2],[67,2],[68,2],[69,2],[70,2],[1,2],[71,2],[72,2],[12,2],[76,2],[74,2],[79,2],[78,2],[73,2],[77,2],[75,2],[80,2],[119,216],[129,217],[118,216],[139,218],[110,219],[109,220],[138,196],[132,221],[137,222],[112,223],[126,224],[111,225],[135,226],[107,227],[106,196],[136,228],[108,229],[113,230],[114,2],[117,230],[104,2],[140,231],[130,232],[121,233],[122,234],[124,235],[120,236],[123,237],[133,196],[115,238],[116,239],[125,240],[105,241],[128,232],[127,230],[131,2],[134,242],[438,61],[444,243],[442,244],[443,245],[437,246],[434,247]],"changeFileSet":[456,447,448,449,450,451,452,453,454,455,445,446,409,362,144,145,146,99,147,148,149,94,97,95,96,150,151,152,153,154,155,156,157,158,159,160,100,98,161,162,163,197,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,181,180,182,183,184,185,186,187,188,189,190,191,192,193,194,101,102,103,141,142,143,195,196,86,199,200,84,87,286,441,440,435,85,439,93,365,369,371,220,234,336,265,339,301,309,337,221,264,266,338,241,222,245,235,205,292,293,210,289,294,380,287,381,271,290,393,392,296,391,389,390,291,278,279,288,304,305,295,273,274,384,387,252,251,250,396,249,226,399,402,401,403,201,330,233,203,353,354,356,359,355,357,358,219,232,364,372,376,215,281,280,272,300,298,297,299,303,276,214,239,327,206,213,202,341,351,340,350,240,224,318,317,324,326,319,323,325,322,321,320,261,246,312,247,208,207,316,315,314,313,209,285,302,284,308,310,307,242,198,328,267,349,270,344,212,345,347,348,331,343,243,329,352,216,218,223,311,211,217,269,268,225,277,275,227,229,400,228,230,367,366,368,398,231,283,92,306,253,263,374,383,260,378,259,361,258,204,385,256,257,248,262,255,254,244,238,346,237,236,370,282,363,83,91,88,89,90,342,335,334,333,332,373,375,377,379,382,408,386,407,388,394,395,397,404,406,405,360,426,424,425,413,414,421,412,417,427,418,423,429,428,411,419,420,415,422,416,410,436,432,431,430,433,81,82,13,14,16,15,2,17,18,19,20,21,22,23,24,3,25,26,4,27,31,28,29,30,32,33,34,5,35,36,37,38,6,42,39,40,41,43,7,44,49,50,45,46,47,48,8,54,51,52,53,55,9,56,57,58,60,59,61,62,10,63,64,65,11,66,67,68,69,70,1,71,72,12,76,74,79,78,73,77,75,80,119,129,118,139,110,109,138,132,137,112,126,111,135,107,106,136,108,113,114,117,104,140,130,121,122,124,120,123,133,115,116,125,105,128,127,131,134,438,444,442,443,437,434],"version":"5.9.3"} \ No newline at end of file diff --git a/web/.next/cache/webpack/client-production/0.pack b/web/.next/cache/webpack/client-production/0.pack new file mode 100644 index 0000000000000000000000000000000000000000..6a227cbc4a6cb16c1deb8606d79751c72d1759d9 GIT binary patch literal 12175093 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%0D93dFZdX{z{iiE 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

n!uzXL@$ zj*hOm6O?~k7UsI2zyb?TlA|i9A z6f0s%*zcu^nBSukL?VwrKpjgv_x5S9iw^uso!>q{$h$;c0*%an^Vcu=>)6Ki8#Zig zTeo5Tx|iL-l>_3|T#TV0+vPYHrrE0B1$`G)SOrYMzGKeCQ&&7Ib+P&hr3rmw?grGQq_AGQrk& zc@@rU0rE}(>o>3ghiz|{SK<6QK)xhky#h8j>BD!jS7H0Rrn+Jk&KXdGH1Lx=N8slq z`xSKHnaiK)RXEoHWJtiSH?SKFY{$|aUWIcIASD62R={K|cdXpuRX8^z^)`XH(L?O4 z+v!y}wO|q?2l(zQ9J8*1}dCIa7O)V%=iWPel5Nw2=&tT*KrXful^Y(%nM$y zD3?5l|B`-&iW%VJYdGXxCQo^AX`Km^I$Ra%*?MPm&OSUfgQ-ZE0=pp8O385@{ z_Py4u``D}>gMuw>zn^9Q?PH6fTyaze3aXuS7i;itKHkH}@8Pjbp7M}RIzQ^9Imz#` z`twnJT!P`*G(U5bU!t<7ELteHn`Ia#4iGKQ@NHt#$V|2baHNj`)s zYw*%#@;dorzVIp1I@iC?xBh(*`}d!ve}9Mlo7~EV%d|Oy|B^TI@g_cA&IEbNqiT;Z z6jAaEJkTS3XKPQsmzm$k$NTyC03RRZgY`{5%*UVd@ew{g%E!m}_%lBKoR5$5@fUn7 z<5W3y59yo3K#YIpCf`FR)c*kg&P(3NX1t9hzJrfHHlbbH>ImvG`_xJG-U-yUj z>$&pF<}YK|Cru25%b9jR({JJ9bLarhIWP^x*RKD0@-VyQ^V%)eF$b+%PRUA?0$u%Fc&z~jNnexcVLLQmT*)c&n!45e>9pD~nj2P7IVoN4NX-(O4gAyc$weYZm^ zFgQ>crxUW&`d~Ka?Jf_u9o6;isdBtpa5?iFL^YP^nP)s*C_*6yt!#LJU^nl=S9VVf zA$r5N&NzUcclGQ6dv)r173eqeoFVOxnH2m6q?PVID##Jwv7is=!J**;?igsfl1qnizDw&ct|p^j!di_P5Iyvpf@eHl#GYt?Y94$lBRM`V2VrnqzLs1Xq@HhSRz!}gR)Hfcr0M$s;KsSLV2QNY-~47&-j`JvHjuuiJwfli7F$ajDwdpFcf6;vuX>?vJUKs<}!JSaYl#bg^{ z;0Yc9>nsxE10MJyZm#_yON&5o6my4pmRFdZC^eg5DGphAG7A!yE968@01h!kU<3%U zUC1>d^`Q5&Dj0bN%{)LAV}ebCKfRV(;qVagA=F1M4HR%Nl0`No-X@vTs7@LFbaUmK zikKDf0osJHE#mJG+gh4HRAxWq=hz{gb<*a6NyHMyS-!Nr=@1r+m>Y~2#ee^_m9caf zXdtpZrc55IjxrA-APaVw&&`I4=b<_#G^8kxi_x9!s<;U8);ay7(RP@^5<71pQIbqT z2U5Wi`Rw$#n=Awl(S?)HJLy4Mw>1-+(>)-(E3KLM3jLpTN`6&GPj7eUb=_U?!V}b? zV$}-Du!6t^^LZG9RJ=q)&YitIJ=>+?r??gs&fhQ(C&$FVLFX+d${{W%4R|FTh}q4d z_f{`l6xL(5da@me1NX*f@YtP>X+{rd$f!VoHaqU-$^^LXd=^FXJ*A$&<|iE?!O^^0 zoC3mNJA`SUAC6JG*vn-<<2~J=jMp zBbZea@p)683CNaeJCUGzFX1!tdyQP3oKKVt-O22PRNDVWf?(GtuQ5l6*ka^JlNH|N&G z_duA0Hm9pe20V9&wqF>*0|<2|qyQ78kQ*w3manF95osovwz-i*A5|0uoTvpF2-<^K z+SSr`0gKw4fvS>h(gsN^f2!bqwa+yr z`<3N2tqEAIG*TF!+0}R?DuWfdb#;ETXC48(XwgNRuMSkfj#i^I~NZ0@u_?w+>5#qc;qOWZ0*wX>$^$1K3KF7TPD5y2o zyt77tKpqG-I#;s0r2xQn-!-z6QgEHVAl5^}x5VfuJ`^W*YYOk=HENC-JrAhQU_<8} z2BQyKTQfdTI5^Tu+9WosOX zqj8;L{S!Ru((h|UejOmCwJa1XC@Z0Nt=R~1dhhPtySn#;q!q&i>E;OJ6GXrn!N}^| zlg2RePpFCu)b_(`Hjctr!SX@-P&mkWyPQa#mTj>yX&Wb-43$=Cy;a7!RWgb)lsVN|ekFPs;$xe3B6u}N z79U3?oSE8TDG`oaB~=^jAO+4g&&?QLQ{T^ulOqR@m>PFG9U<*?rqP=}?4diLWWX=I z_*AWCaS5z{7C)#JhqXAU$irFX+EY;$npAK(nxhydNq_b+k%b$E`%B4@j6`P7mp@RG#2;h^nV6 z*maGrV2q)@2p9CUGzSh|JGyrEAONDqerB!3d$}twGm_|EjW0GldUFwX8xGjDgSaPn zTSY=9awAh3o5cF3`e_K7@TmU4mTomkx-nMtSI^kASl874fx?YqhQwXZ=^i(_+U$<2 zbzJGMUQf4;99mn#Q20&uqtB|00dsFxLxGs|*fwv5N|w zNpYbc9Wot+KsnFRqic=eOx4YVRCEf!DOGie?h^S@r&ny64XP>9M89cMPrsn>u+1=v zoIyILrqj)I!+9hfi9k@^Y;#i5FgJoAbV>+t8qkCf6f1U~;HHUTJ&wJdWcQ`RyNJW3 zrD9BiVgbF?9V*z0Fg1j#Al!~mRyP=G5QuRrCLb;{6>^6l7eaO$)aYw6W!WLEqlKGE zK%r-IT74`+Ze4UYuPai|`v$KpjiV~vq60=>t3MexsC1sP1BGNFDO#V%RB*?J2rPjM zvmv%Fh?rFGIQ^xYlR-#DxZ%WYSVTMRjrLEyJQPp`woZrRAB40|!>#oYOuU-pC>fIw z>oc?CVV^OUK@m#Psj;FG#L#CbPI~)`5JrkEp#5%pD+YbsMTh@Oc*6)RcIWtG|*X7qm*VWj5LFE1p$)a3S@j7n%@+an?%PI^M?-RbwS!} zQNiDKQ~7k3u!}jDcF!ENu*&@M6=U;Hta5Usth(f?)eE)Zv(=ELo7rLYIUFKOr*B;Q z6K_GfQYep8%199+oPOetR1EkYt0PnsawYJL>j>= zgbh*T5D9K7?iM$bin4<4Rv(s=Yf!-X2b2!PRN^Xsl7FI23z`?m5HnYvc}{FZ#1IHo zht{cT1G;D^gsLO`WEv1OqMABpN5}Tg-d(%*^vvF@xM{ADDQRbNwZBZrvMk69$*~@55w;pcn3vCe1QQs@y(bRV1V?&7hD)(5Mu(x6w)OLnPQd-p(>L* z?#Qjq$igw*^hFFOY&YC=;YAFgi!1GJ+fT4Nk6#!;dpU=o%Bl?Q>jsn&wMVfN1#CtD z^<_KB>FM(!yr^ouh~pd@U5vso2C8)E8;nnjF~(rAfAWCEamzCkl#`OMzOBt(i~3zO z^4NS};{j#BkR>q#O**h+nNl$EX`qGWZXPbkUWOVvt2+cyRwwWMgM>m+@V}0CB5*nTZk#UV!?l9~rOdw?E=gxzJHpwt?pBbHNtzhh1UuJYzfeLlF6Z1fba|0-i zk~8;_!v**{m>h*;0oi5tk9ai=kRXQOj?T>txVK6VTQDv-W(lB8>g7gsd)IDf8skr` zy%|h;UVP(0+K{fPETNIgAA#LY^|2-j?@Zsaw`%My5yeG^nJ%MdC;- zMtcmdt-_-UCZ!Z;x_sq{sgYvO!D4X&x%cf)8|98GR2zeC+5twd$7z_si2o+ttFr|< zF7`F4C$Ivl!Ap6A_!?et+7bHEi&vF!JQesckYMsEyTUW#aH z>~Ql(Osk5w3=}1_G>^b@r2#RNg6^k`h^2DkjQtXi6zryHAd2PY=bJFTtUY~5JS zm&OmYVqafwwdjLoJ8Eqqa=2kKLl$*2L~1R!;sx`a~R#8H?%p#;i(gl^#~OqUc>Z!ioRLSS>qxRV;4jYD#;=a zcra`?!<&=UoZHlyFMYU6SNYzi@T`VSE2sU??C?py?7$)WNHOY@8boEAd400G=zKz>p0u`)NO$cbk)*onz;kS7kemL0>mWk%fCcI(vP zw8^Y|rpE)gId{laF_s+&8ce5XRWl7S9x+pnq${28V$?Cd09TsF1d_DI(@pja-mqTP zrnzWjvfbM&q|J95Xb~7PUYga09*RIAr3X)rp36}P$x>fji9T8{4LC{7TbK|nO<7jq z*ycb9r>$nYGC2lCmI-Ty8|Mn@>j&gbD4*0YH-z;hKlKnfLM^6NB#Dw&{aztpJVmEI z>L~-qzI{9x>BDU5gC8O4ebg)v(t*dQf+}DvMze{zBIEj=Qm6vtzzH7X$3vb{hs`sN zzLgPA2^CM{cLNi*WM>s;RxvBu@})a{OCyqswHL`pjFYfpg%$(Kt4c^cJgaE&+SV)-My6;`%SR3RYnok@6%yyi@rKUjs1?o_)TI6 zCb|4+0^IqH!w+g>=1rqc0`2Q=S*HLBe;R}w)TRKzuQ2^8IWeO;TLA2*K?vE~DptP$ z2!1s((uq>rupv05gZY_nOL{7d+&ihnzOmerzKhzS<;v~w6jGa1ks+wY9@{kp=q0s9 zEtPq#N9UhwkLxX08B1krD6Hb7XJA5Ry;3vL0PM9+Xqhl2S#9VF5{lsYx+qP_9&-DJ{((50V=@40h|p?r^O6VK`-lMraR3}T;*xP zU5fFWAg~4H=Y#f0s*oFZc^tM~<2PAXknEwSA$uEl=2m`1uTuLS7)|M7Q5F@JKpaiM ziyhK4VUuZGCq==3rjRckB+MykfTGknOY<-xRoV^2MUvx}q?iZeq zCD+LMVJkFJ96i85K&0DjT9uMq%L$^@QB>MPsO}D3MwuEN(zj7XY`xh8NfE##z&AxZ zDnmo6K!oiv!sTn2cIAoJEzLShnN^ab(bYa>l`6D9V$~els?t;(lVKOwnBC&To_Q$O zQy7A~RWm3us@%6b=ql~czOqWTeL*kgUH3Ql$=I?U(+nGRQR(G8FL{6$n}qO_Q7V-x zwg!uyLmY@{N2;|NXXDj`v~Wrpi8Tr*r;j3Zck*%;u42b>^E0Z6j?fUW9G!%Y0vcW+ z8mScT+Q(r+8~2Wm3`3P8cIPq2^V^LG_&K7r{u=yHCx^3_wu!{1E%J#JF zX-TMjuUgAE6=mM~kVUv2x0Ys2PD-QQ{=`Xicbjv)m0lVg=Ct%sm5S!+;Z3((Ua*bH zRl2!@8N>K6k8|kueAM>7Yc_Iwjv?oJ?1*8bjbjTK9pmn!m@418m5|1$fae+ zNyu2ovB}?-h!{5`pW7oFM44s))`6#opMNI2jd7xTuDGlk*bX^^1gE*sOYvQY}-`3r+ zr*j)9k?I-<;{Mox>fpUww}iEK8KwmekERK%gk1g$I!xc%4$G~e$R0P?Y(FF-` z`2XpeA#i%)4;VF*R16vPI}0pt6;LT4&LwuUDadgo9dH*F(Mtts@%~k$K^Bo&FJRcI z6c%4tO*taQ`opaan5{ddY`0vgEgdov$pwmV5UKwKmyFel=p|g2G&0~Ro~lHn0_4ED2-bvyRyn0*pobfw>jnMty~YX6 z8mSPV&S$doIGY|$T|aH(%ApRi`46%>`_1U*=}gsWhv ztc1=p88z!o5ht1&x60rIL{}z}JLPw6(Bal<=tx%9LkGjmyL|)G^HF_8=0W3_R0T+@ z1%&@8%Hc50zB&KkWP!JpA$bgzie}hD+C(u<6Q(SD zrI~$2S|%<~6J4rmWHUuT3|2qyt19o}(Pp2dn2)$Vl8`{FByK2h3KEElXu}|uk;TAC z*EA4Lj)J^1e9kH{$p}twy{DhhUptmK ziE+Yw(S2nFcB3Hm!0?7Wq#GKy#naIY>+UePyu1xQ&6pqn5X<-7IZNI{#lhhMl#q?L zR4b4z94+x;O2G9TMt)CIBgq4-nzynte(F19>1?4rGj9Vy#N5iWOt^Z{^)OSLLiiMu z_UaxC;7<6AZ{kRX6P6|WdW8EiN9p9)$Abm5iKn1o^>7$hL7+~Ceq=p+m#a@?abTwNavy^NbcMytp1eV0kgVeScvi{p+_ zhSw_%A*`D0=sCi8ht-H(+!VPIl^w-FKUl0S&iI;0x`qd7KhySf`RB4+M4;@5D|hk5 zfNDOH4j1$Dj|)B=8=+_+hJDDlzbbiS_H5q>G=x_AWC#eB5}hgwx%Ntkmcn1IB zYgOa^RaJ(U#jufS0o5Al>Js$?Trr@Rg^=fmM`5xyu|>{+Jt}TBg09O`*U>ZF4+H1} z)6|3oMR_oMY0cu5>gp6v8NLnqhWw6}6eiV`!=tb^fg3VvpGV=Z4EwrqXkSn?DJW)^ zPB%4bj&dKb^oKUyW4 zQYq(=+%3@1%A^Z{;{rs#W4AK`AK;)oys*(DuX?nQjAqES#uOfqJmJu5PpOH8&e{rX zOTg2qPprbz<2|O^B5Lk*lcFusMnf(?gqai@B}*e?4_D>prrzMqm52&V={{62JM9as zVxx&MEAHkdN+=;J*H=zoxETz^OED4lqrt6MW}CG%v;=COt9w^JJP1PE^&#Kqk>bIboEBr_Q$Y()W#}R!aaMsySA!Q7`x2l zXh25a+XMT7feF~n!)*FUR0}r17fk{YB_E}Ud-N7o?@Cf^E2155dKBtnGoI@-9l`@y z3OJrF9;*fB0?4(~2FxSkz%397jq3guK+%|E9RVTio@XkBF?#>sDZx_J+?50$$NI` z^=r!Jye(+afz^~%dKEZXrnq>Zi;`j7b!&m71fSTr1?bFqcv8wE5npl1tRh(0i?n#Q z{ZHCt>0Yl;hOZpCPX{|!k;~>V zMchcG*NP1AaM=zEcf*fIB%Bux7qB%{@J=d(vvWkJ87HVtHT|vZ4bEbMiL9tn-G5vK zo32N(5hTf>iZK)klryH)0DBaM2vxBtsWI8urFNaMS#tY|VLaasH zd$&Y>?9kHCUFwl&wTX`0cZn}Y8_ljDrbxk8VWbu|jyX`raCa;<X&7p1#hao7cp^_ff!^&{AI!{3rjgT05ZKWz2{`?{yF{J9~K7$>weHhP-|dEF^9&~lmjLOuxP=N z%%Og4i9n@6LWi-{%yn%`XPHBzy{qY6JS)Y#DdtB@^xX?Toh|eu-n0WgFY-g!IgRVT zS^yv}$~A2&u2~EJ{A)lVFV3yOkIW{41+hzb*es_HGK>81xQcKz*d6Etj)?u6+P594 zs5vvnNKt#sMl-Rr-z&@VM9Gz|-GG3!b|fDjNIDpP4-ewNbdc=Aby>Wo9jpv})hege z+KfFa4r54_h%atRb*$!mL%xFhMQ%Pp;E|;2nMVr!#Sw@^Zpz7xP&F`Q`PuhsMAZnP zt#JUJ$V-PBfxZzv)N(Ve78)xWX9r%c2c)+!ronX1E-43^c6&Ym=4$mT;dsWd$|7z` zQD z(X(;ZQ$fcqhRfH&uk4_0qexsAUk zQ(`=R&Y@=%zi#0ow-^{I91`%T9=0Udut`thU_s^3aFa;uQ^Ar)1_i-2yn zus3{fW>;IBD&#wy6Bxj34&t3v@Ffr#v`hfs3w-VVV(HPnb>C>-_TnhFp!5mIxh|-3 zrG8qeSMzC4sg7#`Yi)eF$5CFoJdIMyZ?3V})Nglp z=QX=Jwsm)QY`Z=jD&@D+!@7km`!EZE*)>>>sGn@GQmU!H^3D(&+RX9h2n*>~+PQ*P z&W{+3g)Zbm1)24P=u~340n8M(gK6W5Q@42jUB@&&BU8>agL5l$L*S8NZlx8#gzyPI zeAMRLmJ1LB5 zMwk(pg!on*&m@yM9Jewvt!J2ZfmTn;)_zfn!S!!pNh-WINL-KT>P9e`w9_g;;-f8_ zn)*d&4b(cbNT;tfokreCh$0QS<22Dy@?Zr*SXDq}xQ()XR^>>Fh{klZj%;RPbsUI% zhDe7Z+UeHNt4AH(n=!h&D+^{%9#eD^)3&c1?`ST@OEuH9RMBIUQ-#mGL4jRm;L)W} z9Ik}vJQ>f9f<($dXpPI^Vy<`#?%UG_X8wYPrF{#NfBVlzA6>SvVPXB^nug?p|9JG# zrR}{xeDu-eyYhbFvSszZs$ZBqf?o?3EW@wU=Om{As-b@IX~|*y^FC}Z#~_ciZW9Id z?vY7eBgItA8pel#>W({87(3%V$6HcY>ftfz`qiV4zV~?Z1?M!$1e%t7%snpna7|6k zkwys8h-cOVchBX<&HFa2Yg>Kk`nJ^@*KSNRWI@YuArZS~r=bsJY-vT?bamt8C>G%GA-bftcSnUDv;9!@6b57Szx0+mc-LqemZosgWb(y;IjG=+@o%Y;`BFcj;^Ju+n&P_K%Up zUwyle_pgkwkbps+F217jPSz_FMR?YibYhh5a0dV{QGjF{UM34sM)FkDEm_3>p2q(O zoovVB#k~xynyli>TYrMeVAEw%#@)Rl7BEcA=z&-E+WrN5C%6>FuD3W2+lk~Gzj*Y~ z+wDB}?$Dq5U4fVV`+BLBGN&ANMdaShxodI(tB}Lvpz%2R`K~}ud~ZfWaA!J~ zZZ|RMSkS*ac#HME@P*xD#C$X-9QQ<*%o^&?YM)bEQ zM??Mmxk+4=nzhG`5S=q2;;lern$()tTmNnGR!@G_6YjvvdoAJOO&9M;6aEG-KW_=En^zap zgl+R`YOcnIs9G*<@j33m%X=*$e_{THG{;x)@}DfB^+~PQrU@6HR#USUAEIhIr)_JR zFpif~mawLN&6R1wC-Cyqmaz6IYj>py^G>g+S%42wU9$KR-}3c%d6^}wJA0iUk~{G7 zUQ1Yi#ro?~RNuhMZ(G8K%Qwha$sl%|QB!jjJ}l$X&W&@@9KVm3@3MqV%Qk`Z*|0y1 zmtV1j&1Y}+h5r{`&OK96J$=d3FHUo`7U- z+uVRwEHkLzVVR3Vuq_6*;Jliei|`R-_X4c0{pEPhQ)F8WYBeCP3!(a&La-|g?CDRc zsks3kLG~s=_NN}%GYslEfcV~u0IILKJq44wcWEPf0w0V(`$vJG@2UE=QEPSUquLRl zYN@IDSA3+n9~184cKMPOUzcpK0{>)9P0bhZ5xAx3&${*;p4P@o4eE=4IA>h|)wjxn zNwwB)sHxe65305GX+Xdh^7|wBX3YfXqX77X0=2I~V&Aj%YfS5&x6(eewWj7p+pIKF z#53A&!_x+_)u3(z#Cca5)bogKcL;Wofi>^0sp-T=8u)R5)wO>TPix@C2DKd!*F7tM z>U&xU_WfUKuYTl)nwl@-BgoE}%bLx{v+o>jz^fo3a28%Rgt5j)z`6*Kv|r7ydVy1N ze-i*c6#;cB&>}^av#RaC5o`e;K~|75hw!xCSYc2{0nvC<0M)m;JpjAcYS#1Inws12 z5oGrWvU^#vuApMKBmMm$Oy6bg1hNvBS&6S0uc`SXd<50~g6csJb)G@J8xWr?2T+)Y z0ob_)Ha-Eih>sw9J@&wKn-IlYYn;wPWqI z$zQQ@dkJrzoq(aZ71`fpD4gI@Q3(xx*`lI6_S(8>FbtnT?*B9lPQs~8Heo{{ z59zjrkWLy+LUF=Q?H&16H6S%amjhtC0Xe~^_GS52O6Dza1PImSxPcx6*h2>DM4{Sy zfDbTsJJBG&1E`-Fq?3(m9{{A^$w>IcsT6k?B%MAJft=7(`|^CN46CceLt6h;r2nhIIH9UGc^)Sg9|BVgf#_Tliky5^`|fxsWj|%3z%TBo^17vJ zv2C5z>MCG5V%VHehMA8;Fy0brVYEF7lWE|u2k3hY+=*(n_oC+u8Rwtdrid zD*##+HS-;xxtjG5-LAw3)GQVFYF`&O+E$a>8(NJAkn2U3(@BKc?h-!&Ep`YuV|RT3 zn7(7!oETY~e3Zn54;i3MkPV+@@}ZL`Ymeny>BJlxYxz#+&?^D>HUoB2X6^5KVBO8q zNm&_T){2e-{TNx6EYSXNGANgc>bR}x&uFZv>B0w{Rw-Cv)N~a%uiKVsGo+cTXApa^ zc+z|rJdM0Dg3_yw(j|?&%X=&+~m9XPQDRln(AQP z?gM{Jv#mvz4$1ay$u=kXj^+3&o3XrIzM50`7XtQ}!2gTEf6L&%PWYwm^0gv`e+6J4 z6!>onJXx*6tkkcIQqYG0_AUYai3j}#u-3Kn*|#)>d^e!}Tp+(eK05+cte&kvy#+(# zktrx$!#Gx(MFFjf{%%~5rJG#ZWrXkb+#Laga2E*|8TahChAIk=+u-sp6%^#>%|zmeY{T%jsGN+1v(Z%A?E^~x2Sj01-Ou;HMyTv|hb_L8LaAaYY z>xfPjOELV$U3lQ4-2vN2x3?|4`l^{hpg3z%r z$frG~j(LD&mPrtytE>_yP>Y*EEhNC14HZjjz38I(ux;inDn!~Ui$7qPh9bHU&Kbw)Z8B79;?AW%` zH^c7BfT12L-8wunQt*+Ht}FJpcI@tI&EP=HE-9_OcnfYEFbLK~xxT)>30T@)loLr) zcVMs(zbH2hb4>UzI>IneAqj*1o5V_4CC9yfUaT_YDmbK;vW_a`c4NP<^z0&-@91jP z{!nQSqn|0MiS-3+2u0J+rd30w(kk)ltAa*3x2nG|zDlhCpMk{7@l*4{3K4gC_&;pL zq_z0se-uKb!*R26CpYIemUG(>Rcf;YW(XVH=ewLu4kJ);<`l+;u>kF=eXDD3xfPAU z3Mh;Z9K`k=<6UNJT2t~{*;teMs`iZ7=E|yKT;;7QS>qz@EOZD$2`iu->~bkpMaOiR z=_|vL!+;WVPh6S6sJV}VY#+S+a0cU0oblKo@8jwotSxzWO9V!s=wpwx6i08)59TMz zFz&=WBv4MRNyTIqh5))g1|;}`-cU3Nkyv5)>ChoM`p6{wMripMwsfX&MR8{mHV88& z?ia?JZq8g1qm9lA9S7|OCtVXa|Imu-=t-1qRnFnex>=?~VyCJK*L!HFTB2t!xt2+I z#jEQ%Hdh7K!p((Y+}yx6OWL8OxqF4ORnU=Of;R`Xj-f5?iHXlmQ6nA04z3M{=~AQp zpqDJ1UBrQaagrKEPG>|!U^J|QZpy^Gtp^Ub&^OMD8I5vbTy3M6-tkkSf=i2ZVBkAL zC;E|GKe`DdZ%;`ncDJLqvDJUR)!?X!QH=i1Eh#@M$3IkX&#rB|S~_;`M(8+knvgS9 zEG7&{2W*R4U>!R#Jg`c`&Cv)sG6PR>O;@!h63d=oZ8bH!D(FbsC{~-bG#vY1!KGL^ zUEvXravtt6P$$PMXwWKK)>FYKbdtC_DUWakfSX{j9Sdk|9W0a&_Lp$2xsk)^e?}Yu zIZlQlxH2CDGjNTli*;RCz@f*$s19ETGUnY8T3us*aQm8-)w zDw2;BxIzMO^QnnppS~yW$>KPVNT6%kEHA%du0R;dc_+#hACZzXdz+J9 z4l0wKlI1{V5YheCeG|pPq5US?I`T{D&QEg-D$CjKHYG>kl}xGp(Z%t!kmZ0M@0+{q%ECdP}nH^W9_?v2Qjy}AhJVMD{?WjM<*Jq1CX zSWjVAQbmYW->A(B4{G6k0240A9zjR%;W}N318>@~`kqusIj&%nJ@;ZW#nyuQ+>Cg{ zgK6b;S>bUA3Kv-T6aMIyt-V7;y^4`nTe ztEzCg%PAx<$0>P-qZxOLWkZGA*VE?SoU^kNQHYhr4MaMr%FXaQpjA-<&FQg%HFEKJ z!nvk^U@Xu`+FU{92%Tby60a?cz=ebDRx#f#k5okOvdSTofHk{W8Enq5fAs*o@gM$H zZwck=hOu0rW);Bv?vCx9y*-`VcXaOD(|dL2_0bJyBMt`3#S^wXc&!3MSeRAHFwD4g z*&S7vF1nOZN@bFcwdk*0 z?y|{|E8PFN+!2S({MG7w;o0Cw~TLLRPmW2CpHTEv-UWu523co6hna2Xi@vuU3wx2Wvf zf{T0bq#=7ZYU-eSq1S5htkx$Qw7z_f$GKcCR16*-hdm#d4NkVb7FqO&QhA}kR`-+$ zQ!lA)J022bx%1Vf2sGk7~tPBs0>X!)zm(8q=L%s_f7DbHnNS9BKS!xqYCspQ6S>=>! zDdrhUs9Bq99qE;=X}`!-7Q-?YL8}TbOq^`Z1g)op5DBX{7or+`?@W_c{k5w&d}f)j z2nwhobb8)Z9)S`Z6b|>jpiDm?rv^d0a%E`8K>{a4;>NK`ap0irqd+hlU8#-mB|-o= zZG>3C$lRDa_(N&bRVz9mrxQy$3GvGnhes3sWj=31p+0ymBTb$50bQ!fV*=AvnI+vaXY%~`rwq^jt-b- zbVd3-urN%oNPp`GFs40Yc=>Eg*tTk$*w0GBhw<{yEupiy^I)3e9N4cfHyidV&%4s!V|)%? z4p_qWCENW~!iVsZ_Y7&=ebrO0@^>Y_kC#8Ogs$c;Uq;R1nwrz`VUE$3QQl*e+cM|q zZJ9;8w2hG?^g4IwZL4D^m`1(byjWC!mBTQ2+YTk{!@c-{Z^a&Hs=W+0&_mv>~3Sa zF04&<6AvE(GYFXHTi>|etbH&)ogIwXX}=9Q{?c-}uC9Gwg)x$v%FJl)VhDcynCtj7BzGJ9Jt6#Fh4+@?>j1k`;O`XpxyeiMo&0u~X{v*Di!8;T zhb(tVwwFk@Imzvo<1{v7dAodhOYu(w_Dcf)I|hH7!JkR^rS0bJ&O^w@qU(AHTK{+)X4a8OG-MMQ| z@0Gju?%dYf+1L=1_*F|5Kbx}s9&C|2B~e+6Ep#*h?v$o(}(Jf%xw)QNSb|$ z)=J{bmBdG#c-FDH+KC-E9xD);O==?^jU~OB3N(m7r&|q^i6ukY9^kFsq9T)`6>)E)O!htAPQ95z>k7zxUc_z0uT;dnnUEtQy+OqN zDu4YWe;pgRWMIwO!HpZ+Hubmlw-s>z9U|^iDMtSJ_oO6dm*m>9>b?0dA8xXo_KKa_`(GjdglKQfP7fM_8Qo=4s88} zp67oGAYT-)ZUbZO1l!&VJ*$5NAZPHdaI#Cl<|Z8Dq*G!0FPyrtJ>u~j0NW|>*9iQa zWQT$dJazd~J!^k4K<*c?E(4>t2$tTow8?YyR|4d90(PZCW^%DZoZbfxiQO)(u8NS_()}C^{UHyuXtxQ}J!-R!8SoOJ`)Y+zTTLTpcEBRP2mW!-kaEHL>E8gm|rgemJJXrYa#hn<^y(M7CHR6`Ud?O_0;#rN2 zbyS_V;LLhS%gYa!yRB&H6$!gQ$Gc!B0_d6mz@4G&;{Z{!Cm6!x#Sn16UQCbWgl=5V z9%9~*VAZ9(;hCiILU1o5Z}?Y9bLtP?BTae3WrSQyZb0?N@A220`RmwFac%#G{W8F#ac)@u&2B;oz+!2!L8&3&v%@lhn(Ox#|dhya{|!- z{19B=XXFIfgrBwatfo{0a6SloBZ)f_7A#$`%I(e5yfG)CZ;gOO&`(9*v)aE( z@d*(xS#ypFMSU%z5a(gkD7&lCuPUPO?Bj2bL^f;yKSh z0_1xFc7}nSX<+9rJ=b%d?*rr~0ya;;g!7!c@?6h(eu>nxgn_Cb6oII(tM{B|5mKKl z5RYP#V~~;>E2_S}KEruB$a(hc?cTC$cgNPNamxdD<6%C@8!yBT6TIRjx^$9X zka@fXOHj8VzXZSN!>g3l{DNfv2SWD2Y6^tz$D`rc`b##nZS23~l69Nb4YsunZV*=U zb|6Z&DXXcUKj$sSHIJ*Zn@ueDa>s5~lHF`|>}HNCoyS3aryOa{FMzIJ)w>Infn0iv zsCNesHzZ#+Qu7sjgWlKH%oCO%4CL1KEyO_v@?o%q4k77Z&Z~#sLf_>hB?Oo^@OCvxo6R^J(u(`?K;XCHZHv*Q5@rLAY z1b$BP{}gm!(eg!}v3wXHe=T62F|f}X*pj77JY)G3Kt3m6pA;}*8%tI$@r>mkkoqlw z_^O9kTDR0QmhT|-X9Dq;R@5h~sHOEwGmNDGPf4eoU(D#V!p;;!6(qJSyL|w)-(W># z+BUc6N!5Ch0#Y_C#+Fp^nC*d?^2e}MxSIrR8y;1STg1j9|6GvC5!`Kfw8d0&@m5Xh z$PJoP>)H0qYxeZy-ZI;UO`^ugNi#NVjXXbe8a)CuTBHW|F48H+%?e8=QLCi=}x%YFh|9si2?~Cf1H>g;G>eb%@bA-D`ClI}n7~m2CApj5w82 zr%|X25Ud7<2}Qjs$C}G6WqRbt^}30PvGV3tGottRk8N1Wt-w+|+>+vVmmpXZRk-p$ zwgCMtRp(HLUC8t*bynj8WI}x&$J$0pV&8|N9*7nRbOgJ(6jW}}2#zqBcxKP8oe(W~ zn|yd^N~a{^dZF#;WOmNc`SYuLK!=r`XfO1HUwxoI2qK&c9-jq2U)p{Ly#~KV-n-rH z>+nlNj%D?W=O(KlV7z@+&*E-+3;5k(5G?3O2Zz?L-L!t=+6^1p28K35M=DBD@{ZeW zQN1i)dM|^6YatA}w5!S_|IMS`8Yh$7%4VGAWRiK+x4`P+7zgUF;>Oe~Lsf$LI+*jn zl80jp43+9LxHqm7`HSMn=fTbXn;Z?<2A)#aWKJO|gE9G6Ncs|Wc#_;E$<(pdR_vc& ziDr}YzY5jg?!uT!yReWzuJr%5v328z>JPu~iNQ_evYoim_ZHADnsYqXtyqA{5nF%s1sCIkVQl?fMr7!dm_=sl+TttXJP=-(NgAv-+6sE-iwFs0)LvMU+Ir4?< zptn~JB-rh`h$!&q0a?{NqNCrxWQY*$G1pU>3iCrgwe-z zx&?g|f$kBqySO&_75@3)tjwYMWdF0{%{R@2On%9#{Oy0?v0XO7{R11;7uU5FE?v86 zaNXdhe%S|s3QQ0`mY8-E$a z$)Vh7)%lR9V*d?1i0W7p>a!Zox+Yb{c7TFkWqfEsZb7H=p|`<^h>V7N?AI`rjAr4I zg_|__t(MH)DpmEqBX*iJ6ZJJ7_8&k-=jvhC(7|RpJQ-?h*}9OW zXxUuH30pme2ET!gP7YXm4zfMioiACi#BbvL{&>*9*d75}zr=6izX(j<7HkCr>vv## zm-tOQwXY4LTm3Boo0~|unLP^Izhr7jyov7w>>h#NXK0^eXqPTu>NoNC1LXGv?AZo( zy@Ay)t@oSww*cf11Z=N>sqS}Wz2C&Y7pWf?2pwdBNa_;5iT?yr|4txwSy8*KsH8s0 zY~r{7PY4$3@OH~7k}YCvRm2N8%q1ld#upt*MxJy}73+_yBV5$+{OsOxX2$Juabv`s zD}-eSjmhJG*NMumBg+@&Gbw{j*N)*!-P`CB`_8Qedb+_@<&azibwrb8;>H`w$lZ!q zKDd@LdSK$<3fYaaIu6d6%Ja4~Z2T)qv~K5Dz6@Vm#cWOp7Oa&tQK1-eS+6-Zwl<Z1Q-?CRumYv3T-SkeXCHxt^Tr~ZBQ@7IIeJ18npXlOV#SXejMzhT41wQCD)mu%XwRz!tg08#QlDk{{z zEM9`i5JZXk4^PC3|f+Y)#*FVBmK@>QIq*uA*MRiMUOZt6Feh^7NO_SG2vaoqm$p;qKj3LB5DLWli zaeGo@^Iu>ES>TKC&*%9=A`c-${dYn}pES@hIv;YT`x8Jino!s_VaI<5&iGAXpii@M zSFv2MZ#(1GR4mwR^n1%P}@z#0r}nSnid>61M> z{x(3qFJR{im@wNXuY9s+$3H=8ofrW%d58<@F7WL5bfhK%vB-*AY(-sAe?f*FZveK( zeV-q&k;l5v4^UNM#3bE-IH7$$^RysS#XjHhpOf352NjK2bhs^#s+;Gps}QEF`tJCN z%`thnX_S7=hqs&!9DULM#N6kfv7t=4&oU6y2vw3j8I6)IRD!Y_Jcc78`p0b>|fW`e`(v=4QmGxi3*3j9|n?SkLNsh1=H$f@J|s; z_vB_EtjdF~V&$%JJm?MNLEVlA&14f)Z6jKjtS}z578HDs<08g`rr{#IF-H3PuiTAS zaFL45;x`pMwhNkRvzS@JGi(-x&HNQ={r9Z7REQP(HY*1H5!nPi0+3${7zdqT|Kh+x zo1jJDMo$)|^$i1K{RLZS6GXG2YXpq;!C;!n*YKVEy~0-71lDI(_{oUM-1d}$Ur_#ppOd;hk?&pLSKSM!?86RhWa-SZ76QoIM{z_aowfD zHf|-`s889(oLBg2x%pX@Q_N>6i=-6XBk2D*ex2($#T->x_8pN}gxq=5*46ecaVkQ+ zG9Up&KjpRsAHYAKlx@Ku7{&NQQjCQQ>uOF*O?x^%1Be?)XStJ@gMY3UqWd<@QvXB1 zpI%c~AQ^;ybN})-f%#)Y`);Dm((k_j$max%rIIwh%YlXT`YuF~tXnF%La6RhbXG?Jx zT)K=8!#^|)NO6j~Rz^y0wXT%gb$ z#-Zp~Q$6WR`~^5GN3<_-upGq*kW60H85RaqIQ$(hPvFSZ#xZr?MMfoz3;IGUp8UNC zS7fkt=@=g`z}MZlgfALBkgD^X!B31-4Oi4QBC=Yc2GFv&GQv;u7Hr)Ob1+)hk4oC2YIZ zi9d0So2fNC??pg#RRUQ;kHM?Y$>SPhapH%0)}tM|oAXS2h3%EWhSiIFXD5u@p;-}w zSQ{eU^eny6)Wmrnmd}c}tc(S2XcUklqIrR~V!|yD1Z0^xUf`(l# zy~!rKS(&->DBz85EzAAXbjCBHLh1lS0o5j^Q3ogm5E-PPYuAZmE!g3o{P7mbe^j$Kk%SGZ(dVW3c0b7^6Kfwr-i z-%6qEAOBrS5<4d{>SNgncXvoJUs-*TRh8X72OFp4VH!H|4(Jt>-M);%IYdo;tCF0d#ffC6j zwOo3;d8?S6rP!u^2`Y41Tq(83F2h*(Mffx%&$Zf&vo?^oS{Af;-SKMy@=gKcm{Tlc zWq-?5ORPI?f>?Da zJ~$9Jv_lFykYAqny5qwDd5M70h@X`lFt9aC*LdCW9RRskzs5fpl1u{u80 zJ6PiV%wFu^dwbzE5Rp)R9oz94B}sSnatkkc7sjVT8PcV7(gHFD_zjJvr`OtUN@)x?7sW`d7tsR-2M}B#lr7uKhX)YzcLdSn z5X7`qr&pCcUbO7Jv3!fgzYP(IQ_5DPx!|}#4oL%W>qRSjdw1{c?(FTw^qjV=d~Z{F z!&tK7tk{V^feWax^w4KdRPb@%M7~PmjJTn~*?|ZSM}$+-Z}bs}n2L-xf8`<=u6wbE zE-{ayI+95TLWMQ8twD;K1FD;TTv(&?&TjD>-`r%}SRkaeOza#Qf>Y9LBpi*M<~TlY zxQ$Q1e$a0HWy0o=#Z$1lJACO%Ji0mviIbvB^SU=|lEY%&4<%a(u*1wG;sgM+h;N88yY-c-P5F z6#TPEYi*WkZBsYI=MXVHZA^89)~CLOS`N2s+OL~)sI(uYY%+^T$Bc>C200kNi^GPo zyQpq(*oD%qPD{<}4z92?YvjX5&`J{Ubl$?SaWIdWK*@rmSfmShXvGV%%fP-E13C&< zJ8&7C>$9L)2q%TjHFlTMO-v#doS+bu`+)P`2)+8i@X+vp7~~LDUpt}7xK|Cw zv3)rxV9F#9QXSppM+`*=C?-YPk?bjlw-IH!JaYS#x6I zE#%5`0?75SERJcY)5N<0$u&21GoDN8nE3z zGvOBOWie$s=BAmO{RvHi)gGAJdRm_^?-wnCS+Abz$@66S2{&Nj*5WSIz_nu8ucJvK4b~Y&Rqsi zCYJC6y!@#poVV$`t~7y`&lliBt-|timtUMFY{APeOE`b&`KhCkv*n^x-`4iqsHDId zQQuhm@9^KG2|dKkaWlTNYKIp<<#4;G9ohscRy!nbV>k0525HYmMPFoji8eN-|IEH)(%u~?B7Hg(!e{FIW4dnO`m}esW zT7$8!P$kDR&%)^#J`KrAYx{+4JJb^U7VPs%jxs=ABw#rMTj9Xg@AFEI`vCGL0eiB6 zUEsj>?(<5H4+7+K0=8Vh<|gOkJ2_in`}a-liJ;Udho5kRbtEB49F*y(@dYlH(9kj|jw5Jw#t!;0W{iNWDiO z&a$EwSW$iTeHkUk{^apK`QjE#qb)P=3je)jTk+LvrH8k9eS4HvgkO`5n55nop8!NUF=FaTkmipb$2;>-jRF43_- zHdevdI_Mz$=}K5K!TE=>SprVM062=stX?`+0I4L-Gbe*h4pY2z&R^9_26CuYb4&V6t^lC6( z#&a1OK5!hhYP@n}_`t!5Z7|`g(w{_rycLP76*PRhxi?uf9SckGxoukj1daeOJs!1+ zBR0<6YCBb(n7~yzYi-hEMln(i5M*YkX4T1XIn!nG#d9vM)f2OrBNhD}@8n@7KZ{{k zyX)|1dPlu6p4Ge~bfoGIJ(zUAN%J~BK<7*h8))kRuO;+Wwbf+nNY{{u=O#Dh05KnK z0-2vc3_R^esJM(_Nq{tjWr2~!C_{^g?=skh!2Gjxs5mhU2OtcWJ_`L;XcLM^sKXx+k)E)>tdxD}Bn*MP_CXCkv%e)1Z8xH^nXV39 zhsH*#)k$i{z zFF725BIH1?2=IkNsrps#U8S+hMcLh)+c8{b0GnJTVu~@G2s(^fVYtf?i5z8*f@?!U z>Mjmd%nrOu&rvj=nt%?@1|0W5^+Ojnv}!f-E=DSxMELU3w-j^4uqf;qwom7jw$-#TwC()MogT z!jx@MnHaHr?Jrc=&N_VA;hC{Pd9MGaYLq!%bb-9XI5~U$AnI$-Nd42#EWv%spHGAEkSe)SDh>dZBklj-C}DSK80voTCtqB zx{z5-)@iAgB5TaP3<-}Oc4S8pj1Jsuq;M-`KB4Py93y<|(BuSfLm25fZ?t3~$W zxr|(NAnz*bvuxEoY zNb`kx2CYY}+dQ*ylr=m#4Kn(b6_yqa85-U*H98AdhhTk5(If`} z@z5}0&PtVRXf2F&5Um~j52s}~ykm&9GHYvLnw^BAJ66mfhet%6gRIQJ!NTZ);-H?q zp@hA{q*$dssY{=FPfH`Q;kIBA2Xqt|a5-j@3soi+N**YnBCZ6kpYrgyB#sx&au;#o z0EdGkc9L~nS&P=CA(hX{K*6$b4eAkD#o6$>)iL9m&MuT0f%9dYb7#mhOCbXS@$K&1 zxeeZudamEO)e~Q)gEmy9k#W5PBB_*$BqehkzfU@nIAs|8Om%bJzhS2dw1`~Vkr;{T zyyyvN5H1jc}b37l0nGqbCf6)3mi5hCa8&&FlCG>Kiy~ zN{^uGd6e{g9^0JGBPiO1dW+Nd;#X>MdO9J0DQ7!4f*R$ok{m&`4Q(1&v+0uc>x!HD z2QR%84gp|s`T=B3o|Rgh&QGWyzrWgocp0i4=t18w%XFG4of9(QMRf7_mn`9bSL4p< zYi7V%^&D#pJLF1tj&%vov959FSkw4VN)1}yS@|c0A*bdBoE70la*zB`n*t z%pX>L0xv&p3FkfOJnxE$?gy6I3C;5Q#7gb6AM|gKrl4|gQ#gas9T<{o{=S4ZXsJe zGd-HN=h5!&vFsg-?&_}U>C#kJHC5F!(;g<+1Z-o2EkE!hJYs?kdHhJSKSDN;UC1VE z76O4loUoha2U#G1F~O`IZ2Z95|Nor({_a;@BaOV${%Bh@Ro{2-x#ymH?z!ild(OH4 z-jx51u>5H)?+>m{pzK*G&y1D~x&1Z#Tlv>vrJWff72N~#gQ)URsrGNB+O-m#$8P*E zyYY?sk3Y!z1C;%Yl>gsN`Cl?E{2i9R{So=cpJ@FB%6>`8|Du%VsB4+K^dEn;bv+KF zz83!>y4M%|2%z5Z2tR`(uCGU_yQJjL8zg?gARz_!X!+!<>&{!Bg|n_xV%DZFT0ZIH z%+{8k2+VXkIGu+T#03dF%~07QMAc8>XM&Yo*I%_zV5xNn8gc>?oO{UcMmGw0l4p~6 z=*!KVJc&!x4nx~mdc(Y2pyqdelXcf6+paG@cLc2?G$L1gc^Q^)XE%eZoTJUjZiBky zCDA7&ZpOx+xFXBQ5s&TnLbp56ert~l<FqhH>zaB=K$Gv5rh_yPxnlQf+^_~95Hcqv5DGgH*0JC{t|ax-~((p^oET3 zDuUm)2Td>ltME@7cDz*HFfOJ$Z;e%~=&ID}y;l7=JU!VI+((wJpVf(?K zJL2*1g?e4=QwgdKNLetuckrRrZm-eoO&@q@qsjB1>4RGrAKI+n3m*pT;#E!djw(Ij)AD*u~!s0-i3^>+8d^oB%;K6GINc>yM|gI{Y-ce*?vf9L{Q zn&dY;;2~syvFxatxKf)_rh4Sm3EfUPx5|2Fr@GaJS1mVG)x(R6RqUpM-La01ss3;< z!u7$Rj__20n`~4z!KB!vbdk%z?@mI~kb$I;SG4lk2~52dlNT%SG$d!sI+6W zptP9=4v^vU&0~>JD+7{tO1m_F|(I*UV$eBMw9`>a63fZGnZ%Zf8*mp{r*^y_+%171se7Kv|f>r={a4DaP5D z!b8TT^R4c7f2lPPNfD22Xcmv(!>ndi=p^uiKKE|*aOOj z3YZSz2A^ZiIs{h83b4`jb{3nwMI3IlV;cuU>1$Eja#d5bGN}2&u;^lyk@W#~{NOnc zLk{yyq%*K-pb5zS1*7dK1Sxl_19Om_{9+3eN*Vjo{_5)XK(eRM6h`aPdaDP%Xm{%k zSh~b=RPAG#Yj#4Q(1$>gKIR7MAcaePd(cI^Vrz}YC$$?9Ee=q`5$-I42j{f&;7kSc zR($y#{-`{u7501*rCs*u%6HK8!4ENO@bbc^SUSM#`pOo|@I%Uc6VSUmMo}#nKLMB3 zpAi?=2silE&fPNS4HmzSBEKWW-ebD(UUq@S?w|8^icg`)m!;UdOtE*{VyEZ4dE)Ef zkvb_}sqd6x*HykB|5o0jWmo5R=3>9vGbsCnlz+RFzqayyT6FEz-}q{8j`#;C^0QLx zdrh&onqntzKjEzq{{lt+l@$AKDJHh36L+2P#)n_V+uxEBAMhnk-f+?f5C3Pp{e+bG zPSez7)6~g5Clg!48*X|QYz;%>fM*Ub;pjPZp*?zh?$KjQxU^tl=EN+nS6B>R%C!qe z=8i1SpITg+KXr0;`Pl3XP8AAe%+(C@3$sUOmkuA>rP$)q%+l=g(!%U)5zyk{<0}rNsiaZ?u$@A?!P0W3dSGny(~w3J{KDo%w-w5_e0q}pA~WJieZ1yA>AFj0IU7fBXt#C6;nc5u%8*?Q4vfS&hIsD6JF$-RltD>Jk zvfyriz$aC-y zg^v?veY?CvM?Y9H>)unCS?^bHF++by9%eL|>^|ThlSDsl_W^&x+tPj(y_2*-*X_CC z&CtZJS-DlB1+Tew1*!FM_nAZs;@Za9b zYfUk-gA}{}sMpQ+qsT*2?4&71?4;P~qh2?kN0BF_81D_>(cy9YtM>=I=%&@9J4a*P z{6i@FlT!Ye0Xt{FKKhN1dfohwP~@{xY}OPzYKp!3_E&q|{4Y`DDJgbHiV0C(eb=kK zZvIu!roSHl?XA4dmw3$$ukpJ1UcCKQDe-NlDY>Q>WP8n?*95xxi{K~lJs9v?@bBC4 zZ)Ni{y#4R{$OFGKbs9$p{i%BAP0h{i-c*eyY~-W3Fa-{mJ@PYYMkE z;UbNU#@bTf_uzhYIPen?WqPbZ*+HPY@BR0Fm>;E^P68(t-OPc{!Mb>cj4nl zYC~)6d1?j+Bw8%+;pS`D&GPH!>-K!H@>}{9 z`^uZIulzV)z6~FMa}6kjyPu?NipYid3J&XOu#M--e52=3MQ2k9Lz>7ik%EySn zB~pIRrp73WR9saG%z*Aa)u@bOb->W&DZbSjgqmH&hf83iW4ue@G<-F*F?FaDp; zT0ej7>Ov;-{^8XH84e1LJI~>q0YlO4Ts3iJMlOW?$!D(%1-_E`exBp~Kk(xv5Q&!c zj~mvXC&&FLS^pA?yq2v07grfYu4BxPGl>mO6Dh5_ovC`GzJ)uNnI31Ihd*uxED)cg zMCDO@{L^>_j0mW7BFN18H-IY>;RstfCckdJanBe3Nl@`3w!~!Pj zu0G&W-Uz47)fUGYRtlT@-DjbjA^bi6?bFXf3%g7*5eHmpe9A{gZMjb8@>j9+KLbQ)X|KjV*W6K= zBxuaT8!InkOTWpFm$KMP_;DRSUe0I#A^zBp7wE@zl~?fjG(Pa_hRWmo^=tgNjWx$v z$}I8+P1o*c*Zz!M6FuYs>Ds#>`Lt{IvTI*Nhbmv<$0g|+Kjmw-YY(%%zhaS}!Z&nn z2LGUIFL7PFhb4ZQA7e!8#r*g@E7bVx-^L$z5ovbq0G}Vk2Y!8(Tvk*0-}p!f|31p< zZziCR;+yT{xas76cJjZnlT;v-$dv`x$wgLvBR?MJ$HM?~hkVM1bn=cw?Yxh0KB~xE zSDD~1_6n%IpmKu0ex4uynjcgAXb|vs@Ppm6`0X?J{SD&xJH&6Eg})U)_g*!@tDB;& zZhL3F)o%Bv?6*l{Ah8>yyNSe$+5R`-nLVHXt*a#klD^9p2NS?<$Zo8BBb#TZ|KM3_aw?Q>l|EYf zqi3xpGsI?K!DMEx-)7kC>o~%{N;Z2XyZ!ZKv#Zu`8faVXWB<=Q=eh0m2+D=#AQx8dW?58@#9im7>( zYz>+IMnnA?O!hn9^V~vE2jtH8KNqnAo80+>&q>5KpRe$c(+ zuiAD;6H7HJzt1831AY)@<&W@zvWieGE(?f!FiAhwX7AnRSFd>%rx4AaSlRbhz5smR zY4ODJM%-Ue`4nOQKm7PKKmG$b>ofeuBbv&G#c|JJNbFe?#}TZ3UFBgG|6p85PU35ZMHgq|K5b`cvQKWyLXc6`ghjXy1foY2qE{C&yvkPgAVR}>$g8xds*$kTfhC@ z+5@$N723G9eB}(w(Dq%qhZ9|ghhy}%Z@<5G|0`+-_U`?}S8V1~K8}X(kWcx@3akHv zqhm~U+)Z6q`BgsocSN6Z>d*O0jwZy`{hR!`3HihQ&+Xi5UAyPwD0pqK_4@dpFI28W z)3SH4+oY8j-uV;Hoh7r#Ch;EYdZ2&jN1oI88a@2Sp9e@{Qr*dGd#;%CpPg-1X7J4} zlUn-o0#PdM&x?_V4*$F$C{_B8Js((9H2miUrd0U<{EDYMSL=*d#;E!!*Bo_O_-W{e zbQJlYs3&ewZT>y3UH=?E_kR9rp@nEjWZ#);w^nfJZja)w7+7pI4QyWj3t>-UnHH<*Kjg1}j1Mf-y2k$#{J3f= z{FM;_INVVA4Px{&{CE*|QGxF8mzCS`pz?LxTe+e9m>J5yPqM9YC_m1s|A0ez)y}PT z37G13;5@L#z+I*vnv{D{+_?QiBEUTPm5<=#V`kiTsaZNm9FfYm*g^Uc{`xU|fI##E z`U(BY@w&e9i+uU_@Ig|EAJFwuw(@uJ?Dwx0HxKEEAB+#0!T2H4Vu^$CZ;0Fvb1<&n z{=VIU>yJTG z(y!N7-p?05h>xr0WoAg7;L3J&T6~yI8%g#~L-BXB*T+clpCdj`lH!#*b$oG7doN$V zm2ck0k5y6r`6*vT`TyF)H2y&re1Yx$_wv{G;R9&gAd*SQTUjTJC-7kr`W}PO+u7m_ z5&CJVN`$W3_9l=j5{3vrAKAER`fkSx?;s9;lg)n@KK@=&l$KO3Wr=qY)|c@iqVqfX z>&@~Ddz>%IWPA&seK$U?n(P_gR~ZgYbRFG4#1^!24a`|~I4+vu_)e1Ieh$Y^vhZaN z#~)uU*`PCU3K^oNHoC|j*;KQIret@c@i&P=kFEFd@soBm)K9CtZs}l<%9T&!Lk2@4 z%AQeKBR^^+~e#pl*>NqVM+-_K|&4!fQ)LLW#a8HzO|+mOm8rC=P# zn73w)X(GPhfek~CfY+D+uw9odIt&qsUSi-&f*E>x3qz?=%goz1-?I01oU8sNJY(Os z-mafTUdXpY^=&aB%HCV|+y?h=Iyc<@$gfg-v6v5W_yT^J5Ql3kx7+3DZ{bVjd-&_g z)wM?R!Fyk^dhmgJ*Y17bz`b|efpCWFE056nJA;oOh&sZh?ph@M!YOdyIbFYz^Ld4A z&q?rWL}Hx+5|iMT8}qRP5h62tB7ObkMFRl^=kOnccyD>|mSYlaQ2Cd@7dFZ9%MYQ25Dz60)#_$Ms1%WIREd$HZsv=7iZYEk{vP zejSUX3%|Ucibk9I!N;f;e1xmyt%x4Px#q2vAHy#fe)$(H^hr@75V`e6)}wpu-Y3@& z9%$UZdhq@OuULPu*}U%oNogyG)34%sDz_@$RQWnC!guiF8}RXDI=Ju4jM;}v2jSfb zecxN8YE}_Cz&_k3eSjkL8Cu(>ts-Pn)egCG@j+@08b4s~rxefpE#Y-N1iBXc?YqX#{Z$yA2{u3=|;+mRKlHO-tKa5xRGMbV~(!^cz z+AB%9TNat`hRV_}$I6n#X8txX|9xU#`S(&v0u^t+>2`_UyuR``I4t}S<>#a5%)d)I zbbaNcRFL=~Wxj^}iu)EQNPWC{9wCQ%F=ikuuO%F(jY!E5V&sdD-Zn6HUkBvgIsvghIGR2 zNOjdtI)7yqBSsvh>d5PCrcdc|l__G@xuj2N#pHERDe6zIT2z1wWPWkm=yuQbC)H$J zezX+q!vAi#y!|H%{8#bgBA2&5Wt>~y2KeQcw_jqRpO>Wp%bUa;FkoWulMftx@V=KH zxbK0NH($}Xw|@Wqvb*Vb-MY!K-^I^yT$k@|tVX^`$re{vBCuuC06o|Dwt3uDL-_ku~XWV?FvY zS(AQJO39k^H8*{YS(9kN6*I1^H$MTKe=5d1Sa0Tm*j2aU4b53~WcKLH>Elbwi?ffO zV4kPf%tmRU=4T$AEqmAMKMI@D)?)K4BkXm_d0s9YSsDxz(U}U7%r8=H7__u>1S%!+ zFhFtHaM7@}aEVPgX5)PwJ8Nb%xr*z(UVR5SuI1L6EhIl?PGjT(HP_b2=EbDNG5}au z?%Nud+eOV&T#VZ2^TxUHu?enBcIS|G7>fkbl*?15CD%15Lt`yxU!Z7S(Aw6Y=m)~| z5~ilxE6ADc9TZBhr7%4n3DXmyFqNZ49n(Z|9uZWcyF`5 zCc<={!t|4WEG@ydc|+wF(CWKlnm?KL{(ZJX!4%9&(chs*;_r!@BBbbHxN`uPzLj}*rY8tDFs6?JfhJf z*{HhQgpCVRjK2X^T_m8_azSlmPi}27*S~K!si-A_D!5s!*F!$$hm&-|1>)O2hbLfq zg9|?CIMwQ_mklniwGw=}(R4TeFuU{?bj1WaKAz-r97(&fcwn9en7X&^F5E(Luv!Nn z?7$b_+yM^qu$%x7z-+b#q|lWg_o17t8+K2|H0h8$3)*Y-P11>|oM8vh%)AY1Y}I=h zlqOCbaDl>hubrzXWq5iog(gud0AOw!>oqU*a8ChmW`7#Jbqouk4UVO>|3 zd8V^9K|FlqY#Y+Cs{IpqYOC;D8sreS_+L$v(QN75 zN2@Q~Q8H~HedKjAaa#S=ZoG(?ZlgTj1mJNoWws!n2gPK`McM!yq1Lnb2L&eU{h%f; zri41y-^4vb8(6x!?W{1=Qj=P2Qp*vD)jx3Y02cYfbzJ<^roilWX1V4$oyhED;?(cK z4bGzNR84)P-<;TAy(C*8p5fpMae{5)qF(Wu;WJ*ea`|StRlMquC}=$6-7VtMw|g(u zdW^Uvo$43rps%_Avu2px)~X4E_i9`!k4xwoZ&>pBE6-R2NgCJoS*R0W9!Swnc+au6 zdkObHDA!NpKJT`pk}o1v3{Xc6lZ3rsj%w1R06+P{jRDn$SbnwuVQt>{`)n&BM` z>#d7b%zxe~i+fJZ<*9OCPqn*VU732xC0qS6zN?hGydqsvjMv)DIwG4A^_fqN5-36zSMl~Eurf97k1^iYy&`*qpb+B!3x#&JL>ZH=$R= zNjchS1Yhf|sUjVq7p| zczuc@S%pJ26Nbs9QaTd6%jS#`7mZ_>Y5M_P)HqC*;CdZ-#I@7P7M3-)h1h;jrkQ!I zTz_Ts);etCv3h^T+&hNBviPvY%t$2DEL#=x9+$aTKr{VPFt!NWLen8Pg|AF6?IVEq zXyV7KvK41A%+mo9A>xKP8sH9qN@?&aS4;4kR2AHXFhO2v43|m;^1xtr zM3Y3y>WoXobn)5`sd%>OCSR~pa3P|uhOr1%0J{^Hjks9`mdq}Gk-K;!uY=tw8(?!t zHtjZ>^LWMvCLAJGWOMlyx$fJ?g+yah_Z_%zjAYKeTb4cfn3W(@DGcq|E<2$EqW3UC zN~i{8hK#bG+@@EKE0Lbzd-jQl$WXXFGAJ3%c22D0e?q& z+>!dAKCXGmMT{c@JT8N``hguO<#X;L4tG22t+VKtAHr3m2u<5sR(G^7{Jfca3_@8E*2F7*qX3Y@PkFH6qwrG=Tf<8vn; zU0yssvv|zScDAd1GKL3tF&ZYnkf3Jsv4dLUK1seQPW4}K$5Ln>E#clr{Gw17yNH3P zl5QAC)o2=ShwO1PZ#c6BZXUB-eX@R78yvnb#*DQ1dmwKs+=L6;yyjB z+G?{wis=C9BpwfbzWXqWUblPJx?Bc28ubT~TzMsJ2tau1<@k+oE@CGL7i&wB1X4@ z7a7<>A2w@knRNEr=MkT|K>^Pla>fz?Z>Z@8fBP>iuFhuRmFw$e+7V zY54doNAO+6GgfH7}*sVq>{}wyX zF6(kejNzOhiz=m7Sr1twhohbP=(TnqbZ1Yn54NxJ%@d$-!7!-hRbwM*4u+v#ij_Q0 z1U_-$Uy&!wHMykKzC;H3MJQ5N6q0_bSTN%z%7)qa<%ZJ3vjdv%y%{&2hIx>@T-E~^ zHi*8I4p{^z-(rR=(bB}u#$Ba#0N{s^4Du#NgsU&ubF5)Ga|DrZ#{x3ZQ?5uR4vOGj zzJ;`GK-%oWF*+aJQY`x%eb#du&J!|cd&VrFTOsa2T>-Nrjhlt=DdGK*CzM4F>-43Z zcrS8`(WfpIn1+lq*xBL@@kSDk<(C^PQ?QH`Oj{&z~yLKD2Y%KvQzC#$Hv@X6) zH<@8+^6qF{YOzqP18(&o98rw^@{Bl^V6QsY66i3_<@;gW%lDTvJFv7rB~6aiBE=d)O#E9Zx?~8FqrvYP%W1is3x<(sHE!rG3LLqq*CR zjak=WVzE#Rc5U6XO!iTU!}^7@@e4Qw^hejT>+A5`>D$v~JM(nL*=5ikkDK4VwyUOm zz?p3fX?@w_+Rdh1NlJNZ;giOuKaBm>>Y)gt#SQC<9?KWNjGNi5Xf~w}t~6EXM4G+22lZ0k*HJ^Rx$8`H~~m;CBq*e1+N`_mWD;4wjmU;T@< zIt+l~NGmVxPhUX0EQ})OHFmr@+x7OMIBzUqMdvIEr7TF;Ndb(=CMtzj(5PQmv6pIK2y>zE*Y-M!0_g4y!vnQpb7q0H|#ZutheEZD)nyJt?n6J;^|r!{P>jgKT&V7{8>3 zap}Mz9?!Go7>b$}48(U=fmU^FzSlh8f>Xc=BnceTGiyU<3vRQ%Q?0lA;u_+>Vr8tZ zU?wd}9->8@p~F2?RcMg1xg zN8rUk&eY)(jZ?ir3vGjqT7wvzk|u1fx&eQP{`3?RD#33Tp%S&t?wfG8O1;+Yot}LI9Yjb>05T3%x6E=DFj)#BW8bdu}7iS;*S{Me(jOF=<%QZ!wS_ga@OJ7%|sNvY26 z&y^_i#;|A~4E1KA^JQxwwz4#`5u51)%c{{~zCGALMWMnl60X{pu?puHJv( z05(^v&VDsKY9@bd|Ld57K03sXNat+)V$~i>FSGQ?%O|9*aSPFiYun zOUoLtRu;(twFN-dFxA3^GdR(dUQh-c;nD|P5tei#dMS1<$ug!3A>5AIt+N}0!(49m zBU}l>LaOhlx0qi<`AP-B0@%I@e-%+di8sE|C#LUV9K!MRS?tw24bFPd7%?f!{d27? zJphol#MMnu)4r;Vy(CBJ)9AOZeo~4KO}I2!)^NqztT(h=(|xD5L1RM*2V#qThk(}Z z_aiPjU+-0yrS1N*va!|;C>t;WdC?FnA_3UtWw4ikFD^L=KnO$l-;)=W<65j~;=RE4 z5axn`XMeuGjOI9v0x)3aXq>WeF|RgVq|Ky*9nUY{K(cqR6MsA=8C42$7VI|a8-|*Q@6m{zu&2BTqBj6z+bH`?9jzrEL1j|1& zsfy#mmyQb@u6%0$tU&SVnSH~5RmmF*WMueOl}C(g7P6fQg_o&uCn{jNV$p)1#zmac znWHt4M!AzUQQlph?l~(oLTvec>YjU|)~feZALHsM%MquYg#k{j@|W5H;1#)6XUaS* zV)d%$$P^a5BOBdn2VT(>3eY=xTzBESCt|QxUBaqoCRufJ8%b|g=|0HTQ%K0LwuOTp zCnwVPOQ(*Unud>Oy@OMCVsF-iHE2rIYxzi>eR_U<6>8iwC7c+~JxsQU3JMRnZIn$40+fX%UHu=*w!q?SWqdg;55bx~Ql(%b zC*ca!aX36U%C&bGqHKMnp=QC+hMOhLP?dI=W$d3tbDEo!WMj1}fD&P8Ve{Y7*pDT5 zXF-`UBk$AEPnXJC*la#sO!8(L5)hqJp0DJo?a?{71xCc~$K*zQO&g{k| zKCNA=o`M+dT|nsLe)?B8s!+}#TnF7079>2>QSJkq=w5d#FLL+Ais&#d*8^&LF&ZC~ z&3f1X8EoL1BVCA!)rwVy&avV1O6L+3seY4MHngj}RDibS zb0>xa&+o%0K{?}>GJC?{);!6!obJYcMfx`1if$2Z6lCWJ&NVj+6?3t&0721RK6~`w zH3&GxV!r^TP82*wznkBeVjcq?jV8805^mx5J!fopACJd09#1otM9CLJr^Q}0PF~7) zx@-rOZ_Rd(ti`{0sN5_K2TH#i z1_q|mC+O*$b0 zDv9ibdmZjatM=+^rZt2W!H5Ne9j)<7O}>G!hbShK+3I``8CG3|8hcKP)X%rhs##b2 zFn|x3Hcfr|JP6Ajx6~(FlrbPJA>oV+8PYJj*+-A#2;6KQh*^=(Lo0%xO<22NGTemZ zw;?aGhfjvCWL}x!a=oymKg_8ev_YQ`XQa+_p`>02-e6Et61}iwXd%kYnl_@Hw%sF- z$>vgU*3CNl8W?6=4hUxyH%-IMVWWlx7Xi`SrgaxJBI;!iOw zOpYO$!b!&vIb)9)oYiw8HM)Q~o1Ol)Mx-HN?QWQ5oic!XRT|Zf15Kqvwn(s5TGoVB zhTcuW;0$P^y?1*{IXYa;A#NZj^u$>>k}*0MH<{?AK{)m;w{Puc7`dmtscE1g{L3Uz z!MbEd`x})6fd)0#fs)=rb{#~_s1aWEsj#}eoa9lw%y@*6u+YvHpPA~*v zScmQg$>lr#y?gBLM08-$>h`bzo0woA=6k@l`RCSxZcqEfhkm*6xC=*mLZ$uiZ_tc4 zyn1M6Wic~4p&14r=SYZf>Q@(pTaEb-#(XS>P8<+g%0aeBD6x!Ee^2#MoY_Dm(O6+l z-#9m6o#4|PSW~K|@5^A~><3wS8bz??#W2XONEZ0KrnjP9Xk}}=zp)6LL=#6wTm%s^ zvdz?Hvdg%q`iNK&W!}MJMA;)_ARV+XA$>OM{d4{53TD`f9DcE&Il_sGnu7})0m^eI za1PH;7+kf2+eElTuSnb|0^qRNBaAYOh2&J1^Lnka4u+1gIBepcu z-!wv}cqW@NB80ZutxVXru~V&Y;}jHn3k`A5UsP|gOaapyhQ$!DiWn9cyx1-GN8P5+ zv#l+v#|)?yf^T7C$pJE|irF<=ZY6Du4cFe9*v;%g*Ta@_pWSx$BNs#xwO@m z&oy`USLKXGqkvoMJBgE)!qv}<(`cZ*j`N(e&DWn=UkCVd3l}nFxx#PI!da9r+X%<7 zC3jd&hh{I+Sj7MG-^MR-GRfdx1~=j$05i;lQ?sK!m^zTNMxF^FlyPu{hMl;$gTz4e zr(?TLdowC9F_~GP9yef`RLqn{xf@W=FsukBk4q^vSPf44z0I2_^@0>I*aA( zxTJ|t%@>7GgX)1(0w_Y;y_r6b7S0sr4|-d8=6fH#dVJzi^qV+|ia_XTmn_1HK)rvm zD-oDLRd=uwi(`W`hlD&+Sn+^Uy09OaB;e%$Cx_0MkADd!q-~Y|CM_QqP1&~pG!$#s z2g?$)7|7ID4#^22;z1I*x^k<|)1!biW!3sD9m>XlSg83Of^3;gz6`!zCP4G+pb91y zO#d=`S$G6O?Au3ky@v=w3&Pr3iFw`^XXNGp`L6n&RM@Lz;2yj}zy~vsl@-dyiv$Sf zj*BO2%q-@oP)IR1(8XDmEvBdxrj;$5n{xIY|D|ez1H;Y^3@xh?7AyydRQ#}YfGPvfNl{R1!~ysqOw^v}B16pXJtbr#LLE%>Et*Qq2kEC0j;^3SbB`7J z6a+J`;TaydS*R1y&fj(@_phJame{$SW3DEjts?dNx!o!0^{yPC^0(!0bS7|rquGbd zw%)Qm6nO0z4v5Syz*uuiIT{e_IN^>AJ*9;?h@Nt01&8?Z&kQw($!OAofXXzD9Ig1w zs-cAp5ov{T^0B0DU5>>@v*MDU0)>*hTN0IWYZa9(T|Sf56n>{z9c;*?mDt0jDlt=2 z1fs}MyL7ZzFg%{&@AS_QmHLM<)Q*c~XIQ;FeTz@yC;pfJW?B!dR{Bo$RI}Gm%W83( zv7hVL8sd;;R~T}fmwDXIib<&tw(@za(}xK9Snr|m;R6d465V-wW&3j$?C_TiqW zFfgT~mQuS&7mk~!8zwEXE1X0ckLl{l^2UmI+3@UCqYSLeDA#x5OXHex2o8^E9ex0} zvC~jL@mlo_IL@iUZN{#S%N=H=Sgz73rT1fw6 zPcLxX4?DIu6X-hA>c4io+1okILl)xsur-#{mXYHFi$I{X$$+I5u#oJt9;wEH6Y>HH zrvU_Rb&4B`pSby}5$1>G~z9T2#t$UqiaT$YRF@mAPvi$}WTM|Jp| z$2Vm*{I=0_);69ki{M6A)T65eW#or!tbtxE))1#8H0aZw;0vIoF z;!m@j295z0I{O)G6OH2Z(?Tka9R~~$c*4$sSuhZK*3LH zsPak|fB*|vaQw-`2CPxtHCgF>Iqk0imkt{*E~7`Z`U}!5PlsZgun@t%PG4HCTZTDGhR{O@%6%yOiQHV&o zgP>;3$FWB1EL2lVYFoqsU{6vG#&iueB?as==&F|-!}DfHIm{QAYy#hXvI!<088ss(z1$07)QXqV zn}Q4SFvtbrHbPoJWSo1ZT%poV#9Ej{fU{M%Wb1&PqmprFp;4g87vc6e>zP) zy}i(@Z^@ju>l1RGK`~+O*7{kPT&kK3m)TG|$gzbGv1*Sik~zvIK>l$7Lt>U3_)X=qXm8TbGV>j|tENb=^SgD3@3#6L9eU4$~2++Zjr!wbT-R(Xi#ppUOp^d9> z|KU45@snfO_4@g4uQ0p>2w+&SR-5o{fFluu#>Aby*=}u``~a%f?KT-Ka`9A*l_^^$ zp1|=hT{En_J|Zdq?cnRv@YVn$*tOVkv1d<=>uN4F^$~W|ZuQ-jH9(N(yQok(fL<{0 z(`v?4vw7C3b_<>#4$Lc}w|+MrW(YSnkp3;8Y#`X$vs})m4-cau~rA z;qe4{9@b!8M0NtWtH28zMaFP=!=gz^Gfn^j`{{D&qAht2##6~EyWtdIbG;7rOQ(dx zL7Gmh6D<%Vq#;#Ulr^Y_@8nQ|hTXpwb;Tt)7H;t`&X-`ib;sc<04ruF4Ks5FAmT+S}(iR!l<}0HpXL5 zI+q9`PeBSe=?PG_=`5_!v(G`9oUa*+`CUY*D6xWuQaJXY9IoqM`93kVqvcK8DF?V4 z7-ETT&{cV^(#<3QyNWy8p=v{p!Qupq%EF4NGd%^?4=!`55cb{2OrBG{p4&K`#9^v?Z;dQ591_d^U-Y7g2w{M0OtNd%zobdYNkYNeYI1Fb!U#D zVeOc|C_~d8hn-F*l<%^h;$vXlAp7o%>uo^E)?{KnL}NL%68Z z@Mw56o-LY}T|DB191%5N<;Y2FbiQHpa8~`2#tY{Tv4CP7SX7NHm8FFE7KQKavQIHb1vo^4CoV3{G2MndgGSQ!$_rr1G}ioy1IC*B@Ij@QtsW}Q6w0-Bje<*^} z5)}(1#S#Ru$v`X)wUL?}II$g7+vo|;V$|7SGG-CRa!T~Q8+T430EH|r3nY!5aYwY& zh=nHW!6$z7nN#po!kX!p7!mz^Q%b;#T-V%S(KOB_5(0wm8iyfu$QL@<0%QY62*4ZX zs?2p#_P$yHKJ&EWnA+f$IYhc5^^vS>f!Fy-9N{s$e}AwI-(jB~9bg~B{9~FXYxaZ? z7c_LSg0u+TK~a=xheEWVGLn^SM~LLvE)R}1+y$>Bf7kfZMtyKMuAzb@(Rk9sHiclo z6d6Mht{XH=kaM`PF-yOJYH4KM`q(N&e52#Z7qbMlS>{_&-s@jQaywuf<$aEj2uuIY7ajd zCntPkOe}#gqr9>z$_)2DVd8Ee2oeZ803$%e7-dS*u->EinrT|MIS9IJQ+re#SFn-J2snL&n%FwI|zLLwDI5=T1T_fv=<&%-) z5rWuqFv8;eW1jNF7^yz02Pd&c9CR>Tab}D$HKS9g5nN}R=YyWYhz)c{X zHDo+-N+F3*$Rj4I%8da)*vP&zcQ4V_)XB~(g3fUUY%259zrs4IBz}CziGeTfAmJ_= zpsboyx+s06*My;F7{5a3Xt#oVSPLp1KovLz7uWzJt|P)-VD7E+JTfX&;U*@juFk>A z`ea<0YpQ7o`A&?Q9GjIV{AuF6891EQL`+5wlORwN8EK`I73em$$coSA#pW6yhfL;U z^2wSM^D5~m7ICL_Tm3j-8}7lYNK!?(+C?Hu|43qcmTqlLps#9ZN|9h(lCT_Ib9j&) zD^nJ~Hn_Z5(WJR&?2EmTLi~_;`vf9d4NAs~Ri@bZmZ`%ep;%!JpX5#! zNI45vyIRAND~W%P@TQwY|0aF-H=@YX!sfs-WoP@6|7MvsED$nq_&mESwFSH^v`^Sw zO(Yv*zr%f~#hd>EsBUv90_`cAz*^hbh7JbJ3EG@)t)uB` zfw;--Zcu|qn_OcO_NhoT*4GusDH4#N!{?N3D_9LI8vOUlMw&IK!CsMvOG(Q`4v3$a zdrM-0M+Ax#FjR}@wpj=56faU!q@h?$JT-MqSJkJCrz}N5g#?vi8+m;H|2krh+5Jcg ze@TB!Jh7n_r-Wu5WXUYg9+XxfmD6MpcQY9ToUKgKQAsvH)@7;zvja0J2%yXGAr}s2 z_r?CpTI1Bl3^(hl74}#gnYCc-jh)3NOe8d#A+tz#+9faMPV9+(&1Eb$DSP@;Eky@6 zd-C4&^G)6q@2-0=SGBVr_Ro`$Pexow0JEqMv3}{okuDg!*;A~5nsIJ!x^Yvb%iQ{U z+_-kgxbL#D^8m35lX{`b7Kje%ffYOobA+v>ovQ&Lw^fui4G}HRaj{XTCi{Xm==%z;hB};bh#ynr zO`;`g-Xz(z>9moHz+8SV)T}Yl@)pbn8vE!kPTVI5W0MZI{l~?G=7+#kGB3?3Ry{mG zAR7E*=ORRG5aKJ5=T|y4ss{M9B(@@TyC#-b4cN9uq}FArZPQ z?myNERa<}|bw$PkZ6*9}yB7;``!rpy%r4OPu}SBhB_d|;xYri3Gy+3i$$*iXHKE=b zoXw$(Jnn1RVZE6!%4*2IY*9{VY9Iy(5+gwhYomgQpG902CwR_{o3Lp!Msj^*E)!EG z>1(hLs_L|7Ei@!POk<4ekX3br1+|<}IQEmiM{u^DGzsb0oe;fADO!hTS8nv;kqhq8 zE3jv7qC>41QB5x9(zjARO+RkA$1ZErwC`I<>g7&s>9CcAPmMz?61NR%{FoS*$B6lj z0qJz`X95;TAyrAKnvPx4i6-ueHZzM2bnRq;M+rdPUvfCWd0p}~%yIR5zy z>~rtTh0}gLEFOA_uQ@$3m(5M!M|hLT@-pW!qa)9%g9ZE&%L?I@&~XmBtXA{wapaxO z!~*C<;A?=hF6kQIBnCRx6tG2pv;-)=(P4Ev3BurC&MM+n$08VMcb)_&z8lRz$W|p8 zKkruwt%>eo5i;Bbyv+oYGx#OyRIx@`{zf0rR92!0D`9N5|Jo=5lWV&0SgU^&77V5d z%R%v7SWt^gG#crSAvdQ)d$7jIlF&^VRn5dn+nY;WgL6Ks4$J*Rjxn(yy6-mUB=tZ9 zqjWUU7p|ljvV&lQesc1cs4W6BX$gcXj9n@x2*9$jRbn{_Y66ha;PNG&NUWsq{drlj zgpgE<2?y7PP>=v+$^eB}KJqdNfgwm~86d^S@*@$K1Qb(;PgH~%>+8H2OXiK%j0R}4wv|x>j0)B4jhPNoo?y~f-Lzo%+{np;2K8`tInePhfZ;KWOkZ;l%E6<`i z%_l^Amwm4#YQbW|`utONvFF%gBiJXsjrdq>xm;y+y140HKEVaAr*Uk+BS0o!!s_8Y zHmLLYlh};NFb4{GGV1}qoG?iLd}s6J9a&4~i7{(qYdVY*Tq!&6cD1V*95eHrLzQP0 zVhgn)ONMmlfz7C4(!_8F-xt!(NUGQHP)i6(O6dmJXVHg|7Ym~?|ICe(0M_=$exWcNIX^#a{Xgb*Hn#lRJXTn>3)=Vpyp~Tt4TPZ=x6Gt=KPdB zU<}r2W_gUB%s{#sWh*m8r5iLhI-*^fMfoT8W#4viEpbtg)EYxf&$d8rdEz@`iXQ65 z;b27L7W0CcB{p9SX0q?WVf!>@I$>%1ip!OAb*XuEe682oLVOneLvv%Q&BDDKrDzH` z^EeY*!D|pX4NdBrJh1VcEyBR@T8KUF?oD|2*DSJHc zq!{!>v*V2wjpQXNwQz*~BjMGrIQv@s*EKCMbYG?#m_y8L{gk$1a&14M=P~xEmwX+Opi*BlLD9yg- zxCg!9^;byP#}o^awQls0Up_RmIJ-PQvvf>cZDc@l)0rgXpAL&|QjS5B#30IClPAN^ zc>;Vh(@nwK<86X=8y<=*9hl^Zn<+%1lI5q}7QEsw$%1Lr(B-5K!#BP|p)JWB9H5R1 zmi=HBo$9-J*=C4E)0oRa?dW8?_CBX@xuzE?{E0tT%*Ogjle^+Q#{Bo;%&b1(br` zSv{QNnX#2xxKbMv(hP~vwVYw?9%1APs&p5)!nU5XwAy#xG*^y~U_Vct0>`PPtq`Iy zYvlszY=iuF$bE3Sj#75Tegoy$x!Dy~au0{qJ86akE~9Wa%yul*m~1aN;YQp?*edDy z;Mi&O5oaXGiWJnNnoZ_(}YW*k&xpLk=gn+9Ks^+35l%f#i#T?3#W3 zl3oY6Y}8K3n?f?!a!CF#129Y5^9o?zdA$rz51r}+Zqq!Bt3nAvZ;;kbx~Z+_B*4Qx z8PcWncqKqFCyXG-O{x!%2$d;lpm4LcE{BX>;d^BC;|HuIv7C*$NDieODD8h-9;jKLZC!{oNhE#K zh#M^Y2t|qa>8jJT`mdwI*P`YuSm0^|G_A^Qo5Co1X(9N@0E2xKWTTOlchOzPY3XU@ zgG3<`Di{=&vES;paaE9=*jJ!(#8(c9R zJqF1=wsB{`TXZ^rf+;hE;cIn`Op|fzAvCVjVJKs~yU@|F7%h;6dKRNgQICi}V#FOQ z6^S4X6(8H>y7;DKT~-eZT$|o*);n^eLje(goR?cmgZvuA8l-v5Ug%7b0bgZKJtW$O zA%o}d8rosAj7co0@`27x?<5`J0kF~mOjS4~Njz{(qq|Lp1B4s`J{B+D?1HVb43LXI z6Cu@#M*|>{7>ha4y0{Mp`K{XGxq~t940uyCFvb5RX!62_2Fd9~dVFj`n!yDrnya{$ z=|Xiy_arj9D+p1>#JjN3LcqKBPl;dxBpEJg!zZO02$n)6yD_zJESXBy(pKOTkdyx- zp6KIx`qD*^@4SqX%|noHmyEzaR{~S+$`n|7?tOh5QfF zc^Go_mkyffPH?EVjRa54;l0#KC{FI*mtdchNB^Hq+#E7waU$LfGaB_c`NTFW(>RjL z`UEFiB^J>pQb*bOG|FsZ<4JqN@JzRWWo6kf9kyL%NYeV~>6q9?Jm>j@e=1KBz@t(F zD(%y8Qz0SUuFYNyF~m^W=&s4VrATC|UuN4)-eX#8!w`WXPhl0&XHSd$FFuipkxb&U zaoc6g4r7|aG~e7!YUWXc@S4Fn9dgq#U1aqxyCqZ!T5nfz)vaW)!p4l39AMiM2`EBU zAw?k8)n)3g+Dl(DRU{9)9oZQmid?dzc?7F*3ToeRUHu~wcPQLk~e09n6Ra& zp3#Iu>Z!TQH4vkrT$7NZ=3t}SV2liBQ`Cbi?||)R!larO7DrFC zP9RSe%VCZLT;b*s(n!D#0^>-*Y#Ng?9uiBj%!wA2uYzdE?c)to77OFdKo4Asui#H> zObWci7dV#?!dw_4gN9A*rn!@(R)bqKtqzy307BZVsj8$u!>&;IceLBv#M=&-vq0E-Ny_+)?A&M znV*|73b0M$B5EI9wD6Nw?5LuAP}ac5}0YW%g5;2&G+NBfG4n0t$o%7AcK_eiIP7HYcf^&@C7( z*{Cp*SXto>v)0{iGuI;QsQ7Ok8xKx4au;~A5Al~0s(P>nj)aM}(QS$yw0RMGqGGXo zgJK9(M;S&@A$fdjeH}JeqzZcznk+zn8Ls(a)E5k^N_<*CF)&2jPJ+Ur5<0oqg%1ca zkRftQ-Fe{l!oEVVk@0D3L{2i~r(K;xmby9|ngVOUq_dWMxDI=Z~LL@&!C z=yvyPYb^$))ywiv=h(iuFQOBM7jcn@~k&Bcvo6Ml*G z_X!Lk1^)}<{E%?Ef)?^qssKhj$=SSMRFv8tkBAjmBfzUzkJGPE0}s0xfBX}@N=`f| zllD1et;wv2agnmbihoJvm}Xd7!)%Y^zK0pAD7>mjlL%+~g8w?vTv|fx71_5b>l2<+ zX3w^^W{dhPi|{X&>tiSh%LoLCP+8chx{`Eu1p&4Ds|IY$ehM>3yEMq2CB0ZL{xZt4 z8wB5u>zI3&>7Lc^p+Oo~*af?BmoAp*@-fID_6(JHoQb1FtsWMnf`_XW{0ORLDP1@U z5hlfjJMtBhGqrFD=9IsrY{^qlutOi7A=0n1#$A|=v1-msa3o|B)5q`UmdnTeAso0r z&%0`x7kC*9%s5!EmuU}EFXF=pghHKUv&sh^#)8HU@}YH|QSU;Y5BedTy5}C{<9qZ( zZ$-$tQeB1GPnn6e)Epqv00U{-YeMSMiC^MdY+WR{gdy%+v$-YjWZ7GjJCi7Y?fIc6 zmC`P*&8CEQ{6_(oCMzV{( z^IEuP$_La!l*Gg5DN__jax6%ve z;jpTYIJAD4X{p`MW8(1M%WOyli{d&Wk4I4?*!^gx<$)M4G?a0tigBsL=w zL86Iv9O(-rv9Ls>gs;V6zPMXA+YDN)cpXewBMh94QBxYX5X-rCjwwiB07& zK(e2hC;>nq&uoD$@(*EBI*K|i8EUYhDciTQuyyJPWFyjjhz}ozWw#S;mDvTdUe4U< z6ESNUMz}sja&|6=4~Q8Rxl^UsRV+pQ=BpP^m2S&hoprgnMb-!&RR>&Tw&MNOHS|(V zca6178%QRPO^ks6Tee+`3SE|0!gj{r(w0ZTehN;vgP=y&0v|j?v?q>VcLhg>8lSlzzQl99MOGTm} z2ZVQ3;^ z-O9$?8oe`UB_?r9(9tP&?-incZ;ZO^YO)9$ql?+cEpQKurqlx3r$vt z*-AtQ*-M+F@kp*Q@R?fp=s4_s>9r^^`3M3MC@a#rje~4}VRLgEwn_<8haV?SNVd;z zm?{x-8(@X#QrYV%mjNa`e69R9Af=HkB)yVGc>wzdt{v1z?4=AgpT040`oP8C#>gRDvX6Co+sx_`F!~4i_YFSpyNpg^%`tBY%~jx9QaP*@iHkGz4O#Gs4hWA5+`?OC)Aw2COigmsf#8Y z_99szF$DW^zy{c*EJNEt!Bnt);D*1v^Q<5ZmVzspBk>|eF!7W4mn?F0`fBy-TP^J& z4%Fu77P#1$v>{mmG~!7P5hy*);Y(>VXNcj;oN3$8nbufXq>$>eInJHZrL=6^QL~g< zGccrPYI}hcET&{>30;e5RI|7KJBHGi)$fyT!!PWnyXB+XYT$rVNQdN|5k zhmHtlI!h_BEYD?Ac*Mg8`F#|MQ3uIb8Jy0vS%e7XQWUpUA%czCL4=PO|4E66L(M9H zP^g}Wd0j;z^Obh%xW|%ufzTtWNX{wJn!DFBYV)~hDxx3f);p7!&DycfL^YCiI5+k< zn$=R;($m;w4AT*yF|NKGBG{r{k)PSKWQcOe+M>hz%T1_QlJ^yeRR)xRM_TP{ zFQ--Mv_JFmict9{6f!l4T%r3~tW-&i>23=vV{^PXxR^-8sbUKR1)xzLDyXQZO;*gP|=P{dFQXhvTbqN)xvEHCYJ8Pi~+Y?V&tn85anpX zUuHyuw`-d=aiLSG;oBB1Gk{;wKr#Hw zW>nl_!J&AX)sJcZ^GF$K6KH;rz>#x@sD85aIZdN1NjK@g`}Evpw`}KM&i%;_usOod zjwj3Ld!*wKMl`?j1YmKa3muo)Y$`?1vJG9%|Q)fEex@3PEjv_sP#x%83r7{*b^6~Qo1Ho0ItvYz zwB$*K9^FR0U|pUG)I|}qN|>*Vdjy~$aueNeouywOoIq&QD%!6^6&Hqb$8+p$N}@;k zu(*AQj-^pzlz5eh(Bp9;NoF;U-s?b=P0jF75*&^YwfuC5<+6C|=L;rFflB<9bVyBZb$sWXyhLi&Y`8S@IzL0!FA^EqgkO(Xkl7Gtzd3Ax{ zobC`87bzK{yOXCe0e?N!lJ zjqx#{9Acx9!F25LTCgaEjVV0E$~auzQ#}k{e>w2PY&W-k+WnVa8%)!h5L?sC$id(} z)kmNo)i0T6Ip5t9zxDC8)k2q-SGRbyu(lea$NVod#}GFp z4!cckeZqQP>gd8a0h&tM)FhHd^~y8dcH?xfeX>h<$TQb&@C!mabR|>}wfVQ-EmNcl;hwk&?(VRurD=^(pjWPQzY-85Ur4 zMB^LCeCmTIx1VA2&ecRv*8&mJ5vGhh2{A1}DH+NfPSPAc3{J@V52QNk6JU^$JVJ_* zx6-0lOFZR)Vv5z1Rvza)fJvazp}N`?XLT?%o#S~lF&ER4d~hj zz_1%PP^X2c5k3=-0(B6_u~rC!r%h;lAfYHYe4;-iEnyfGI?{W5%^(@ZmCzl-2H})R z!`}h{XqZ^sJHZZcP9^u3v#!WOr9*$S3qmMt<2Sn~j}|ork=j{Zx5!fREhx0r5 zmdc1w3mtxfn%>G?D{4*ebj?LV(DhdCg0K8a3Tz2ikhjEV!QNCKmEf#!1A&X9uyyc1 z0WWKrG_gyTX6*2RVAiu6{8P$%Im~CC6Zs3BJ<^l_0cjNcvx!MBdKCj&Fe?xyj;>wk z_ReMVRrTs3OE4Y{fpdCc&WUg7SArHAJlg7kf;+UPLP8 zgH~gf>7{HWE3JUWGJ9xet}$*9N}45=SuvfhqyeATl$3CN>%I>D!l|nPi;YA~6*uDD z3(l~8a_25BOmf$8GSv!i#9I-Crr8_pMBN3ccHtc*2tkyQqwa_QyRQP5v6MO~o$ItIC|%b?kYWfn(Q$!@O{CZzUU|0IUPu9F_RmHhOF*S97n za2|d*->ku(xmxri+v%*i zcjIV^p8BMN&q^DN3rE~ELD_GkXYC^{;$C8~@aVC&;8;gxu1g4U?Qd`KFarIAFbOtH zxF8K%wAJQXeH)7msDDA?%B;%*4D1cuCf{jHVlC>mn%;4X7!|i-P)Ev6a?*M0*;PPw zSD%32;+Swx5GhLq#OTymN)eHFsEgDlM(!F<3M4%N^1Yd}z_D;r16rKyx>121MfL(H zb5x)_C8LVW(&w;KMGzr>!Ud4N`#W1LYNk6?>$Q>i5CS~w!Cj+O7brZ8!Y&u6kXs5a zAL1MW^#YA_=PB8Vb|}_uAgcwF;Hq_!Dxd70Bl~0# zu9MI*y>>fsvE5Dx>!qLnriA7?bj40`9CL3O0i6^{k9;_Ycx@6ZBqWlke-~lG5Raq) zDCAz-vj`oLw58B*{RI8DiIXhv>hluBb|q&riaBqdCbPvBGHomGMXtsL)oluT40*Xk zsvMhH#LW$lEzB*=E^@Wec9|Y5yaOPWAxd!Zuk8E2vzhTr)#YX5fdn(T{T3X@3f~C2 z+@PuFqlUsA+HSQQC+eNnIzsS}Um;-{9YhN;o`+`i?Mt5qOj>&y*IgO<>y%K!BNmb7 zO$kW^lhOvI6rfRy*9RDPJxFgDBn?LKEdwlxs)R(9QQ?L*FFR5ewDuCNP3nDngoFvS zC>G~mx+3zKpIQ9H;fH0|M@k4==3&|6NieMrmbkpeFmEdTdil3!Jr$ZKze)(3S@`*aZR99@39^ma$R8b3t|cwODra(I;dm zKX&Lxlkds!5k@?O{+ItLS_bY|JE*$L#k$gT;Ow)$mv%qJ}slw=DWolc7SX4t3X zr4-MpGV#%Zo=TdTL_4>#TCaGOn3s&b-1YKF^Ai)=Z+XlvKpB7(n#Z>ZyH$1i!33B0 zf+yeTZ1GH4!VkOurt)0&xpJ72D!eD=jvP5Y``F9^?vz=WJvzH|_?T$5W6UGN&C=6| z1e1fUBRE0GMS)!^Ol*!i5u^)>u^Vt&dzXEJ`bzt!;67WE!D|F@zGGqRW%f#pbd)TijhYgTt}fJ1Q%wwV2+WDOhsQ2rRX2+hmqxwfkBglNXtSmv zTL$4*c&k|5!#fFKXpo&bm=&6gnju)XS%J2<#9* zs3xR>Ugy=w73@K7QG%2Qaf}|kk$CG^yk&nIc1XJ$>=@%-Jrf!3rFM=%phyK*K|#F ziKDaF70xwMP1<+dY(KbygD(Qbc!XFnt6>C+68SuEjxu+4Q=-e^wiTbr9@K0>Qms~G zOmK)Dn6G$9Rb3I(DNEh$sT0<-)2 zpd-d}c%)?>gwIQOB5Z}WpTOm1V>Bs&%UD@Y%`eTJm|I+$JG^}O_}uKtrRBpjhmXw`2H>(~X>hZe zSp#PzV|O*~q_GrEM=hB)X9}1inFS3c^UyoTz@0dCP-oS#$IaYwxIJ#fi_Td+kdcYx z&qBrS5=sx1YI;oVlDfa%@OV>kh6H`5$20xBLWd6b46*~2ulW-$+sw(msOg0-#& zqA{3?mJp`rF=dlZq^GAw!X!<35W^gwb^)EqBA{cSpDy-b9RUGe^wEe0S4(DX#KBbI z0#id7DZmA%AU4Cg6yZTv{8wEW+G~KI<^3x|koC^Ebw5sgBEWofQ99sU_ zcWA7bfWfaMEb5`6^Ep`BeK?^Jm`e~g#;upeDN61hC=GBL^JGlJZrBuHU~YOk$FyPz z{$<9Hk7KM2$w((pN6X-Tu#ZaCmLn)7D-&0au!}Gk9qG!sr25D%EFP|Eq8BWKCLl>q z;_SVxP_O9BhTF-wc5EZLy_@uQ6zM5m;^%MIws^9p%LK_1mk72-nGMuPd!l$Rl!KBw z-@A@E2@5ppn+3My?737O(A9@wa8k&R35U*5=8}WRhx{Wwp!J|?^eWVPB1sBa7&)#x zaf-z4gNxzFD$`!_QEt=KnXN5BQ0IpC(6oMr9%rqL@=LuYRZOX|e4$t0!n1Mw7if=Y zx8_TlZyuECx+tldw3w3f(YPNIgqiwE7*H`I_zp(|3&nk00qD7s@$>*K)e#cull{mT ze5J?YwOJF`+991+tZ3EfUFzCmX?5A9?NV3Dq!m?h+oh%!N~@|Kw@Xzmlveduk?m65 z7c7F9*VKc%LNMh*0K$(wM5ZFmu_bAg;TSQgnn4Ylf-Rhf_=S2u*&a?t%Demhd@#9x z;eHEOC*0-^#f@1Fj~e$^W=hr^iux~rM#qs%mb-~e(Z{6}-a5MqwBbvRqhl%Vd~R(*ru>f&eVIFjSxb30b*fNYVg0+Je`a zb>y8r&s{DidbD`!wAVD;L56J|8Hz6{(Ct_#05IMxh({}lvQ1K85{ifE;AYDgbQ2cW z7G$;pTvKio3Um+_;Ud3JN`#Z0Z}>NwVL7u1BX;ZA9vbtjqQgc6{TB+Xf*T zaE65@dKL;(4ueD6>d(mNofa;w*a7jj+I4m4F*J5QfK;gzSmIp6USecs)&|@3{6Q=T zJch;(PI$A8?F}5OHlT{ts%%&^6}gZemK^mgK;Mu?25vsM;UkBy&wWk8`wZT;K_;Mq zmIO0VZ?g!%GI%1H+*%v+HhU%WM*F9E~IhaV-*%-i-@ZkNX{zlX*`=$SL=1S zysCpABm-pr4xP5~3DueAH{Aju=ei~gsc&sf>iQoK4X3=!c*e8OZ6IUX+Gd7dO!waX5ABP*s;?k*wnWec?*^yvn_)===Mt}wk=k$*+wgg*D52u|nJ!N zixm(0G>&t}$Cj5Fa$qhcUUoM%66^g{o-JW<!1rf;KK#YMo9xsK}8>rbt( zqnTK{4h!4wxWB_ydV^Lf?I`OMa+6p<@)DDtPD{`$$|8ta4Aj;^g#R&aW4MZhR_;6x zy&@qwWM3J{$r>@chF#+Ka5ez642Fq+pI4=YL($E25h5VJzd=vf^u7D0- z@_VpxExgL&5U&UVA}SZZ_cKuDUrb{wN9@8T>#r=NLfI?vyd@rBDaL!ba4*%LBvCl; zRED3s-E&~4P;bQZ0+r2TCH~y9R(Z!|iQ}!VLm7;Yryv!)F@-2Np~JI?p8CXzM3!Ea zuI!P#hA?*op)enzsx4peP9aVstzvV!dgF#CWSNJ$h<+j+DIB;d_6!J|yyB8)NF{|B zuVJ9y5?#OL#7&Osu>g8)TU44!5O1&V5K z1;x!RVzK89Bbm)Ao0>UDRCi6WU5V|LO?Jt)cR0md#;Uqz`=bZ5hG$)9i?u=LM+W^# zM1?a!e#_n)1Hbug20byEJagPP$nA7h^ z66JqZF6ogNU+msO0Kg1;SKePGp?aVx49*x>jj8c7j1$97a*gwtvNys6mN1U4vbv>C z5X@a%QA#Xxgko$nWo|NJI7d$L(1PQ-#rph1Pm1iT2^)|tEv!p98UD8Etjek*eOg$& zqQwY%NTqpdbWVrhzTDcowcDg3|PTAjj8O5M%Lbt#jcX#|t9 zr%)D=#SNk(>qQqMxM)z!E#g%8TWbnY>}Do=LEMPBy(NA)?H%KDkaeSIAdigeks-Jm zSI<&pk7z3~vgTnavK-CIpC?$X=1r`KadXc-mfm20@U|6uI^(@fsr>Cb9J#)XWlM<-3bn3{d>FOe~ zF6*^)x=PA2=M7t%^(O!dVQ<_-TJI)o_cavGh7vdZ>LPS;Gn<#G?PN!^iC<@ zTvUB2;D{lvZ>yh`#{C&fq@j~pdo?+A7mGAZNdji+tvCyrPn5+qmgh( ze7D4yy|L5KEj^;m`{L;As;bx`2D6eG^2iQcS8<|g^on8b+v<%c$@DTg-91R(T_Fmy z7ZZDuq$s(K$UZc)I6FVHbc|jiV`B*foKv83cv_JZSd)|W_^?~2qB;9Ob@R>F#8^mt zyX3T>{Y@1?m=JmhKQLK7usm9eHkie4V;nsJMbr`5(V(tgJ{WCh1QXrHWKS7d{o`_w zazqYQfT|qOdPGhA1u;E842PNV4EfLY`&%Sl?iDV5&%bH)!351-OY?ejY36N-`Lfu> zJPJVEO61zm*7tcXu#Dv@P&*e>V;{LLVb&C}Hh?C5X{C8OWD^5N+h%ZI-+8-p ziizeO`K@&osVV-;NVDNI|Fw+K?ktdb5~RKH}oe%8*Y z4CTz3sYy};4tAYJrYJr33Y5$IAowBCZAqTk){j8Vr1h^Tb1t$ahuMFYpAk zC0J*1K>V=I>Dm+h+Gc(0=3DmOzH)2jjsNYbr|!6Q@2z`oyJm0Y$xlA@)a{QP{O?aa zRrz*#e(N1~?D_JZTPrL0b;~Vx;MWVTtz1N@y?bt3xux<6eEYcz&DAaJkfx3_*IS+D ze0%#W#B@fRDiZvkjaqeSVP@|5+{s6m7mv>@9{ZJ1tIfV1wwIGL$Crb^K@-}}v&mD( zUpHIne*USaesNTQvFRkX?FgiQF)E}0BOA*23!~O8@ksyqQR~OOum+%~S>4)XD!>0l zaLw<5Au9X-wD|Ea!9eoj9b@Zl+{*#6Fjn~mJiPNm*IaYWr7>&d7@NL#|Crm>k4+z_ z9XN2{;C{Y8)Ee~1reF37`JvX8vFU^N?H^lh4Q6`1`p($&nFIR|;(rJ5zxZGN^3V0V z{4snAz}xHBZk+`>N7UY4Pb=XO}A6#o3xc}aR zYxU+Gcigh)=9POZ9{@2vkiV<^J%vU4ojg9?Iwet`-w*RWj@Fu|d+nM2`ygGpRGKZ1 z2#fdNjMRtu(~$Rr)bISGS-m6i9TFO_fUB-{p2UAk-Fb!&&-8gL`U6q?&G$JswD+qQ z$T65lPS(%2&WeUqc{fMTWF_b-be;&ENG_ck7q!|$*1BDO zJjbEY`!XA$cPMPO`i^C+hl&Ki1xXMpJLqhs&yP3Z13lEnH=wb+Gq~~P{q+2&Yk<`i z;4|I*plLsS{;p-QHvts4O?|?Vwt;7*jaI&Q8If0mcVX)Q-Bm6|g=<{p*FW{tQy(mG zt9UPNhgd!`voy1O^3>Au(Nm{S9(f-S`hVH`4)8dOqyJMexX1Dl43;`q3!6$cF; zUK}cJ!SqoPEA){Pi~LXE!czK~lL`FrXyAjXe1BQcUf!k=M;&_932us~@$$DC5gi@%Qj9tf`1wH| zvC*-4Zii5i`Rxy*9rTFR#*wSz~5-rTQUWKCTh7$IV{m=21B$6q<++^OzHvv%-yN#>;k% zm|HQ|Lv;;a-lP%p#>|`PrubjH{JuuaA349;jd%$!U)P8QBNiO)MobtAhQo)MFRWPT z<#8%rCN<*dLys0(l{)ufo@MVD>x4q{@nN@0Y@4vHmIzCodo(&dHWc~tX781* zrH2=VI`9$5YD}o0+cEsoM(t9#&48IQ#Sb?(0QXOIsTH^c`FC_rx;<}Dva4kNRM65tw;vB%G4FiGsI^ut?Fjh7%xhYm7T54P} z$R%IYT7*Sq10ifu9)!Vg8a~8sh4+#hjhPEVa|v;ctPi7Rfv5@BAW^p_w8DMKHQ5Qx zT2hl-1n}E5i52@xKIA5$RZT}aD#`{;@jF1jttsq!pyVS+!L?|VYqlES0u?XxttOw0 zvH1jiSUJ0D09j%+9n?zDo5dTYsu`7&{ z3jrfkSD?QEpcvy0i(pq9C0E*(L3MR+U%?{)ou%M*4N`K01(!8-)LQIDvF_AlCnHIp zCbKJ)lIv_TUHc-Tar38%zJ&z8&_s6ig66PHLwky-uFf^Z+kg(Ef3PxkSyOUVFomq( z6@C_Amn*zo?Rb?pi+o=#I9P61aJvR7xg7*G|H_MI8#HQmKDFsIzmFjCLyEwzmAw26 z^~f{|{yaecuHbeB1!8CA2Mt3om$6t7&BBLNuzSaQ8vQ|;=wch?+I(o|O?#b-5@T_cv+wNtM+Krmh+i3f1GoCbdgV3})IDRO=HpY9GyTBf!tnBz6&6aaBMKobM5}l_B?ZVd%_}K=Ln&cLUF!vRZbTCnd zprslT9z5X*Oodgn=~cIZ3x}$eIJS|vgCSQGW%{eleYLQ=!*L$$n8K4gl-Aa69DCV) zxT=;Xb%$~%ZFeYOK-Rq)E+ zn-q7Mq^k*GG24AD=8)=4#t0|?-hQOF$>n0fsNw@cO?Kwr&|-pU3RDg5X%$nT8TvMY zVF+|@YYtVHxBMQ#RBDYM1I*ar5WHl6>nC{9{jFlBnvml~$qAL`2l=#%PrIhgpErHh z+!-@wO>dn$vu)m7Bp&WO!OVJpC%b6Sb_{JDi94ZxIkuqh=iM5X)8-lj%sQoT~Iz=*hjC9b`p723k{!k(&87jXVdR5q!hWICz3>JzWi?e`oL_0)!>Ig2 zsZC5sI|y@h$v=)VM#fSgT+bvMghe=7?i^~%;|}n7*vb|@-x%!UKOKg5!+--JE5Nl` zh;!I>V3b+l0c6>1J`koLYyeH3J~0rc9Pj`#_Mw4NH?9eSqmvB?-V^}$_rigad2oT` zUUwZRv4sjG&F<9$Aqc`|qsbluc7rJho{da~jNM=WOdwg-xH3@c0B9BxcMKXBfr14R z=N+pCLX#&!0Abc!CI+fAcL?_I;fhQ$jT_ zvxoxYq#f0paqkbxjA0+LE)E#R@Vt@!O!3BwnPR$8O-NX_$+7-Lk!cIfucIS;Zyt_3 z(&x{I!#i=TX97Ajb+a&UOc4p?NtYt1vR>J;sn#{Lr4rnfyYbN;+JlhQD^ z#v~t|8Jo_eb{eM#nspT@d?o@x@@7kdas)Q(-6z4nQtWyin+1 zVU^qglkhg;G(abqHIA1-8J79tJ*c|olv8RpLTvy;cHg_2Q)-U1ugR;n&g-Xd zKm%4COP00oVrd-HPr}Jk>@*xRu14e(dU`dStbSZoNdUw091-65@$rZz#RYXZ8Rd@4RMo*Q zmSZxG-KA?Z?{p0^h2BqGi$+n!o-|Zj(RerB8H7%5udDTr7guIIryi&c6;C@ zBiv*-ydx(N^RYQgUuc+#iI0DtEMT+MNE2a5Cyfl^nOyUbg>=v+BUMOX zP&GJa`bnaB30_kclbw)V-uj{6HS4S60~CvPpgbFcLpkPHka5f=7uZImN13{!5243^ zpK+?s&$0uvt5=CVzV?ze*2O&?I?!_z?swN|QD!tz`%F|u^OJ?mN7A@DL|jQ+Xhf(| zu0q$~d8Do$c=t90FrBC+i_cqlzqE`PQJy>Lf(D45A>gh7t}-dM%IPw8>4YA^7AGQr zGrfHGgNT$NYRVAJ%H7U!9)lXn2H9q(%4Lmfz?v!y;JBm=H5}HmuBx+QTw@c!kp>L9 zUb+EJ9`tUuYlJS?i{h?W`-p_WD(;;ojYMC_`dJR6=Y{=GlPWbX5g|S~?zqoYck(Wue2A6KfpPFpGn6 z`OA(4mIy05va~jPRJ)@vqscV6+iLpCw=9mswc_cIqpD@%tC#AX{S57PNW`P z?H6Cce!*|#z1_KZ9#8JcoVR6T0h<;nfIB@1uxT-8ZlbNNb;k6$)922gnT(tB2BV$H zQ0iZ3l~z0=5M0n)fHznsU5+o``s5;an!C;winCP1SLK zxUZ`%r%?=cX9k7h6|$vL>fEHeGq(?ig(E&35osoPkB zejABakMt#kVV0NDxlZxFbxQF$e8tsDuG7FY}ujmJ2lvL#W z5Z}JNA~7tw7uCI=Rdya1C^0M=KX^P1i+npoe;F4F)l7w#QA*k7xI%Zlv)LF}G-HPC z?Qd>N;h0CJ8M>I}W=!>`r6ah}XRq(l4!EtP@~MAsLth;a$;iC^|8ir)t(YDBT;&Jn zOC9WR@})iQYWH@U!7Nb!fl~Vb-T8qc07SM-#58%T2d83i8+dQhW`#-D^>kF5-kPY{ zlCr^)`F4v3?|F$#4dS92=}RGT z$hBtbq~_)|YjHbaGk7JMZDpbsX<*6-|Jvd$j0j78N7zqrcE`i=XYUB@TiL#hW zAX6y5^%0yq?A-Ma0vh8(#)(M);VsA71H$ab)g9e+T|Fy-(a!ci)B(~f5l`X3+|ZwMkJM!FbzspSGQ}Kc*-AM zBlSs;1Z;g+GjgF)CIDE7e0hNKkdc`Ar{uJWSRg}I6YbaG6acpru_#O}JS1=dx_*Pb zNj$))Y(tw`XasJy>+Y5HO?6Etuc>czdwdmpj9of&d#4^_`WE{_yR?0TOWCe9(00h) zTg}v=T2J1R=#Eij5iG%QmXpp@Wpt5J!0U>16FB|cx~T)+ij0Pb_a(v`Yg?c3=$dT9 zRT&*{lzVihBh#6zIc8|2t}_kgPc|1q>+L3qv_KEj!p#^=yO|F76~)Bm7O1bg1AZu6 zS;35YRNR0DRATxJ#7tZ!?(XX4#BtzjqU+K^i3zX-CMFxPSt3x@r>C++^`-zTayzmk zy;h0{l)=qAM#2*91h}pZ4BTWH^6#b?szIfQGO~FV9f}=N5GikCSi>i`t!}TbIt)7a zV>l~pcgJVqbMpxnfl)5SPzr<0sP*$8J~A?0$4(~XAInK%i%A`R@*I0g5_nT;H8lr@p@f@QKm-(e_=37qU7C~C^nR6v1sgK@do^7q{b+RUY9OuY^5YN zfy|_@Z=FxHGDcSklU4;?ubUWJ6K6#*nG8GNFCm8_&Tb0A@z2K>d8k5&f|Ow-**He( zXf{CtNpiQQeBxg#M(xc(KvNx=@PqXvJUV-|urOEy{K_8g8}qH(sCkh2dDa#^jy8Qn}ZXEfPQNF1QFN`m@^&S{%hns z6sAEeuo?U9m{+J-n3`ELl?(;OTGY!hmr(;54#?|%$N^i|0(zxjQ`?$k^#%*fZ?9(r z-WKX(7Ra;@=4g&=9FLUn)SC*W3p5hb2hy5Rk*U04(nCUlC2LT&CGdZf{%&QB)>!5- zCZA}AGV!XYVz8CmVg!4dzX1GQkVd@n(9ST0Q50zCoIalm zmo*A_06K@+fyv~J%_rE1OocSS|41zkjKD=ZCw`GxAfc&%oQ_Zq;+5JW5KtP%@1u_g zB&K=)lx+k$cS|f?oevuY%rgd;~hu64d_}mRD ztY2`+Ob_MoD#`(g)HeT<1v$jC&E`@ zX51`z6K0TIUqyqEstv?~$&|ifvH1m7Om1%7R6At>mIn4-ChS9r9fGNsZ2Gpy?>IK1 zTFj0xb=>ghPbcT`%@h{t{Vwa)ru8}OT4imJ+A*%DV;fVcjh#sxiAke%x@r>Xbk>@W zm2=ZTFDLce+>wcOCo?tPqK{x3Vrlq1uT~?WtV+kA0EcPEI=Gw>fV^XfsV)XEPDGRu zx960f8Nmumv2(!M?sYIm@(+E={P04HbbS@CdXrN_XbBNvB{SPN1EtjFgV_nBK^_vp ziq^}){4z^Evk;AEVEEI@i@~w~Dz05&Yk=K0T$Kdxt~f)O!Obsr7m+(L5IJ%XW)sH7vShsHnXe=(4(;TE2m4z&Y!bDrzeSxR^fNDH`O@c>;O%&dzm@x8SH12fj}7%|P=yGbDY(1AA33GF5ougo6-+q2J_E&qhA`bJp3j1(rYM;e_AgNu07^YI zSfjqp)XIb^gk?8c?$C(yrQ~Jq9*fs~Se7NB6U{RM6e8DTAGtgfyv{5Sv5sa5&_y~I z`Lpx2EBks@!)o_u%PM7;rV?V(x>v}W>F-QRt@Ds|ayD6AB6}V3-|6q$T|8_q%%AQv zcPaVKoRu*0i7}9H+Zwe#4aTZzS2e+5t>tJk#4#6Dl`DTbhFF-CJ}p^BLK`&1go zqlCC~gVzTue{m7E-IJ?C^kKZAff*X0mu`ft&c&6mpwZBwm`jXGeM)sRKmePgUynhg zlB5>WkCx{WQU?$W6`t}&Bq*#KPdP_CB|5!(Qxs^kwR9nLPE=RNy@B+8Ze9Vd_;C7SN0YoKn z%sEJ_v(z&`ww`9(u_`aW+BYwtG2xLZCp(@~4v&G!@`=+Bx))a2_*6Yg-Q z=21q-pm-vS@+>_0Po%QX`cI|WKFn`L3ws=>#_hpYO9NcNEB^Pbal5ftiRnvFF)Mp4 zTk;z*u%Uw|F+YuMVb_M?SJ+c8uRWJG40p+UYr{Z~P_7NbL&k=o*qM(l>pk`m8kE*0 zty96%jl1T}n>}ad%o($%&zPQ^o0z8d4+lAaL8g}|r;tr{Wv^i_FpH2~*<9{C4!q9G zNbWqvUq55;3bFb6(RGDJ1m~dFVRyk;ZfZF{hD(i$T#b$M2GHa+N*GF`gb~&#;bSyP z7-NkRT1Kejz1fT9;ArdYqQzoWVElH$vr_0`e2iVfU@=P&$1oMxxgXEndz>b%m{{St z-s{54j7E&D8Y>QcB!#=*j}!-wIoR_72Y(}>G3q#@a(?A9bTTQ5fjQM#H8-dWYC$1 zW_Q5i;p^5e;(X8nPFLh>gMm9mEhByy4u$@NkJx8?2ylaIZ$fCD%P7=KfM`6}2i0ipYmL;|4k>or@+f(~~{&cQH+w#!uRcvGL(5)C!bm7=;hDUdu8w5%WDMk(+ zsUBKh!b^vNcwd=-ra3;V-AbHM^ts7EVEPb$OI8z>I0q4ifxyta;-d;umW68O&p_8S7fQ`)x3Inxh6+rTe%;U5L;uLRz>&?<81B+JFW z*1)&9@UH=OBrI$y9QA)C4w@bMk#ZCD*RfDn;o~M-gd{5@Sw@T1rz!r2)u^nMuPHA4 zrGWjgz@M)0y$XLX;md2~YoZH(6JT!__-=tGOB3pMMfDBlmc@7NFCq_0 z74Ll~40)_Td@l8J3Wv@PlfGwyfsW+f?JSEv0Qjsi+_VJ~1%Y{<0k*sdnc0>tY?+ueGD5$ert2qq6uTCP#`Hci*( z^uky}+6=*H*A1DX}V8A3v^f=Y=J6Kmdf_hPSZ=opnE{XhEL2Dg^jRmsBdm+ zsINyR=3Ly`hUM<6t~$#KI)_A4jFFORUPWIJ;i4Z(6I}g(-Q2Wne@?}js}?`au=r0$ zTHK~=fo4C0t($mv8b2n}G{Tq|yH{PMx^d$Wu6m(%(7j|#nm}kkt97GJY{xQ8^ce;6 zWPA&XQwY=6O*m#E>I>$VhMfoR9ErEWs~y|309IZ>M6A$wQF|f9;i(dHtC`0yUM%&| zfP>`)hCC=ZkTMND1CE(kI%UCn6~nNCJqHU$7L*mGdNubCld&~EK8@9_ZCY)al?y{< z)jYiCXAyfvfn`RFq~Jz7j}Q+_qdnyvpof9E(Zov^^W!re$*jPZ@Y+^;?o-AOj?_4H zy6t#;PpS3>mw&T1*h;9H=IdO0hQ`-#ym4nYNm*etD(S(_qr^y)6bxQAFJ~|@L^LZx z`i(dAAuN?v!uS}N&=%0$^N_fVmmUzCB(U=(Dpt%E)*Y0;p@`LRlsB2^M%a?otClT4 zt{H>HnzcAiL_Muh2)IfMCboY>Vv82DUhc84)@C+1S>#CMCH6P5%(hG( z{rP|!{rS-q!sHIrERCmH^?qT*t%Ew=uq4Jc@T9q>M~>KudXq1yaR&2Zl%#$Xmq#sG zx=J;d_UiI<4|JzYby6G#0j7c7?A=nEtLfHI7m53^;EOAFdN5rSbHv(J%U7>zK5=b* z!^uZ!3B69^Qy`mO1-1gynDdR2o!el3tsm)tIxo&LofLb@R40T)d;d;47HQ!a88xTe zWmx9`Xti)q@lw^%+wCQAYs*X^7RiPft|7-H=fmXdk%ZHp;HI^DYQZ6jKRczGUhz&O z4Wy(fl0zz}qf_0uFul{DBp6By6ZQlT-crCalQ^S&*S~q4&`=y9ZcoZI83P?+(aP}1 zZFQAKi_nTr#o@@u>;?ty|IW}e08Nf3PRvG8fH#&dU)sE8bz{?-)vM}t?9Qp8c0IK|gYV@<8H*Bbx1ArY4h1}ju(5X^=PR@}drUd7#p z8rThVU|Z9xBPqx~Z{!L-dGFD?m$#dF1nrCMSV&&n$H%cp3}S5^xD^I_DHy5XrBNkg zm*LG-Td=gw7^~BGq^k!4n|lR}+e=L*91mouf#`;F>o^-ZV;aofAb_FQr}h{b+b@Tb zV!A~BOl{64Dl*6DBZhb^ff=CUot!N37Gj;4TEuC?38yrWrexX4O0_0op_fE;O=l-T zFklmjPPT3ZNnMr;!v{^JHf5KA@j#5eo2ExLfkC5M@L~JbtVP?TEgrG(Isj2q7_BTngTpB=B#2_Ua#Js_-E?j%^ATMcMK1{ z_K(1B{jh8$vYj9cbp<@1>aPeJfoI|6*lKl^cc9nwGK_>+SoC-DbT947)wc+b^2Q>| zKxi^FPeqWc^&UN6?~UPz3N!SW(?3?U=1gsW=G-4^)=f@$oI*<-pCT?5&Za!)&4Clbf2PM z$>%h4_mSzGTVF%ag2#$o^JmSRoot&sJuz?g>{*F9xDN`BYRd`vndecIvI;n=9sI$p z5%4Ohr5S-6bi#7BBN1*rv+7~z4rbDgm*+Qgvio4xK%aN-@@5j^BfKVzmxeu0irk4} zm`lS(hRvm6S$mhV6*vPsVz|gbHYkTx4qL!&0EyU$m)#msHoELcH{v?HyhS5$sUuj2i1{mHai+U<^r53`xiLtj z=2Ek|*AaI(cAprZ7(IXVCO5-syscpj6K?h;bS{>ii{d)E4_kQWl186~s3JXbo>+OTM9c2xK?Qd=57Yga!?_>h?QYVgaNPwUnnU9A;j4HE^TCOj zB;g+eUfl|Z<$eaRoAJ}$YquM8PYyS1gih2}vxlySGHx@L>(*S>6lUSz0H3$W^7BtaFu*?*)6xz))9C|+c6$9CI z0EAgpt#wb|Wg3aFI?KU0> zkOcyEkb;$4u(eyfO~%y#=@76H0#@vd#J5vwU|YBJZ>bIJE?x`Rj|==TfiH5(3}|9& z0xLQGSNEm-q%i-WISy0w&wzXG}W7+d>?KJ-*TSR5%BF5Zg<) zds~MNVh^+F~=7eOwdsH~Tmt$xT z26lv-52p&2{_VeXQjVlTe0TSM@^P_(1@?aOH!}`N?RRh-?4Iy^KRJO%>~uVTVN5dfP&I;avO{mI^kt{ z{p8Mg_r}RbMJ6Y^8MaN{5R0ti8W8IvNY0SLAx7dLqNwxY>Qja>yzN<5$J{u8j7x1{ zH?&~1v@|j!>n>+=Ve)3q=xVV8`caiCH44rSDZ=ldIB#FUdtmmf8FuktD@7M6HbENh zaj?e*`5oTDjFORi5LgYfWk9DS9CfUzI}Tn9j%`n+7PZEEEt++7hS*Y|F^t|1*CEKV zUMw-~HjP$-O(VM^T694>5DVb6go66@9?kZh6tc1YxRuoRoKSyqKEf3Qw!MJzb&$y1 zFJ!6yD_HM)!P<--cCwdl5@inwh}J*Fc1I_|=Rbo@yqb?PY{52tioe09Eo&6pJC zyBK!?Gdo5ygN*wki?-CtxW!=+akKAr5J~oRNJDSoLup{xLBlApil9}Nb7#ZPbk_Pg zzOw`@+}ZGJ;-GkSA$~l^2j_8;IRcDy9DgV z0#@uihHvK~1KV2JUl|lUz6RLu3%t2CqsZa)7({zWI^VN#i}i<0!-~5QtxT5EDu#c!I|w#I6vCZ);ZH(X4QfS(e~& z`mlWw=NKhH0HNjh++Hyd)#A%MY&Yl87mn0)M|%{ZWDG;%}zxY9}`6Psgl_+IxHD1BEn}w_=g{Y89PN@5tqox z(eg0idejIf8=rsNC0u(voq?_)Zw&%`t8r zX%G+MMXG4Y1aurLf*{M*u2^9}Xo-{;q^W-8n$-<;4JR8o_`QMuBkmPLte%2>AkSuw z`*y(>IQ6@e8^Qj1WOMGqp}BR+hRLp9cKrG(Ltm+^CAGh{xe0oced77V)XIGd5-B$s z3}s*}&}LHEhutND4Hzz(lfs#w0n%k>5+Gwvq$R241K8ZzxeoU(;R-uTE8V79z~!wm zRN07)Wvrk3&33Tvv2aP5(RC0vGm6N z4NVrzDO;>tar6uOnmm1oW9^$|$Ch55fgpucIF4vC?CAF6qK{d6oH1*1T?h(ccvjyo z0nH0BeM+_R&8AcpP&2pkN5+6emU|vDvDHrI!3r+U9{c|)epB6W`%A|)> zca`~lF6ZVjIEhQS(*mo^&Hh#9*9mlwEc~#_Jc6st$+F6vHEnL|^cizzC8y7y+d6I9 zd|74kD1m4Gg3-IKfX#03madBda-x7;tzayjfURxtmae?P^lSmULcofhEAj1o zz`(XP^fv^Tu6F_Ueu2MS;LY8WMB7-|=q+8}0!SIwi51Qz3U;Z%m^i8YByZ_D0w7@l zyHLP{C?`!i$y>S}irA?Faia&Zu5_KZbd4hRXn{CavwFW~wJy9aYw0=y`xXBoo%!*Q zDtN2{<~4gqVeUidmpJXnttUBrQ0DZ2+PR5Ua%8(qGgKt{UI(<=f%iTSb~+2ucEB3Y zLdDBRRoCM37=PMhU1K78ouGF9zY5I#HLs`wa}zi)N)d?{FbC(A_oBzR^U9^1Eo8I| zbC8@8m{+Fy=an-FnX&WAZ~62*pLWfiJ$G8`EC?;h_C#{ltQj(|L^-cKgdx{xFN>}) z+sOR;lUf7^+MTSTIJ;V`0)!-POdiz z!Y})jlQL3YgX!R7oD!Ub;%p;M41y!eMtURl*8%ba0b`cb9>y)$?2+C`{R}|{JW3cBD5_mtgW3Clko~1gzL$`J6QdwsmCx$lyqQ0$|@K@aqJ=$YCq9kfSO`c_Z}= z0QrP~H7VFy1sh#H+8e1q1&}WY*ogurBlYM>qrH*(ONf0?Ad()$n9?!cNc~;J(paIw zIYF~pp;?UykI5RTKR@a}Hd5=QPiB*o3c7cFzR@sxE?)n*ZS(-m29#ZuJrx}lYh7=@ zvnF3x=3uI+;hC(nGk!)tUAd++d`QOIxfe!L?jRIC-~#RqmUxs8X(0|24|;mh3!##p2B z*rc4A3?|PfIQx^E^?XM+7ld1q+(-mraK2MEfP?2qYqX^B9b}+U6$1`S3 zL*p1=s;{$cadJ5<`e8uW!*c*TK{DAwHB4t3rUQ2^>mk>P7L`A~H=RJTtP-xbTek*> zG#Q|bEWy6=o$zc4ZM!!x#?yflm>iq^&VsX&*>ThjVBKv>1DgXb z>2YQQ&b#`=S1}jm=B7R4dj|(Xv|d4)w%~XnFC4<6+(oB)g&+c+3X%`jS!1q{(G2QLw03v((?THgSn5yXDMV?7u!8j3?RqYT}TgLTkFaRB%6C`WBW zadZyPdLu7OiG>Fd5-}YV}WnflYWjfgy?{45S!CE8ISWP-VyY?5a57iav!MaU}D81`au*# z^!U=oc-Yc`bNsMf>PE+jX)mJ%O2#`=%^ZOb%0=VZOpc6D=ZG`Hy<2-bpu2>VR$LwG zo`?~1`x=-R@gf2-jEbyWQy1~dY#57(`De?tqz|3E>v+@Eh5QR-spwKsZ)#zhb~vR= z*LAlwCNM;F=Aj`hA3OW=(uRW!*R4xL3dsvXd*5YxH9+%p)OuQ^4GR%VOeLYd-oz@Qw6>^Zy9k0;gaxNvcW0||m zh6T|?7fi}xDk{X*5uPi0o6suHSxayO=LE|`<{XBZGIjjG;7ju-4CxrJ<6d(kWfMnc z{DYs!e>`+9t&OlJ6Duk?wSzSAPM+tX-#fEK;n5X{sgW0td4^5l zNns-{ZXu(_<>FZW63(t+ne>bnUSRx!X5QmpfZ5|B96(tBuL5TLH3GFgi!ApuS~|G| zh91LxXOtP9oE0<2vvf=+Nex~dN=#!@_5p*eciEqC!6&|{$~rsBcX@{-M({5vAendO zZ6GI)snx`ekixCDfuzOFZEj}vT%#?wgrl<=IRp(RBZxPL_F23`3b@P?c)Z&Qk+?%6h95fIJ4Hi1+w&S>PeO=&BmD~=PQ4UQI~+RFOK}=ro~{w2 zri^;8-T5&mOyVO}bL%L+a8-pf7R^Bg-@*9K)h)hgb&GU!_y^G~jxh29095xlST59+i{S^u+{+D7tN#>iLVPbjWGb7fg?e6 zJQm~((>5t%n?UWkzHGgxn_Ul((*$g=f(@}?v)6mN+3f(iSilA;*Z~%7?Rrl)dka9m zBw)n?R_v7E+xZ(eSw{?RUEjYxsGI#AU|$#be*uJy6H>INRG#ALX6HZ&T8~eK^G^kP z%V112mp6O5+2a7RO2FO}FwxC6PippbvuhEX5QyPYK7nW{^*OC;M{J)!{8h8!884Ep zCESvwn=ON(sJdKk=)uMa=McsE4x=A{6Xr}; zXU#D@uT39JkPqS6AHH&_Tr`p(4tdLk3)Ec2+r`F$`Wu@QmW~~8M$PL4;5m7}@93eR z5PKWDQZU*u>zH@DrI(A*ENpQbuwUDl3s&6@-5rQ!~z1x3%wh@~wIT>$6cJiR!EdXJ? zO?{=u><^7H=}d~`Hmq=28r+ZLCB~u~uF+$L6pNMXO|soV0g>O1jkTMojf8S^XCQ

wex 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Μ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%0An$M?kXtBR#ro; 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 KEGFu+R% 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

)PUdoj(Y>llK%ID`8^)~} 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

Ow_ycen!{odq*Sf2!NiC_Q^rJa>r&JVj=F2>< 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

6aYtVhCP!-Y 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 IRqyV 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

C=Z)h_8auZtn}U@CxA0>Y4HIoNl>>YWj4 zBi{jw7zLt{@APVd?1K&6jM~R9hmSVy2otrm0=kRNPFug-58q~NB)n4kI}MvWcxCyP z)%{~XB-U#{#V#ewZP24I1x7KLhQ3>k@zW*-Y4B%xIpBa|S+$7^HU_&qZg_(aTCSfR ziANBk;1pznFl3wG0$5ztfdmhi&~2RVh}9F?y8_ZMp{5G5BzpxnKyoUgHwU#bmFX$a zg9uSCl(gCa^&o|YT}oy_LJ zr!|Uy6<4Tdq2x$Eu3Nh;m5ufl9>~K!1aMam)8qX@-OmP6sQTr5Hcz2Yesk5gIC#P; zJCiWeMs%^J8im5InS0CZ9o86D$=u00$egTwS%EagJ$#kYvL^nwB7ge^g{g+Nnpq`h z8E~FNUFtweP{h03xp81KGi;5+)9#8@`!<9RMrOcMLg7vCo==6f@z>$B1P%__j8&-0 z)kE$T&@7Io71O9^zHAN0AA#P{RPKY!MiN^rTE28$DygSv3{XT(u)^?dsC_=4mWNZ< z=y-%UGWIzs-d3(gR#oF!XJ!JgXKn;N+u?79V-NyiY1xUwIoZ7oz- zv#gPiwkkj*$PNNBzK1FRgS+XcE0bwBXWqx7+Xd_Tw1&~Zl<9VtlQR2L=zC5tPiz6v z!M_j~;J!_@y}6=c7YsyAaAN~w_e1hu8#@t9iI1rj(mB&gwGTd}Su_<2)vm=l`48ie zdKVGOCt0<4n&Y3Hk!jRswsFOmK4+EFMpm~0{9pO>j*Z+*Cq^-v_ZQ!8~+NZr2o-tQmm0CeOCUdTG&)6n220vXq}D7vgFwq--_oQuxvP|MyRkzf)=W3Itc|QgP)P;{JX42Jc8R|sMV3`y zU&Ff>1WoQIv8#x`1s}3kobA?%;J>xs zFy7kl$iAyWgq}Lb)bIIm2u}|HyFVP8b1C;`46}ntS~XNFHlGOBXsGp&!v;p6!(dn| zo{L|afP_4%$SQf_YUcjsWiYQ%mY^FJ7~*IQPHdERIJgOjDPy(zB$PLM0D|g}Ta$;? zAy5%R71&7V; zPF78Tp%SNv!6ts-(fF4RE_2?B1tYg5=5J1NLna40wXEKE{MQv(z?YX5;O0l}P5iS< zZ52|&uH2o?MW9$1ol_YSF&m4Y8XdG3P7?LXa3y>|{8#wEN>hEJ$m~;jVJ#~w-k_tA zArlyfaTf4tDarMs21sog>LZVN=+~Xe#Ht@spQ)l==*XV807^tSaCwt8kUAu?*_sCd zF1+KbtPP|)WAdU}1VcmUkq0cnrY6^I`_X;1F8V4|2$G_oO6l~9iOvbw0T2v8Iw??a zMk*D&oE;E_ut-`WpPu%cwvs)7E*gY8`JxEhm5&ef$GfN5dZ#*J68d7a>i@z!y5$uE zK}Hc8+?%@HAtLofdxG@-_%`iaRV(fX$@f9{`&0P)b3^NWXuL-vka`?~_P$XN2RNUX z+U)$G0$VU+S%Xev>veyg##^fI^K^d->cK&VI>w> zk`?Tiyb#nl*GXCKfoM>&M!}-J->z+akdtn!Jw!LvkHQ~)Q=~Wkvq-y$7wOqc(+5`W zzX*l>2?6-kXyvCV&OYG5T4?K|1U&#QkVcy`0jaA$4l6CFp8`!&jR?e`1=$h(x)y}M znnF#7^emr_&U&%}_50y|337{8ojdo=y923nxz_g%R$MEfO6&Jge-Bgcwcfk3brPPr zT;tCc$6UO0Uk_Zh>t+r=4*V-RaXN#fC8hV)op>mT2-@__0t1IscZ`A6!}u@#;$f_k zf9KeA={JU3)UQ%^#X(h>Z5UPc!-jQUJYpW_#bf>3y&_ZJ3eRc(EmF;3kf)PTK0(FY zi4FQT)9zsPiPZcR9V0@7(NsSaR^6^PfJb0AeWHLzsq*=U!f$I>j#_n;~fUCHix(Kl8ZXEsOhgU)K_U zp5X|Ke_wKI@bS)WjJ+kClsH_8!Jm$Fa;yr`mE*(0fI+YD7i9J)947YgND;I4^c2U1 zJs9@#M9}c?*tf@)8Ap~z`v*tk(Qt|6sq@nV&TsNG)W1q^wL~!DGxyPjLv;^^#GfpWhvqmS9FyDycmMH|r~g+$X|Pf@X7Pk($l zjau{TDN>1X`QNAI%juu5r|*h4)AILeoyr$)RYqhH#jiLaA8dfvsOLTt609+VH^#YI z*WMD7&(Ej!vrfiU?ODA%Bi4HRTm7wp3`-SnTFGrL2AQSt2(OL55{j<34!CSzXz+CnH=4}wXN3|o!yk#0!MTjihQCUMCe9VvNS*b+MHTU}7q4<-`@lQyf!;*y!^ z%vXU6fs}}-Rx8A}HDgRuAa538+LI27rNPg7V5vaChzf!d`w1PkgLTtvMHbeW~d^hD{8ea*;hlcB!Xf zA^`PmH(RZ@#+MDe#6SFbkIYsnV+Mve3k4H$V$Jnw2fj z3G~P?L3zfnnY{}05(ki0+HijNqONS*ZU?SU?zSZSKeoGY0ms$epQG73jA;5J=k{|u zd}%TFu{OrSFO?NA@ETA-Q21tQQ`A+)%s?j#*a)29)+0x>nV|!wU&{R8u1YgM^f1-b z3;-6qNu53pWeocKwaU~%bh{MDMpya7yx1hsr1Dh+kTrW85j5Sb7_mS;v{!Z>!$Mj_47jLX?dEb0glv4(y;*WNOv z5!1okxap`wjS*1|7t&#=FUD+V+T;?J1)79T9F>&oU}1Hd4G}P3ZS?Q7w3b_}L#(T% zq;lG^&7l-9$MRYCEscD5Tu1ARM&>r@McDFP_Y0|%rH$$0OqmpQ3el=^rVvQ3%cN8I zxEW_-461ulII%w6o~iF$YGNtDpvMR1GIc`oNoZA~X!CmtwT=4rA1= z((&7DKzlx*Jt??)#Ud{n4m324g>$*dV7b>EOK{`v(3C&=k$?cOT?VnE;NRU8{7bt# zK`n+Ta0M|og6e-?B zQf3UyGYO6prsa0rm0m3fsjbc_UT{+wy7Tf?$ao(@aiZ8}l`Nq0Vx6x>XI^MA1Qav; zbs#*r;R%)+Gx)2B;Yu9M;~|Yms zxPl5+Dj@Mixn&_#aF`F9AFe4ek)OJ@``kJox?3U{qOzi=lX6-dL?Sy0MD}Aj=^m6H zD{9*P$S;xITeSLdd3pVI`1_syMu$Xske+ma?_)^@(@8mTo)<(DuNJIrin%!*3PQX@CPiX%=}jgS6rXQsI$~;2w8c`H97cT8H&L> z{d24Tt|F{7G(S6oI)5mSD|gWG=5c35B{jjTz4@W;YxxiuhI{-&!Y@H{Zua5@qvC3& zlohUE`@joMH*I8|A|o)lQ^xyJ2U$+r#a4N$WiL*d?8~z=tv(pIu2tu+kYKCbKFv<3 z&@55}EnD!_oC>GyFI%E~9~FP~ST-OxyL3qfQ8Nm4Cjs;=&7u`oCO{oTk0o)f+FNXr z!rFc2n<*G{tmRM?%tEvsK5unj+8E1nzWJd;@Y%c#u4~kc)k{v>T}QdCm5;^bT5Dq2 z6pA_W9(nXX01t)RMK zEil_YpZ}+dam1C4YAxFr>)H9s{&CNOly10xddLY#EOg(ef(4&Oj9fb zF`XYQB;&)h{i*!yFTQ*#KTS4TSl>!M9QJ?KOMO6~2NuQAV6Q*>RCUa-=Dp!~ zR+Wf`d@4`T)!7=K?8hgxDES({5P^46d~)0jBHQ`r<>k-3{~+!DO0p`dJt9Ux%9e+{ zRvkouPg6c~*$xgpCWHvP0mL_cRDAH__W9@LGBl%?lQhV%0p4e5U<$$c9AlPJ2oApV z&xIW6IC6a-c|1}kS(>!PTWST*d#)u`xn)`%IpD)pPC@LfNn_roNpO`wm!vTF-s7`B z$>18AY1(roG~b&B7UsLOZjSFySfRr%p4m;IAP*l(aQ@~(GW_9 zZ&>$|H!QHN&fW4#{j2+kb(eqR=01H^|0>u=*WW1yZL934zIEyP_8#g*o#>adY? z4i2*JaSlL6$=Vit_Cf|;dSsBIYbMHp+xqLrenHF~yM)0{3Qtld=|7Nms7bB3Umy`IqlyWzd zQa%$laA)(b9YHAXaQS=5QHOAvoH^VPP{K>Lx$XQrhYT8{N4>QiK z`t9P%>W_D;;jvZmuQI$wy`q&La=UckpR!TMQiCKN<0%W%&eC%NcZlC{!;|9esi(QQuTS)uTz11O9;dK-6LGhhHuaD?10YS z_|cmLK3Ht9w-FxqB?6I5Y~cbLu}lv3S5QQ#m2f)@z}!_}Huee5jEv@_Mj4q6x&p0i z7r`PEmSK`&{J%h;R+#gK9KryLhjj>@vLb5d)lfB-c!)ZHqE1W12}#NTJPKT zw{DmO_R8ip0XNrgK_aR>b4S6(8K(VF;ee861&)KsIIxXyQCf?%s?8fQhnwk!ORT>2 zh*~5G5mpkB+~?psQCFQPBv2|DifCq{&%6O2xmDDKO7$#Zg9+ACp<=7kQ&S{4rl3WW zH3mv;dha>f>FfsYQ`U)Tr;$6>63Et!vc&D zD{P($Ag#Te4^k^cT(=|>_?`wdi{cwqe0aLwC!=r%DGK|#L91uUStI;VUO^mL6RMLZ z8}0)(uMHq3>iQ3kpm;Nj9S;r|E3M~{Y+(-79d^Npp4+e@c2LUTOcL)CSSEtx4- z+DrRf0ZjR6A@BDg$(!d(N`tp!tpb4$$6P=0BG#5iY}89l{`=qmYfgm6{8S$t&G>S( zWIjQR7`3eYbVSHgFUFc!oh6+5!^vo#_1v2r&TN=!&l|#ZEmOli&lidN=6|&jP<$CA z2Q7jmj<{MfOct9ws*t5z}8due)XtmnUCJ*1=1IYCabc^kr zdlzb|ee!>8Lp1gSVziy&F-Cb+vG#;c<91eIdFOq7^AMd8POm$6qxRcmf|IW)-)XV3 z1kS4URDVQq^OK>D4-gJ;I61{Z`EW{RQJwxsB!uyq{vD6qf;5pZaJ+N{Kc?MFOp1Oy zmGwK;ZtIFQxe~mN6pk*mrU)k*3Wj26(=Sd z@8fBP-h`tf(Rl8AeoLx)l@()LEta!UBmFs~ddEkz2j&IocsuYixuv+K04@p`|Zie$&HhZ8?*V&w`)KA@WZ$EEnzWP z8)7hx{bY*u^eDnR0*xq=$;3bwOQc`#D3x0*@EipJ$O6`LNbJ1Id!myZ$efesqr=(p zd@wqE4i^~Dt0gc4L*AkgU^ItSP7Zc^*&h7+xQVN`$@(;7@bfYz9JU3#Yj*Mgx(&hL zZjm_0-r?yqNe7yvVp!u#fe!iPF#Zn6m;KCqK;h1+^wNJn8xLgPe>e>fjn~hS9F9in zv(MEB@uk?rli6!!vO%JcrG5`;{5AQ1*?afc$kOaStanF`xHXm~1vAr%6z^^BX1X{- z7N5=TW-qth)6JggnI3j8$=T6}YO#w|mt+l#Rh+t2&EfViSt;v8upPs;lsIytI0k|Q z@xp?Qyx_!1{)m9U2oNAZ{z%}!wwySC1K3tG%ja?GA1`AoQMn*Dln>Em1dR`Z{HI+rV;H0ptUrS6go4JkG;~Zpk!xw}p+ghz zl#~4}Z}lQC6JdDn+<2B@o(2JN9o|6*`6ArsD6Y=|m`i^&oqkA&i_rvwz5<6B1`8;g z^l8S3aUqe2!xV^-Q1i%mM2zs`iP_>Z*5JGy55QmCn%J+oZJeW8Lep+y@5lz&5~1T% zWDtz5)XB>x+F+O50`T%I4VpTo4X&QGHR-;zskPnC;h6@Ou|jE6>&@O7C)tx4<&BZA zJqy6N#gUaHzo7fAH=qO^+|tjydymK3)hY7WCJD^g$NR0tEmkWGZNGI7yxCJU*J8Dj z=79LfJ2P;i1BYjZnwxGD`}=E%oiH(mPrf(n90g|YVrBO0P?$>8QEJ{L%tjq9=OB&u zNhSJ!|`tD8pog)= zNSh&<^A^{(ir0~#)hp9~Ks;+K3D>DeNYzY)h3`0JnbB)um6ai9*bc)oU=#UM=dqIp z5UhFE76HGg)%;ugq}9Z}4MZS~?68QXvhe^Z*HLSTV9{U!p&ph$+xllm|7g5bXjA!4 z?5=$(BP2F>Jr9pQYrEkP^kL z3j-~PG0uT(Cjv?gGGqve-dcfrY_X3w;e@v^ryZDCbiP~284BN5xU<_DOBXNpjU{C3 z#>a#P9>Db-hIPa6L9_3k)Act88Qz?OYbLfq4zJ-%y43e@Ne9D)i3$WRsYXn`2=7P> z7g!%6xNv^qo{Hhp$i4Nbw2k1yam5p{YA1(P*QgoMzGDc(65=5IZGx~5phMYPf=3

|pp7U(`Bb_CN#KqB@{*SZCwSM)JjPytGj`cbeM_MPg}TM^Xz*Wf6k%8m-4r-F9r@ zTAz*#0;E1%Q~F>3S$9#ckE;bA;GzepTfPY-rDAwS3`nk2%7E}iyF)I@c=>S;rb)>M zB}{C|e0wQ^e0kAQR0(!~&3#Ahsg;R4op7C^PhBeAAo^MOMssFtIeP=dFx&X9dk9N6 zE^*oC(385u27bS_eft9UV!e=l=-Z?VDTQ8zq-6gsKQ$x)FwqSOfb;0KYthZ`C7s7W zPAt|ZT3Q@$ncX6i*#h7}?@CZFF+1+*CMg_rdv=HHxgo#$s^Kj6eBW&o%iLg1d!bdS(-dj3!r&1%&vveV5D6G4JeITBP zIGUkt5@*woIA}nbv+gc6Ha>cIonyxzU`nB}kGPULcz9~rS=ed7ZBnP9e9ksJDZrsuBL&@PVR9Go88>oQ|~jUneXNfD!b+4vx()*%g2t zSy!M0XDm-bPv*VB_`=*ic5kwEOa!USh%UloNWKd&AIP=@rn$~P1uPMcLq`Vp4Ld|T z#yrpQ5$;Yzc#>bh_^qGD4%jVIc5xfvhmV5}9Nr*0>aC?+Fl1oafCM^>k1Q8fhbJDn zu!|QPsCw}t_%MUmj!~NhqJ@o|jxa;xasG`Jc1HS~u9^Fx6A7uJwx zgN_W&Di;fo+;x13J19z4*5h=HlL`&oC)8z3bs2>*l4Zo@NU}goT7f@>&V@}fgR{$s zL=$;N$qeWtFuvh#k5{pqdz&Bf`4dh(w;R*kZY*IN850UdUY-38ESqE(kB_($u`zQi z7qX0`fk#Tj(ceb^%TdXa9l0fg%Xx9hjvR#GX05Zb>|?}AGL?`>uNH-MyvCirG4YYE zmYmSCS|4Gxa2$6rEc_{~7LV+YFmpJ~8btocE?Uio<8Jx5z}OB6ji2Je-=U&c@LZ8*V8!fJD_dZk6D|t>L)9*Sf5?>?Zt3 zuP(Rs*cCKuY#NKU#&>>btKsnG?}ka>JkR4UqGX5o4_ zl~HeJx|lKhy;xLK{JdyA#sBC^VXDl!6WlzQ4t3f0FcPSmo&dpU)T`OE$H@X^z3+?q zaB%x}uxyY74+&nIJMH@_LF3`pjp@ajhsL`N9fMYjeC>GEtKCrtEc%Se)vvs-9;0

dE0Oo@z0%OkuoJE$)DZ3# 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 z J^wnQ@A#u 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

Aongg2RJNTLr-NVoA!7*6Aop& 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