diff --git a/frontend/package-lock.json b/frontend/package-lock.json deleted file mode 100644 index 1c403a0..0000000 --- a/frontend/package-lock.json +++ /dev/null @@ -1,8149 +0,0 @@ -{ - "name": "@th30d4y/openlearnx", - "version": "2.0.4", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@th30d4y/openlearnx", - "version": "2.0.4", - "dependencies": { - "@hookform/resolvers": "^3.9.1", - "@metamask/detect-provider": "^2.0.0", - "@radix-ui/react-accordion": "^1.2.2", - "@radix-ui/react-alert-dialog": "^1.1.15", - "@radix-ui/react-aspect-ratio": "^1.1.8", - "@radix-ui/react-avatar": "^1.1.11", - "@radix-ui/react-checkbox": "^1.1.3", - "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-context-menu": "^2.2.16", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-hover-card": "^1.1.15", - "@radix-ui/react-label": "^2.1.8", - "@radix-ui/react-menubar": "^1.1.16", - "@radix-ui/react-navigation-menu": "^1.2.14", - "@radix-ui/react-popover": "^1.1.15", - "@radix-ui/react-progress": "^1.1.8", - "@radix-ui/react-radio-group": "^1.3.8", - "@radix-ui/react-scroll-area": "^1.2.10", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-separator": "^1.1.8", - "@radix-ui/react-slider": "^1.3.6", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-switch": "^1.2.6", - "@radix-ui/react-tabs": "^1.1.13", - "@radix-ui/react-toast": "^1.2.15", - "@radix-ui/react-toggle": "^1.1.10", - "@radix-ui/react-toggle-group": "^1.1.1", - "@radix-ui/react-tooltip": "^1.1.6", - "axios": "^1.16.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.1.1", - "crypto-js": "^4.2.0", - "date-fns": "^4.1.0", - "embla-carousel-react": "^8.6.0", - "ethers": "^6.16.0", - "firebase": "^12.13.0", - "geist": "^1.7.0", - "input-otp": "^1.4.1", - "lucide-react": "^0.454.0", - "next": "^16.1.6", - "next-themes": "^0.4.6", - "react": "^19.2.6", - "react-day-picker": "^9.14.0", - "react-dom": "^19.2.6", - "react-hook-form": "^7.75.0", - "react-hot-toast": "^2.5.0", - "react-markdown": "^10.1.0", - "react-resizable-panels": "^2.1.7", - "recharts": "^2.15.0", - "sonner": "^1.7.1", - "tailwind-merge": "^2.5.5", - "tailwindcss-animate": "^1.0.7", - "vaul": "^0.9.6", - "web3": "^4.16.0", - "zod": "^3.24.1" - }, - "devDependencies": { - "@types/crypto-js": "^4.2.2", - "@types/node": "^22", - "@types/react": "^19", - "@types/react-dom": "^19", - "autoprefixer": "^10.5.0", - "postcss": "^8.5", - "tailwindcss": "^3.4.17", - "typescript": "^5" - } - }, - "node_modules/@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", - "license": "MIT" - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@date-fns/tz": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.5.0.tgz", - "integrity": "sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==", - "license": "MIT" - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "license": "MPL-2.0", - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@firebase/ai": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.12.0.tgz", - "integrity": "sha512-b+OL4vdyiSLZL/7dLd67V55CjKJvU9MpNmwnday7eA6GG2+J4iwUEsEHgw0/jKY3A41FfkF0SrnYFvtKbQZ65A==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.4", - "@firebase/component": "0.7.3", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/analytics": { - "version": "0.10.22", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.22.tgz", - "integrity": "sha512-8BSaq/QRGU1+xyi8L2PTLTJU7MH9aMA72RQdIxrbhWFauOZY9OXo8f2YDN/972xA8d588tlnNVEQ2Mo69pT9Ow==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/installations": "0.6.22", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/analytics-compat": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.28.tgz", - "integrity": "sha512-lIAlqUUbBu93FJMlQfslryQtBwwzdzvp23ePC6FNgymXk6Ook5v4Uvc0vdutvoIeqmyA3LfP0ZeRFK8+11kOOQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/analytics": "0.10.22", - "@firebase/analytics-types": "0.8.4", - "@firebase/component": "0.7.3", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/analytics-types": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.4.tgz", - "integrity": "sha512-zQ+XTgkwH6CY/eUSHJRP7e4LxM30RCxlCmob5sy2axs25GE3Ny0XdgpDscMTHHQIGqWkxPXad4w2Mw9sCgT8zQ==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app": { - "version": "0.14.12", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.12.tgz", - "integrity": "sha512-FT+HoNp1NdaZ/N26hCwV3WbxS1m6gTn3p2QRBQ3KH7YqyCQqJx0iT7126RgVk68/Rq+9DeL/zCFnHZ0C4u1nLQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/app-check": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.11.3.tgz", - "integrity": "sha512-aJ4DfubWfTO8/2vhEhIAizOoOmiycESTU32e+OUgbWcS/G3PA4Vxlr/9zaiN2wfUG2AptQ7DTvj00tyuFZP5Bg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/app-check-compat": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.4.3.tgz", - "integrity": "sha512-L3AKIRTJxT9b7cDUH3OyV8gWTnmW3vYkwdzRsukWt4kbPBTct12xalnyvHDkm1lKkr+cQq/4uzBx1bOWsQ2ciw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check": "0.11.3", - "@firebase/app-check-types": "0.5.4", - "@firebase/component": "0.7.3", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.4.tgz", - "integrity": "sha512-zz3i6e13B8BfWiLy8MABtTh8aGIACgKbf9UVnyHcWs+yQzJXgQcl8A46b0zfaiJHdQ+niF0ouAfcpuf+3LMPQg==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app-check-types": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.4.tgz", - "integrity": "sha512-xV7JsIyzVr15aA7f3Pi0rB9gdBuVubs89FGA8VkRYA4g0l78poADgdfrScgf7NndSg9mm7cR7PJyY0+t22KaGw==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app-compat": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.12.tgz", - "integrity": "sha512-Pe513OBerK/CIBxz4/za9atd5MsZtd6DzHz4cmqkvkrcDWhQChAoHBpZ3McuZNuSP8YZiKwfX/J1frR07l15/w==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app": "0.14.12", - "@firebase/component": "0.7.3", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.5.tgz", - "integrity": "sha512-YevqTjvo7Iujsa9Dwowmd6dSoElhzmD63ZSrq6bzjvQ6POjYgNjOFHLmNIgJs48eNO093NCERibuFnxbfOvU7A==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/logger": "0.5.1" - } - }, - "node_modules/@firebase/auth": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.13.1.tgz", - "integrity": "sha512-/1nkKY/MicI+I9WWcx6R4NKs77AaW9NQ0IwsFdUBomWrW0/cXEmopfM2dtLm2oI1qG6z6vom3CXZDHJIJXoMuw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^2.2.0 || ^3.0.0" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@firebase/auth-compat": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.6.tgz", - "integrity": "sha512-KDJ/GAf/rt7galOpn3DRb2buFfGkZCsHTryKjXDG0eeRnok4+2B4nnkMOMdjRnPkElmcJv2Ao0vEA6kp5m98PQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/auth": "1.13.1", - "@firebase/auth-types": "0.13.1", - "@firebase/component": "0.7.3", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.5.tgz", - "integrity": "sha512-1Li/YuBDBAXcKv7BzY4U28gontUmAaw53sYiqbaVOMCFb2lFKK/c3CGMUWqtwe7+TXrl3poWnTCL5umYBg85Eg==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/auth-types": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.1.tgz", - "integrity": "sha512-0c1Mnid0uMDfGJHeUS4zfvBa4/CedJXotGy/n/NZJnBjwiJawt0ZYU+wH2VAVLiRCEfG2ncCkAX3yd1/2nrB7g==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/component": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.3.tgz", - "integrity": "sha512-wFofIaa2879ogD/WvkjYXJxRmfnL0scen6ORgaC3na1FNOR9ASIUANQdhqQcmWu/h77/pVHY7ch5flewa5Bcew==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/data-connect": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.7.0.tgz", - "integrity": "sha512-ar9sNOJh5poQCSMSVlnVE8eo8+usTD1POWDCv65omkKUvnFMcdXaQ7J/e7WGKqJzcEMgiezSX/TZiKHZkItMbQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/auth-interop-types": "0.2.5", - "@firebase/component": "0.7.3", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/database": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.3.tgz", - "integrity": "sha512-XwWCa+E4TvNGpGwXrycLRNfdogADwFcvuhyow6wDWma9W54roaQIhe+4PM0KiLsIftBdSCGI7OKCXrdSRHbIhw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.4", - "@firebase/auth-interop-types": "0.2.5", - "@firebase/component": "0.7.3", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.4.tgz", - "integrity": "sha512-3pK35F1MAgmqFJQlf2nhQl44vtAXQO1uaCaQOEUI9kCRtLFqi7N+QRKR7lFZPg+xIZIyubgxQaxY69YgfZRZWg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/database": "1.1.3", - "@firebase/database-types": "1.0.20", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.20.tgz", - "integrity": "sha512-kegbOk/w8iU64pr0q6k2ItyNGjnQBMHFhwS7ohdWI4W+pc0/zhhdGXTdFj6X1oxItRjPoYOsSQmERgBkn/ihxw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-types": "0.9.5", - "@firebase/util": "1.15.1" - } - }, - "node_modules/@firebase/firestore": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.14.1.tgz", - "integrity": "sha512-PouS0NJZ3NYOZE/tPDvXa8VUeJ10Ll//7jIdFvMYdhQkd/P3O7nlqhyoTmY0h8Xa9hxg+H0j6gxUytJcoZ9YOg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "@firebase/webchannel-wrapper": "1.0.6", - "@grpc/grpc-js": "~1.9.0", - "@grpc/proto-loader": "^0.7.8", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/firestore-compat": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.4.9.tgz", - "integrity": "sha512-NPtBuFr79BbIQJXFWhW4xFC6rBksK8/ewqCTYbbAYfZBDDx0/iHTUj4WpKi5D4d0Pn2Md/3T/e5V9379G5N/Zg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/firestore": "4.14.1", - "@firebase/firestore-types": "3.0.4", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/firestore-types": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.4.tgz", - "integrity": "sha512-jGn+JSS4X9zZsrfu7Yw66v5YRdOLD1oyQh4USR0xWl4CUqV/DA6bNIXRPpxH/cUl3iVTNiP6MN7g+EL42A4qfA==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/functions": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.13.4.tgz", - "integrity": "sha512-oB5rpm2Emxn2+IS1gRelAeT/5tSZMwM/KhqC5LnJsmTNnS1ZDhD7ZMZNgCI8vchTW6PbaXIwEnpUryGuIQsNbg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.4", - "@firebase/auth-interop-types": "0.2.5", - "@firebase/component": "0.7.3", - "@firebase/messaging-interop-types": "0.2.4", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/functions-compat": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.4.4.tgz", - "integrity": "sha512-Be+MwhseVf/eFAZwGrFJGok6S7cmsLrAPK8MgyM8LjM0MewTsx2n01WOOca9jio1UsCZOJ0aVyQobnINcdNuIQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/functions": "0.13.4", - "@firebase/functions-types": "0.6.4", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/functions-types": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.4.tgz", - "integrity": "sha512-zV6kgqtduR4rUAdC/ilS7kmb93XD7bEZoJDlVBZqlOw2uGGGCNBQBuleww2rr0Ulr3L9o2TDjumEt68/l1f9DQ==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/installations": { - "version": "0.6.22", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.22.tgz", - "integrity": "sha512-ef6nn3GGQTdReCfotRMG77PJZu8CqEbiK5pEoBnM0gTu/Z9v0i/az2p3HABsa/1beQmmyh1OsOjf7P5+pgwdZw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/util": "1.15.1", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/installations-compat": { - "version": "0.2.22", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.22.tgz", - "integrity": "sha512-C/zpAuTP5S9OgKSPvXRupw3hoY/JZSlA1wFjD/Sb7LIQE0FNbcMdO8Y4KXVEkjVzma/DDDDIAzxEXqKMAzc88w==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/installations": "0.6.22", - "@firebase/installations-types": "0.5.4", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/installations-types": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.4.tgz", - "integrity": "sha512-U2eFapdHwjb43Vx9o+Pmj4dFfvcHEK1IirEFLqMtWrTHvmdrS3gBpBD1kmJk/9HjsOtoHZxJ2Paoe79e+L1ZPg==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/logger": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.1.tgz", - "integrity": "sha512-vZKLsqE1ABOy8OjQiE7cUTFn4gvaqlk88yp8N94Pk/sDpq61YqZGqmVFZTvOyflTwuYFcWirBdYGoJgbDaXKYQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/messaging": { - "version": "0.12.26", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.26.tgz", - "integrity": "sha512-lHVTO9uLofymHVWkYeUtMddIPcmJvSzVbHRB88W6XKfxbcKF+p3QrfqKhDxremSB4NQjUla1Gwn7d9umSMmt/w==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/installations": "0.6.22", - "@firebase/messaging-interop-types": "0.2.4", - "@firebase/util": "1.15.1", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/messaging-compat": { - "version": "0.2.26", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.26.tgz", - "integrity": "sha512-fn0XvWOfK4tsDLSipwJUW9Cp6ahWA6z+iJHxZ0pHp9MzMSUNQx85yuxZAuI7gkGXfqs7+DqEDHyyS7jDGswrmQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/messaging": "0.12.26", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.4.tgz", - "integrity": "sha512-wrzITQq+xw5LtygX7O0fu43/k9ABQ4x5H9/sR5m1SbNnhIRI5xd3+raSNJaJkYC4BUhM9A4ZNSnyR2sjhxnb2Q==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/performance": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.12.tgz", - "integrity": "sha512-fe7nV8teUU3OBHlMUZ9Lw4gLhCW2k4m5Uc3pfWGV+fl8uwJQBGp9Q3lqsJ+HSrFu3Q2pJyLAgrClPGSKyDeYgQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/installations": "0.6.22", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0", - "web-vitals": "^4.2.4" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/performance-compat": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.25.tgz", - "integrity": "sha512-q6NjTXpIPoFuUmCmMN/maCdTgzT6aExs9xZo+PxfVLj6uLVGvpyAD6XWjmcrb7jChsFBYbq7E5dyNDF7Zhy9kA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/logger": "0.5.1", - "@firebase/performance": "0.7.12", - "@firebase/performance-types": "0.2.4", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/performance-types": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.4.tgz", - "integrity": "sha512-kJSEk7b0uhpcPRyL4SQ/GPujLqk52XNKcXlnsKDbWGAb9vugcLvOU3u6zfEdwd+d8hWJb5S5ZizV1JFFI0nkKg==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/remote-config": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.8.3.tgz", - "integrity": "sha512-ggGKAaLy9YNOvpFoQZgm5p5SiFw3ZFtwti08dojnBQmQicpThTxvG5xZMSpCTYMj2o3gM/yK9CVd2w+kZub8YA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/installations": "0.6.22", - "@firebase/logger": "0.5.1", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/remote-config-compat": { - "version": "0.2.24", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.24.tgz", - "integrity": "sha512-EWZTt6fJ7YmPHodQNsSxAIDZY2x8P5kRPvXAc5CmzzBm+NyPFhODbfDsNllDXDL8jlzp50bVWjDY+BXepZS9Mg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/logger": "0.5.1", - "@firebase/remote-config": "0.8.3", - "@firebase/remote-config-types": "0.5.1", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/remote-config-types": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.5.1.tgz", - "integrity": "sha512-cX/1LT6KQwkXzck2eSzeKnuvXZCyr8qaPpDcikoJs7jmI+oBOXixpDLeDtWj1U6GNMkIoXrEDNoyT2Ypcyp5/A==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/storage": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.14.3.tgz", - "integrity": "sha512-YX4/YL6P6/fufSSeGnVhjWddcIXbFq2cWIhMKFTZo1E/Rtcl2mJj/BYUQTwJfcE1Tl8un1FOya4L05jcSLN/Eg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/storage-compat": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.4.3.tgz", - "integrity": "sha512-gruVqjtUGX8tEoeNbaWXZm0Zfcfcb7fvmDmBxV8yPAbWvExRnZYLO2+qw9idxNE7BvPXt5csyjSYHy//dAizxw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.3", - "@firebase/storage": "0.14.3", - "@firebase/storage-types": "0.8.4", - "@firebase/util": "1.15.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/storage-types": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.4.tgz", - "integrity": "sha512-BT7cwxJOx8SWwlQfrlC+bD/Sk3Cw+1odCi8UZNFNWTVZoPsBnA5W+mqtZzVnvsdJpXCFGSGQ7R7vOR6dtM/BRA==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/util": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.15.1.tgz", - "integrity": "sha512-LUdM4Wg7YM9Pq/49nGYySJA0CSQEKnGffFzWV8+6gXN7mGxn+FL1IqvFbuZUtAQcfZgHYDwCE1wwlK7rB7gl2g==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/webchannel-wrapper": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.6.tgz", - "integrity": "sha512-Vr/Mqu79dMwGRAyGbJ4uN4+BtXB3/mRTdzetD1daWNeG8QaWuzhhbG77GltO5c0yYmYls8i250iX73624GJd7Q==", - "license": "Apache-2.0" - }, - "node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", - "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.6" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", - "license": "MIT" - }, - "node_modules/@grpc/grpc-js": { - "version": "1.9.16", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.16.tgz", - "integrity": "sha512-wE4Ut/olIzfKqp631XrG+wbF0v1vWFN4YL9FyXC2LJiG33DsV7PLzURjrCvY/6je2ntdRkeLpPDluzSRGaVltQ==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@hookform/resolvers": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.10.0.tgz", - "integrity": "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==", - "license": "MIT", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, - "node_modules/@img/colour": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@metamask/detect-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@metamask/detect-provider/-/detect-provider-2.0.0.tgz", - "integrity": "sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==", - "license": "ISC", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@next/env": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz", - "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==", - "license": "MIT" - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", - "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", - "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", - "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", - "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", - "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", - "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", - "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", - "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", - "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", - "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", - "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", - "license": "BSD-3-Clause" - }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", - "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collapsible": "1.1.12", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", - "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dialog": "1.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.8.tgz", - "integrity": "sha512-5nZrJTF7gH+e0nZS7/QxFz6tJV4VimhQb1avEgtsJxvvIp5JilL+c58HICsKzPxghdwaDt48hEfPM1au4zGy+w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", - "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", - "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", - "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context-menu": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", - "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", - "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", - "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", - "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", - "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menubar": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", - "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", - "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", - "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", - "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", - "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-radio-group": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", - "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", - "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", - "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", - "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", - "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slider": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", - "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", - "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", - "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", - "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", - "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", - "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", - "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-toggle": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", - "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", - "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" - }, - "node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tabby_ai/hijri-converter": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@tabby_ai/hijri-converter/-/hijri-converter-1.0.5.tgz", - "integrity": "sha512-r5bClKrcIusDoo049dSL8CawnHR6mRdDwhlQuIgZRNty68q0x8k3Lf1BtPAMxRf/GgnHBnIO4ujd3+GQdLWzxQ==", - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@types/crypto-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", - "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.19.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", - "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/react": { - "version": "19.2.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz", - "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", - "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", - "license": "ISC" - }, - "node_modules/abitype": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.7.1.tgz", - "integrity": "sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==", - "license": "MIT", - "peerDependencies": { - "typescript": ">=4.9.4", - "zod": "^3 >=3.19.1" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "license": "MIT" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", - "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "caniuse-lite": "^1.0.30001787", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", - "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.32", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz", - "integrity": "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001793", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", - "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmdk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", - "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-id": "^1.1.0", - "@radix-ui/react-primitive": "^2.0.2" - }, - "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" - } - }, - "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/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/cross-fetch": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "license": "MIT" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/date-fns": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.3.0.tgz", - "integrity": "sha512-OYcL+3N/jyWbYdFGqoMAhytDgxP9pbYPUUiRCOgn4Fewaadk9l/Wam4Avciiyp2BgkpfQyBV9B+ehnVJych+eQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/date-fns-jalali": { - "version": "4.1.0-0", - "resolved": "https://registry.npmjs.org/date-fns-jalali/-/date-fns-jalali-4.1.0-0.tgz", - "integrity": "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", - "license": "MIT" - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "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/electron-to-chromium": { - "version": "1.5.361", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.361.tgz", - "integrity": "sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==", - "dev": true, - "license": "ISC" - }, - "node_modules/embla-carousel": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", - "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", - "license": "MIT" - }, - "node_modules/embla-carousel-react": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz", - "integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==", - "license": "MIT", - "dependencies": { - "embla-carousel": "8.6.0", - "embla-carousel-reactive-utils": "8.6.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/embla-carousel-reactive-utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz", - "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==", - "license": "MIT", - "peerDependencies": { - "embla-carousel": "8.6.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/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.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/ethereum-cryptography": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", - "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", - "license": "MIT", - "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" - } - }, - "node_modules/ethereum-cryptography/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ethers": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz", - "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "22.7.5", - "aes-js": "4.0.0-beta.5", - "tslib": "2.7.0", - "ws": "8.17.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ethers/node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/ethers/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "license": "0BSD" - }, - "node_modules/ethers/node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "license": "MIT" - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "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-equals": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", - "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/firebase": { - "version": "12.13.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-12.13.0.tgz", - "integrity": "sha512-iutR8ejvAqk6qUClnsPz3U3VIjTWp243AX4cD3iifak5t56to1J29xUIQgSDDzaAqKvhshZerzSahwMQj2TlvA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/ai": "2.12.0", - "@firebase/analytics": "0.10.22", - "@firebase/analytics-compat": "0.2.28", - "@firebase/app": "0.14.12", - "@firebase/app-check": "0.11.3", - "@firebase/app-check-compat": "0.4.3", - "@firebase/app-compat": "0.5.12", - "@firebase/app-types": "0.9.5", - "@firebase/auth": "1.13.1", - "@firebase/auth-compat": "0.6.6", - "@firebase/data-connect": "0.7.0", - "@firebase/database": "1.1.3", - "@firebase/database-compat": "2.1.4", - "@firebase/firestore": "4.14.1", - "@firebase/firestore-compat": "0.4.9", - "@firebase/functions": "0.13.4", - "@firebase/functions-compat": "0.4.4", - "@firebase/installations": "0.6.22", - "@firebase/installations-compat": "0.2.22", - "@firebase/messaging": "0.12.26", - "@firebase/messaging-compat": "0.2.26", - "@firebase/performance": "0.7.12", - "@firebase/performance-compat": "0.2.25", - "@firebase/remote-config": "0.8.3", - "@firebase/remote-config-compat": "0.2.24", - "@firebase/storage": "0.14.3", - "@firebase/storage-compat": "0.4.3", - "@firebase/util": "1.15.1" - } - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/geist": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/geist/-/geist-1.7.1.tgz", - "integrity": "sha512-XF8DM30ODhDu0Ng5S2kOS8j4ZkG/6z2fKWAiFJA7wG0Hc92ZXgjYLrwbD9bVU4nGVzwboPtG+QtaPGsfgnXLaA==", - "license": "SIL OPEN FONT LICENSE", - "peerDependencies": { - "next": ">=13.2.0" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/goober": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.19.tgz", - "integrity": "sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==", - "license": "MIT", - "peerDependencies": { - "csstype": "^3.0.10" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "license": "MIT" - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "license": "ISC" - }, - "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/inline-style-parser": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - "license": "MIT" - }, - "node_modules/input-otp": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", - "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isomorphic-ws": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", - "license": "MIT", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lucide-react": { - "version": "0.454.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.454.0.tgz", - "integrity": "sha512-hw7zMDwykCLnEzgncEEjHeA6+45aeEzRYuKHuyRSOPkhko+J3ySGjGIzu+mmMfDFG1vazHepMaYFYHbTFAZAAQ==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" - } - }, - "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/mdast-util-from-markdown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "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": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/next": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", - "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", - "license": "MIT", - "dependencies": { - "@next/env": "16.2.6", - "@swc/helpers": "0.5.15", - "baseline-browser-mapping": "^2.9.19", - "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", - "styled-jsx": "5.1.6" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=20.9.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "16.2.6", - "@next/swc-darwin-x64": "16.2.6", - "@next/swc-linux-arm64-gnu": "16.2.6", - "@next/swc-linux-arm64-musl": "16.2.6", - "@next/swc-linux-x64-gnu": "16.2.6", - "@next/swc-linux-x64-musl": "16.2.6", - "@next/swc-win32-arm64-msvc": "16.2.6", - "@next/swc-win32-x64-msvc": "16.2.6", - "sharp": "^0.34.5" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.51.1", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-themes": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", - "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "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/node-releases": { - "version": "2.0.46", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz", - "integrity": "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/protobufjs": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.1.tgz", - "integrity": "sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.5", - "@protobufjs/eventemitter": "^1.1.1", - "@protobufjs/fetch": "^1.1.1", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.2", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.1", - "@types/node": ">=13.7.0", - "long": "^5.3.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "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/react": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", - "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-day-picker": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-9.14.0.tgz", - "integrity": "sha512-tBaoDWjPwe0M5pGrum4H0SR6Lyk+BO9oHnp9JbKpGKW2mlraNPgP9BMfsg5pWpwrssARmeqk7YBl2oXutZTaHA==", - "license": "MIT", - "dependencies": { - "@date-fns/tz": "^1.4.1", - "@tabby_ai/hijri-converter": "1.0.5", - "date-fns": "^4.1.0", - "date-fns-jalali": "4.1.0-0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/gpbl" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", - "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.6" - } - }, - "node_modules/react-hook-form": { - "version": "7.76.1", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.76.1.tgz", - "integrity": "sha512-rYM7tPiWlu3nZchkR/ex7piyzui2vFPyaLnXnI/RnblB/L4qfMmyses8llJVtF1NpE9WBBsJlGtcSZzPCXW1qQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-hot-toast": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz", - "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==", - "license": "MIT", - "dependencies": { - "csstype": "^3.1.3", - "goober": "^2.1.16" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/react-markdown": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", - "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", - "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-resizable-panels": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.9.tgz", - "integrity": "sha512-z77+X08YDIrgAes4jl8xhnUu1LNIRp4+E7cv4xHmLOxxUPO/ML7PSrE813b90vj7xvQ1lcf7g2uA9GeMZonjhQ==", - "license": "MIT", - "peerDependencies": { - "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/react-smooth": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", - "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", - "license": "MIT", - "dependencies": { - "fast-equals": "^5.0.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recharts": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", - "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==", - "deprecated": "1.x and 2.x branches are no longer active. Bump to Recharts v3 to receive latest features and bugfixes. See https://github.com/recharts/recharts/wiki/3.0-migration-guide", - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0", - "eventemitter3": "^4.0.1", - "lodash": "^4.17.21", - "react-is": "^18.3.1", - "react-smooth": "^4.0.4", - "recharts-scale": "^0.4.4", - "tiny-invariant": "^1.3.1", - "victory-vendor": "^36.6.8" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/recharts-scale": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", - "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", - "license": "MIT", - "dependencies": { - "decimal.js-light": "^2.4.1" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/sonner": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.7.4.tgz", - "integrity": "sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==", - "license": "MIT", - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/style-to-js": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.14" - } - }, - "node_modules/style-to-object": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.7" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwind-merge": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz", - "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", - "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "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/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "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/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==", - "license": "MIT" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vaul": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/vaul/-/vaul-0.9.9.tgz", - "integrity": "sha512-7afKg48srluhZwIkaU+lgGtFCUsYBSGOl8vcc8N/M3YQlZFlynHD15AE+pwrYdc826o7nrIND4lL9Y6b9WWZZQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-dialog": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/victory-vendor": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", - "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", - "license": "MIT AND ISC", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, - "node_modules/web-vitals": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", - "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", - "license": "Apache-2.0" - }, - "node_modules/web3": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-4.16.0.tgz", - "integrity": "sha512-SgoMSBo6EsJ5GFCGar2E/pR2lcR/xmUSuQ61iK6yDqzxmm42aPPxSqZfJz2z/UCR6pk03u77pU8TGV6lgMDdIQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.7.1", - "web3-errors": "^1.3.1", - "web3-eth": "^4.11.1", - "web3-eth-abi": "^4.4.1", - "web3-eth-accounts": "^4.3.1", - "web3-eth-contract": "^4.7.2", - "web3-eth-ens": "^4.4.0", - "web3-eth-iban": "^4.0.7", - "web3-eth-personal": "^4.1.0", - "web3-net": "^4.1.0", - "web3-providers-http": "^4.2.0", - "web3-providers-ws": "^4.0.8", - "web3-rpc-methods": "^1.3.0", - "web3-rpc-providers": "^1.0.0-rc.4", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14.0.0", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-4.7.1.tgz", - "integrity": "sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-errors": "^1.3.1", - "web3-eth-accounts": "^4.3.1", - "web3-eth-iban": "^4.0.7", - "web3-providers-http": "^4.2.0", - "web3-providers-ws": "^4.0.8", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - }, - "optionalDependencies": { - "web3-providers-ipc": "^4.0.7" - } - }, - "node_modules/web3-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.3.1.tgz", - "integrity": "sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-types": "^1.10.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-4.11.1.tgz", - "integrity": "sha512-q9zOkzHnbLv44mwgLjLXuyqszHuUgZWsQayD2i/rus2uk0G7hMn11bE2Q3hOVnJS4ws4VCtUznlMxwKQ+38V2w==", - "license": "LGPL-3.0", - "dependencies": { - "setimmediate": "^1.0.5", - "web3-core": "^4.7.1", - "web3-errors": "^1.3.1", - "web3-eth-abi": "^4.4.1", - "web3-eth-accounts": "^4.3.1", - "web3-net": "^4.1.0", - "web3-providers-ws": "^4.0.8", - "web3-rpc-methods": "^1.3.0", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-abi": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-4.4.1.tgz", - "integrity": "sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==", - "license": "LGPL-3.0", - "dependencies": { - "abitype": "0.7.1", - "web3-errors": "^1.3.1", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-accounts": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-4.3.1.tgz", - "integrity": "sha512-rTXf+H9OKze6lxi7WMMOF1/2cZvJb2AOnbNQxPhBDssKOllAMzLhg1FbZ4Mf3lWecWfN6luWgRhaeSqO1l+IBQ==", - "license": "LGPL-3.0", - "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "crc-32": "^1.2.2", - "ethereum-cryptography": "^2.0.0", - "web3-errors": "^1.3.1", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-contract": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-4.7.2.tgz", - "integrity": "sha512-3ETqs2pMNPEAc7BVY/C3voOhTUeJdkf2aM3X1v+edbngJLHAxbvxKpOqrcO0cjXzC4uc2Q8Zpf8n8zT5r0eLnA==", - "license": "LGPL-3.0", - "dependencies": { - "@ethereumjs/rlp": "^5.0.2", - "web3-core": "^4.7.1", - "web3-errors": "^1.3.1", - "web3-eth": "^4.11.1", - "web3-eth-abi": "^4.4.1", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-contract/node_modules/@ethereumjs/rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", - "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", - "license": "MPL-2.0", - "bin": { - "rlp": "bin/rlp.cjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/web3-eth-ens": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-4.4.0.tgz", - "integrity": "sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==", - "license": "LGPL-3.0", - "dependencies": { - "@adraffy/ens-normalize": "^1.8.8", - "web3-core": "^4.5.0", - "web3-errors": "^1.2.0", - "web3-eth": "^4.8.0", - "web3-eth-contract": "^4.5.0", - "web3-net": "^4.1.0", - "web3-types": "^1.7.0", - "web3-utils": "^4.3.0", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-iban": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-4.0.7.tgz", - "integrity": "sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-errors": "^1.1.3", - "web3-types": "^1.3.0", - "web3-utils": "^4.0.7", - "web3-validator": "^2.0.3" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-personal": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-4.1.0.tgz", - "integrity": "sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.6.0", - "web3-eth": "^4.9.0", - "web3-rpc-methods": "^1.3.0", - "web3-types": "^1.8.0", - "web3-utils": "^4.3.1", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-net": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-4.1.0.tgz", - "integrity": "sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.4.0", - "web3-rpc-methods": "^1.3.0", - "web3-types": "^1.6.0", - "web3-utils": "^4.3.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-providers-http": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-4.2.0.tgz", - "integrity": "sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==", - "license": "LGPL-3.0", - "dependencies": { - "cross-fetch": "^4.0.0", - "web3-errors": "^1.3.0", - "web3-types": "^1.7.0", - "web3-utils": "^4.3.1" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-providers-ipc": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-4.0.7.tgz", - "integrity": "sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-errors": "^1.1.3", - "web3-types": "^1.3.0", - "web3-utils": "^4.0.7" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-providers-ws": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-4.0.8.tgz", - "integrity": "sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==", - "license": "LGPL-3.0", - "dependencies": { - "@types/ws": "8.5.3", - "isomorphic-ws": "^5.0.0", - "web3-errors": "^1.2.0", - "web3-types": "^1.7.0", - "web3-utils": "^4.3.1", - "ws": "^8.17.1" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-rpc-methods": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.3.0.tgz", - "integrity": "sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.4.0", - "web3-types": "^1.6.0", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-rpc-providers": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/web3-rpc-providers/-/web3-rpc-providers-1.0.0-rc.4.tgz", - "integrity": "sha512-PXosCqHW0EADrYzgmueNHP3Y5jcSmSwH+Dkqvn7EYD0T2jcsdDAIHqk6szBiwIdhumM7gv9Raprsu/s/f7h1fw==", - "license": "LGPL-3.0", - "dependencies": { - "web3-errors": "^1.3.1", - "web3-providers-http": "^4.2.0", - "web3-providers-ws": "^4.0.8", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-types": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.10.0.tgz", - "integrity": "sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==", - "license": "LGPL-3.0", - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.3.3.tgz", - "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", - "license": "LGPL-3.0", - "dependencies": { - "ethereum-cryptography": "^2.0.0", - "eventemitter3": "^5.0.1", - "web3-errors": "^1.3.1", - "web3-types": "^1.10.0", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-utils/node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT" - }, - "node_modules/web3-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-2.0.6.tgz", - "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", - "license": "LGPL-3.0", - "dependencies": { - "ethereum-cryptography": "^2.0.0", - "util": "^0.12.5", - "web3-errors": "^1.2.0", - "web3-types": "^1.6.0", - "zod": "^3.21.4" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "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/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/my_report/IEEE_Report.md b/my_report/IEEE_Report.md deleted file mode 100644 index cc2cd9c..0000000 --- a/my_report/IEEE_Report.md +++ /dev/null @@ -1,700 +0,0 @@ -# OPENLEARNX: A DECENTRALIZED ADAPTIVE LEARNING PLATFORM WITH BLOCKCHAIN-BASED CERTIFICATION FOR VERIFIABLE SKILL ASSESSMENT - -## A PROJECT REPORT - -Submitted By - -**Stalin S [Roll: 312423243175]** - -**Sidarthan S [Roll: 312423243172]** - -in partial fulfillment for the of award of the degree - -of - -**BACHELOR OF TECHNOLOGY** - -in - -**COMPUTER SCIENCE & ENGINEERING** - -ANNA UNIVERSITY: DELHI 110001 - -APRIL 2026 - ---- - -## BONAFIDE CERTIFICATE - -Certified that this project report "OPENLEARNX: A DECENTRALIZED ADAPTIVE LEARNING PLATFORM WITH BLOCKCHAIN-BASED CERTIFICATION FOR VERIFIABLE SKILL ASSESSMENT" is the bonafide work of "Stalin S [Roll: 312423243175] and Sidarthan S [Roll: 312423243172]" who carried out the project work under my supervision. - -SIGNATURE SIGNATURE - -[Signature] [Signature] - -Dr. [Name] [Advisor Name] - -Professor/Head Assistant Professor - -HEAD OF THE DEPARTMENT SUPERVISOR - -Department of Computer Science & Engineering Department of Computer Science & Engineering - -[Institution Name] [Institution Name] - ---- - -## CERTIFICATE OF EVALUATION - -College Name: [Institution Name] - -Branch & Semester: Computer Science & Engineering (VIII) - -S.NO NAMES OF STUDENTS TITLE OF THE PROJECT NAME OF THE SUPERVISOR WITH DESIGNATION - -1. Stalin S [Roll: 312423243175] OpenLearnX: A Decentralized [Advisor Name] -2. Sidarthan S [Roll: 312423243172] Adaptive Learning Platform [Designation] -With Blockchain-Based -Certification - -The report of the project work submitted by the above students for Project Work in Computer Science & Engineering were evaluated and confirmed to be reports of the work done by the above students and then evaluated. - -INTERNAL EXAMINER EXTERNAL EXAMINER - -[Signature] [Signature] - ---- - -## ACKNOWLEDGEMENT - -The contentment and elation that accompany the successful completion of any work would be incomplete without mentioning the people who made it possible. - -We are extremely happy to express our gratitude in thanking our beloved Chairman Dr. [Name] M.A., M.B.A., Ph.D who has been a pillar of strength to this college. - -Words are inadequate in offering our sincere thanks and gratitude to our respected Managing Director Mr. [Name] M.Sc and heartfelt gratitude to our respected Executive Director Mrs. [Name] M.Com and our beloved Principal Dr. [Name] M.E., Ph.D and heartfelt gratitude to our respected Dean Academics Dr. [Name] M.Tech., Ph.D for having encouraged us to do our undergraduation in Computer Science and Engineering in this esteemed college. - -We also express our sincere thanks and most heartfelt sense of gratitude to our eminent Head of the Department Dr. [Name] M.E, Ph.D for having extended her helping hand at all times. - -It is with deep sense of gratitude that we acknowledge our indebtedness to our Supervisor [Advisor Name] M.E., (Ph.D) a perfectionist for her expert guidance and connoisseur suggestion. - -Last but not the least, we thank our family members and friends who have been the greatest source of support to us. - ---- - -## ABSTRACT - -The proliferation of online education has created unprecedented opportunities for accessible learning, yet fundamental challenges persist: static content delivery fails to accommodate diverse learner abilities, delayed feedback impedes learning momentum, and rampant credential fraud undermines trust in educational achievements. This project presents OpenLearnX, a comprehensive decentralized learning and assessment platform that addresses these critical issues through the integration of three key technological innovations. First, we implement an adaptive learning engine based on Item Response Theory (IRT) using the three-parameter logistic model, enhanced with TensorFlow-based machine learning for multi-dimensional ability estimation across skill domains. Second, we develop a secure multi-language code execution environment utilizing Docker containerization with strict resource isolation, supporting eight programming languages with sub-3-second execution times. Third, we introduce an ERC-721 NFT-based certification system deployed on Ethereum, with certificate metadata permanently stored on IPFS for decentralized verification. Our experimental evaluation across 1,000 simulated quiz sessions demonstrates 0.94 correlation accuracy in ability estimation with convergence within 8.3 questions on average, compared to 25-30 questions for traditional fixed-form assessments. Load testing confirms the platform handles 500 concurrent users with 95th percentile API response times under 127ms. Security analysis including penetration testing, smart contract auditing using Slither and Mythril, and sandbox escape testing reveals no critical vulnerabilities. OpenLearnX represents a significant advancement in educational technology, providing a scalable, secure, and verifiable platform for personalized learning that ensures educational achievements remain permanent and tamper-proof regardless of institutional longevity. - -**Keywords:** Adaptive Learning, Blockchain Certification, Decentralized Education, NFT Credentials, Item Response Theory, Smart Contracts, IPFS, TensorFlow, ERC-721, Personalized Assessment - ---- - -## TABLE OF CONTENTS - -| CHAPTER NO. | TITLE | PAGE NO. | -|---|---|---| -| | ABSTRACT | iv | -| | LIST OF TABLES | viii | -| | LIST OF FIGURES | ix | -| | LIST OF ABBREVIATIONS | x | -| 1 | INTRODUCTION | 1 | -| 1.1 | BACKGROUND | 3 | -| 1.2 | PROBLEM IDENTIFIED | 6 | -| 1.3 | OBJECTIVES | 7 | -| 1.4 | AIM OF PROJECT | 8 | -| 2 | LITERATURE REVIEW | 10 | -| 2.1 | ADAPTIVE LEARNING SYSTEMS | 10 | -| 2.2 | BLOCKCHAIN APPLICATIONS IN EDUCATION | 12 | -| 2.3 | DECENTRALIZED STORAGE SYSTEMS | 13 | -| 2.4 | SECURE CODE EXECUTION | 14 | -| 3 | SYSTEM ARCHITECTURE | 16 | -| 3.1 | DESIGN PRINCIPLES | 16 | -| 3.2 | SYSTEM OVERVIEW | 17 | -| 3.3 | ARCHITECTURE LAYERS | 18 | -| 3.4 | BLOCKCHAIN LAYER | 20 | -| 3.5 | DECENTRALIZED STORAGE LAYER | 21 | -| 4 | IMPLEMENTATION DETAILS | 23 | -| 4.1 | ADAPTIVE LEARNING ALGORITHM | 23 | -| 4.2 | SECURE CODE EXECUTION | 26 | -| 4.3 | CERTIFICATE MINTING SYSTEM | 29 | -| 4.4 | FRONTEND IMPLEMENTATION | 31 | -| 4.5 | BACKEND SERVICES | 32 | -| 5 | RESULTS AND PERFORMANCE ANALYSIS | 34 | -| 5.1 | FUNCTIONAL VALIDATION AND QUERY EXECUTION ANALYSIS | 34 | -| 5.2 | ADAPTIVE ALGORITHM PERFORMANCE | 36 | -| 5.3 | SYSTEM PERFORMANCE AND EFFICIENCY ANALYSIS | 37 | -| 5.4 | COMPARATIVE ANALYSIS | 39 | -| 6 | CONCLUSION | 41 | -| 7 | FUTURE ENHANCEMENTS | 42 | -| | APPENDICES | 43 | -| | REFERENCES | 48 | - ---- - -## LIST OF TABLES - -| TABLE NO. | TITLE | PAGE NO. | -|---|---|---| -| 1 | Comparative Analysis of Adaptive Learning Systems | 12 | -| 2 | Language Support and Docker Configuration | 26 | -| 3 | Code Execution Resource Limits | 27 | -| 4 | API Endpoints and Response Times | 34 | -| 5 | Adaptive Algorithm Convergence Metrics | 36 | -| 6 | Performance Benchmarks | 37 | -| 7 | Security Testing Results | 38 | -| 8 | Comparison with Existing Platforms | 39 | -| 9 | System Scalability Metrics | 40 | -| 10 | Technology Stack Components | 43 | - ---- - -## LIST OF FIGURES - -| FIGURE NO. | NAME OF THE FIGURE | PAGE NO. | -|---|---|---| -| 1 | Overall System Architecture | 17 | -| 2 | User Interface Layer Components | 18 | -| 3 | Backend API Service Architecture | 19 | -| 4 | Blockchain Certificate Flow | 20 | -| 5 | Item Response Theory (3PL Model) | 24 | -| 6 | Adaptive Algorithm Workflow | 25 | -| 7 | Secure Code Execution Pipeline | 26 | -| 8 | Certificate Minting Process | 29 | -| 9 | System Performance Dashboard | 35 | -| 10 | Ability Estimation Convergence | 36 | - ---- - -## LIST OF ABBREVIATIONS - -| ABBREVIATION | FULL FORM | -|---|---| -| IRT | Item Response Theory | -| 3PL | Three-Parameter Logistic | -| NFT | Non-Fungible Token | -| ERC | Ethereum Request for Comments | -| IPFS | InterPlanetary File System | -| JWT | JSON Web Token | -| REST | Representational State Transfer | -| LLM | Large Language Model | -| API | Application Programming Interface | -| ECDSA | Elliptic Curve Digital Signature Algorithm | -| MLE | Maximum Likelihood Estimation | -| CID | Content Identifier | - ---- - -# 1 INTRODUCTION - -## 1.1 BACKGROUND - -The landscape of education has undergone a dramatic transformation in the digital age. Online learning platforms have democratized access to educational resources, enabling millions of learners worldwide to acquire new skills regardless of geographical or socioeconomic constraints. The global e-learning market, valued at approximately $250 billion in 2020, is projected to exceed $1 trillion by 2028. However, this rapid growth has exposed fundamental limitations in how online education delivers content, assesses learners, and verifies achievements. - -Traditional learning management systems (LMS) operate on a one-size-fits-all model, presenting identical content sequences to all learners regardless of their prior knowledge, learning pace, or cognitive abilities. This approach fails to accommodate the natural variation in learner populations, leading to frustration for advanced students who find content too easy and discouragement for those who struggle with material presented at an inappropriate difficulty level. Research in educational psychology consistently demonstrates that learning outcomes improve significantly when instruction is tailored to individual learner characteristics. - -Furthermore, the feedback loop in conventional online education is often measured in days or weeks. Students submit assignments, await instructor review, and eventually receive grades with varying degrees of constructive feedback. This delay disrupts the immediate reinforcement that cognitive science identifies as crucial for effective learning. When learners cannot immediately identify and correct misconceptions, those errors become ingrained, requiring substantially more effort to remediate later. - -Perhaps most critically, the credentialing ecosystem supporting online education remains fundamentally broken. Digital certificates and badges can be trivially forged using basic image editing software. Paper credentials can be fabricated or purchased from diploma mills. According to the Society for Human Resource Management, nearly 85% of employers have caught applicants lying on their resumes, with fraudulent credentials representing a significant portion of these deceptions. This credential fraud costs organizations billions annually in hiring mistakes and undermines the legitimate achievements of honest learners. - -## 1.2 PROBLEM IDENTIFIED - -The core problems addressed by this research can be formalized as follows: - -1. The Personalization Problem: Given a heterogeneous population of learners with varying abilities, how can we efficiently estimate each learner's ability and dynamically select assessment items of appropriate difficulty to maximize learning outcomes? - -2. The Feedback Latency Problem: In skill domains requiring practical demonstration (such as programming), how can we provide immediate, accurate feedback on learner submissions while maintaining security against malicious code execution? - -3. The Credential Verification Problem: How can we issue educational credentials that are permanently verifiable by any third party, resistant to forgery, and independent of the issuing institution's continued operation? - -## 1.3 OBJECTIVES - -The main objectives of this project are: - -1. Design and implement an adaptive learning algorithm based on Item Response Theory that efficiently converges to accurate ability estimates -2. Develop a secure multi-language code execution environment with comprehensive sandboxing and resource control -3. Create a blockchain-based certification system using ERC-721 NFT standards for immutable credential issuance -4. Integrate multiple technologies (frontend, backend, blockchain, storage) into a cohesive learning platform -5. Validate system performance, security, and scalability through comprehensive testing -6. Demonstrate practical feasibility of decentralized education technology - -## 1.4 AIM OF PROJECT - -The aim of OpenLearnX is to revolutionize online education by providing a comprehensive platform that combines adaptive learning, instant feedback, and verifiable credentials. By integrating cutting-edge technologies including artificial intelligence, blockchain, and decentralized storage, the project aims to create an educational system that is personalized, secure, scalable, decentralized, and verifiable. - ---- - -# 2 LITERATURE REVIEW - -## 2.1 ADAPTIVE LEARNING SYSTEMS - -The concept of adapting instruction to individual learner characteristics dates to the earliest computerized educational systems. Intelligent Tutoring Systems (ITS) emerged in the 1970s, attempting to model student knowledge and adjust instruction accordingly. Systems like LISP Tutor and later ALEKS demonstrated that computer-based adaptive instruction could achieve learning gains comparable to human tutoring. - -Item Response Theory (IRT) provides the mathematical foundation for modern adaptive testing. Developed by psychometricians including Lord, Rasch, and Birnbaum, IRT models the probability of a correct response as a function of learner ability and item characteristics. The three-parameter logistic (3PL) model accounts for item difficulty, discrimination, and guessing probability in the form: - -P(theta) = c + (1 - c) / (1 + e^(-a(theta - b))) - -Commercial platforms including Knewton, ALEKS (acquired by McGraw-Hill), and DreamBox Learning have deployed adaptive learning at scale. However, these systems remain proprietary and centralized, raising concerns about data ownership, algorithmic transparency, and vendor lock-in. - -Recent research has explored machine learning approaches beyond traditional IRT. Deep learning models for knowledge tracing can capture complex temporal dependencies in learning sequences. Reinforcement learning has been applied to optimize learning path recommendations. OpenLearnX builds upon this foundation by combining classical IRT with TensorFlow-based machine learning. - -## 2.2 BLOCKCHAIN APPLICATIONS IN EDUCATION - -Blockchain technology, introduced through Bitcoin by Nakamoto, provides a decentralized, immutable ledger suitable for recording transactions without trusted intermediaries. Buterin's Ethereum extended this concept with Turing-complete smart contracts, enabling programmable applications on blockchain infrastructure. - -The application of blockchain to educational credentials began with the MIT Media Lab's digital diplomas project in 2017. Using the Blockcerts open standard, MIT issued blockchain-anchored digital diplomas that graduates could share and employers could verify without contacting the university. The project demonstrated both the technical feasibility and the organizational challenges of blockchain credentialing. - -Several platforms have emerged offering blockchain-based certification. Learning Machine (now Hyland Credentials) provides enterprise solutions for issuing verifiable credentials. The European Blockchain Services Infrastructure (EBSI) is developing a framework for cross-border credential recognition within the European Union. - -Existing blockchain education platforms primarily focus on credential issuance and verification, treating blockchain as an add-on to traditional learning management systems. OpenLearnX differentiates itself by integrating blockchain throughout the learning journey—from wallet-based authentication to progress tracking to certificate issuance—creating a cohesive decentralized learning experience. - -## 2.3 DECENTRALIZED STORAGE SYSTEMS - -Traditional web architecture relies on location-based addressing, where content is identified by server location (URL) rather than content itself. This creates single points of failure, enables censorship, and results in link rot as servers go offline. - -The InterPlanetary File System (IPFS), developed by Protocol Labs, addresses these limitations through content-addressed storage. Each piece of content is identified by its cryptographic hash, enabling verification that retrieved content has not been altered. IPFS operates as a peer-to-peer network, where content can be retrieved from any node hosting it, providing redundancy and resilience. - -For educational applications, IPFS offers several advantages. Course materials and credentials stored on IPFS remain accessible even if the original hosting institution ceases operation. Content integrity is cryptographically verifiable. Geographic distribution improves access speeds for global learner populations. - -In OpenLearnX, we store certificate metadata on IPFS and record the IPFS hash in the blockchain smart contract. This hybrid approach combines blockchain's permanence and verifiability with IPFS's ability to store arbitrary content. - -## 2.4 SECURE CODE EXECUTION - -Online judges for programming competitions and coding education face the challenge of executing untrusted user code safely. Malicious submissions might attempt to access sensitive files, consume excessive resources, or attack other systems through the network. - -Containerization using Docker provides process-level isolation with modest performance overhead. Containers share the host kernel but operate in separate namespaces for processes, network, and filesystem. Resource limits can constrain CPU time, memory, and disk usage. - -Platforms like HackerRank, LeetCode, and Codeforces implement secure code execution at scale. OpenLearnX implements defense in depth for code execution: Docker containers with dropped capabilities, user namespace isolation, read-only filesystems, network isolation, CPU and memory limits, and timeout enforcement. - ---- - -# 3 SYSTEM ARCHITECTURE - -## 3.1 DESIGN PRINCIPLES - -The OpenLearnX architecture follows several key design principles: - -1. Decentralization: Minimize reliance on centralized infrastructure where practical -2. Security by Design: Implement defense in depth, assuming any single security control may fail -3. Scalability: Design for horizontal scaling to accommodate growing user populations -4. Interoperability: Adhere to open standards (ERC-721, JWT, REST) -5. User Sovereignty: Give learners control over their identity, data, and credentials - -## 3.2 SYSTEM OVERVIEW - -OpenLearnX employs a modern microservices architecture with clear separation of concerns. The system comprises four main layers: - -Layer 1: USER INTERFACE LAYER (Next.js 14, React, TypeScript, TailwindCSS) -Layer 2: BACKEND API LAYER (Flask, Python, 9+ Microservices) -Layer 3: DATA LAYER (MongoDB, Redis, Docker Runtime) -Layer 4: BLOCKCHAIN LAYER (Ethereum, Smart Contracts) -Layer 5: DECENTRALIZED STORAGE LAYER (IPFS) - -## 3.3 ARCHITECTURE LAYERS - -### User Interface Layer - -The frontend is built using Next.js 14 with TypeScript, leveraging React 19's concurrent features. TailwindCSS provides utility-first styling. The user interface supports three primary user roles with distinct experiences: - -[OK] Students: Access personalized dashboards showing progress across courses -[OK] Instructors: Manage courses and assessments, monitor class performance -[OK] Employers/Verifiers: Instantly verify candidate credentials on blockchain - -### Backend API Layer - -The backend is implemented in Flask 2.3.3 with Python, providing RESTful APIs and WebSocket connections. The architecture follows a service-oriented design where each major feature is encapsulated in a separate service module: - -[OK] Authentication Service: Wallet-based authentication using cryptographic signatures -[OK] Quiz Service: Manages full lifecycle of assessments including creation and retrieval -[OK] Adaptive Quiz Service: IRT-based adaptive algorithm with real-time difficulty adjustment -[OK] Certificate Service: Orchestrates NFT minting process -[OK] Compiler Service: Executes user-submitted code in Docker containers -[OK] Dashboard Service: Aggregates analytics from across the platform -[OK] AI Quiz Service: TensorFlow models for intelligent question generation - -## 3.4 BLOCKCHAIN LAYER - -The blockchain layer consists of Solidity smart contracts deployed on Ethereum. The primary contract, CertificateNFT, implements the ERC-721 standard using OpenZeppelin's audited base contracts. The contract stores certificate details on-chain including subject, student name, score, timestamp, and verification status. Development uses the Foundry toolkit for testing and building. - -## 3.5 DECENTRALIZED STORAGE LAYER - -Certificate metadata is stored on IPFS using a JSON structure compatible with NFT marketplace standards. The IPFS content identifier (CID) is stored in the smart contract's tokenURI field. This design ensures that even if OpenLearnX ceases operation, certificates remain verifiable through any IPFS gateway and the Ethereum blockchain. - ---- - -# 4 IMPLEMENTATION DETAILS - -## 4.1 ADAPTIVE LEARNING ALGORITHM - -### Item Response Theory Foundation - -Our adaptive learning system implements a sophisticated version of Item Response Theory using the three-parameter logistic (3PL) model. The probability that learner j with ability theta_j correctly answers item i is calculated using the IRT formula with difficulty (b), discrimination (a), and pseudo-guessing (c) parameters. - -### Ability Estimation - -We estimate learner ability using maximum likelihood estimation (MLE) with Bayesian priors. Given a response pattern, the likelihood function is calculated. We incorporate a Bayesian prior assuming theta follows a normal distribution, yielding the posterior. - -### Adaptive Question Selection - -Question selection follows the maximum information criterion. Fisher information for item i at ability level theta is calculated. At each step, we select the item not yet administered that maximizes information at the current ability estimate. - -### Difficulty Adjustment Rules - -Our implementation uses a simplified difficulty adjustment scheme suitable for real-time interaction: - -- 3 consecutive correct: Easy -> Medium -> Hard -- 1 incorrect: Hard -> Medium -> Easy (stay on Easy if already there) - -### TensorFlow Integration - -Our TensorFlow implementation extends traditional IRT with three innovations: - -[OK] Multi-dimensional ability estimation: Vector theta representing ability across k skill dimensions -[OK] Temporal modeling: Recency weighting recognizing recent performance is more indicative -[OK] Content-area weighting: Ensures balanced coverage across topics - -## 4.2 SECURE CODE EXECUTION - -### Architecture Overview - -The code compilation service supports eight programming languages with secure, sandboxed execution. Each language is configured with an appropriate Docker image, file extension, and execution command. - -### Supported Languages - -1. Python: Python 3.9-Alpine, timeout: 10 seconds -2. Java: OpenJDK 11-Alpine, timeout: 15 seconds -3. C: GCC 9-Alpine, timeout: 15 seconds -4. C++: GCC 9-Alpine, timeout: 15 seconds -5. JavaScript: Node 16-Alpine, timeout: 10 seconds -6. Go: Go 1.19-Alpine, timeout: 15 seconds -7. Rust: Rust 1.65-Alpine, timeout: 20 seconds -8. Ruby: Ruby 3-Alpine, timeout: 15 seconds - -### Resource Limits - -- CPU Timeout: 10-20 seconds depending on language -- Memory Limit: 256MB per process -- Disk Quota: 100MB per submission -- Network Access: None allowed -- File System: Read-only except /tmp - -### Security Controls - -- Docker containers with dropped capabilities -- User namespace isolation -- Read-only filesystems -- Network isolation -- CPU and memory limits -- Timeout enforcement -- Process destroyed after execution - -## 4.3 CERTIFICATE MINTING SYSTEM - -### Smart Contract Implementation - -The CertificateNFT contract implements the ERC-721 standard using OpenZeppelin's audited base contracts. The contract stores certificate details on-chain including subject, student name, score, timestamp, and verification status. Functions include: - -- mintCertificate(address, tokenURI) -- mintCertificateWithDetails(address, tokenURI, subject, name, score) -- getCertificate(tokenId) -- getUserCertificates(user) -- verifyCertificate(tokenId) - -### Metadata Format - -Certificate metadata is stored on IPFS using JSON with NFT marketplace standards. Attributes include subject, level, score, competency, issue date, institution, and skills demonstrated. - -## 4.4 FRONTEND IMPLEMENTATION - -The frontend is built using Next.js 14 with TypeScript and React 19. Key components include: - -- WalletConnect: MetaMask SDK integration -- QuestionCard: Adaptive quiz question display -- CodeEditor: Monaco-based editor with syntax highlighting -- ProgressChart: Chart.js and Recharts visualizations -- CertificateCard: NFT certificate display with QR codes - -## 4.5 BACKEND SERVICES - -The backend provides RESTful APIs for all platform functionality: - -- /api/health: Health check endpoint -- /api/auth: Authentication and wallet operations -- /api/quizzes: Quiz management -- /api/adaptive-quiz: Adaptive quiz operations -- /api/certificate: Certificate operations -- /api/compiler: Code compilation -- /api/dashboard: Analytics and dashboard data -- /api/courses: Course management - ---- - -# 5 RESULTS AND PERFORMANCE ANALYSIS - -## 5.1 FUNCTIONAL VALIDATION AND QUERY EXECUTION ANALYSIS - -### Quiz Execution Results - -[OK] Authentication: 100% success rate -[OK] Quiz creation: Average 150ms -[OK] Question retrieval: Average 80ms -[OK] Answer grading: Average 120ms -[OK] Certificate issuance: Average 2.5 seconds - -### Code Execution Results - -Python: 1.2 seconds average execution time -JavaScript: 0.9 seconds average execution time -Java: 2.1 seconds average execution time -C++: 1.8 seconds average execution time -Success rate: 99.7% - -## 5.2 ADAPTIVE ALGORITHM PERFORMANCE - -### Convergence Metrics - -- Convergence speed: Average 8.3 questions (vs 25-30 for traditional) -- Ability estimation accuracy: 0.94 correlation coefficient -- Confidence interval width: 0.25 (95% CI) -- Information gain per question: 18% improvement - -### Machine Learning Model Performance - -- Question difficulty prediction: 88% accuracy -- Learner performance prediction: 0.91 R-squared -- Recommendation precision: 0.86 - -## 5.3 SYSTEM PERFORMANCE AND EFFICIENCY ANALYSIS - -### API Performance - -- Average response time: 95ms -- 95th percentile: 127ms -- 99th percentile: 356ms -- Throughput: 1250 requests/second - -### Database Performance - -- Query response time: < 100ms -- Index efficiency: 0.94 -- Cache hit ratio: 87% - -### Scalability - -- Concurrent users supported: 500+ -- API throughput: 1250+ requests/second -- Database connection pool: 100 connections -- Memory usage: 85% efficient - -## 5.4 COMPARATIVE ANALYSIS - -| Metric | OpenLearnX | ALEKS | Knewton | Traditional LMS | -|---|---|---|---|---| -| Convergence Speed (questions) | 8.3 | 12 | 15 | 25-30 | -| Credential Permanence | Permanent (NFT) | Institutional | Institutional | Institutional | -| Decentralization | Full | None | None | None | -| Code Execution Support | 8 languages | Limited | Limited | None | -| Security Model | Blockchain | Centralized | Centralized | Centralized | - ---- - -# 6 CONCLUSION - -OpenLearnX successfully demonstrates the integration of adaptive learning algorithms, secure code execution, and blockchain-based credentialing into a cohesive educational platform. The experimental evaluation confirms that the system achieves its objectives: - -[OK] Adaptive learning reduces assessment time by 3x while maintaining accuracy -[OK] Secure code execution handles multiple programming languages safely -[OK] Blockchain certificates provide permanent, verifiable credentials -[OK] Scalable architecture supports hundreds of concurrent users - -The project makes significant contributions to online education technology. The platform provides a scalable, secure, and verifiable solution for personalized learning. - ---- - -# 7 FUTURE ENHANCEMENTS - -Short-term (3-6 months): -- Mobile application development -- Multi-language adaptation -- Additional programming languages support -- Real-time collaboration features - -Medium-term (6-12 months): -- Machine learning model improvements -- Distributed database replication -- Layer 2 blockchain integration (Polygon, Arbitrum) -- Decentralized governance through DAOs - -Long-term (1-2 years): -- Federated learning across institutions -- Cross-platform credential recognition -- Advanced peer assessment algorithms -- Integration with institutional LMS platforms - ---- - -# APPENDICES - -## APPENDIX A: SYSTEM ARCHITECTURE DIAGRAM - -The overall system architecture comprises five main layers: User Interface (Next.js), Backend API (Flask), Data Layer (MongoDB, Redis, Docker), Blockchain Layer (Ethereum), and Decentralized Storage (IPFS). Each layer is independently scalable and interoperable through well-defined APIs. - -## APPENDIX B: ADAPTIVE ALGORITHM WORKFLOW - -1. User starts quiz session -2. System initializes ability estimate (theta = 0) -3. Calculate item difficulty using IRT -4. Select question with maximum Fisher Information -5. User responds to question -6. Update ability estimate using Maximum Likelihood -7. Calculate convergence criteria -8. If converged: Issue certificate, else goto step 3 - -## APPENDIX C: CERTIFICATE MINTING FLOW - -1. Quiz completed successfully -2. Validate score meets threshold -3. Generate certificate metadata JSON -4. Upload to IPFS network -5. Receive IPFS Content Hash (CID) -6. Call smart contract mintCertificate function -7. NFT minted on Ethereum blockchain -8. Send NFT to student wallet -9. Store transaction hash in database -10. Certificate available for verification - -## APPENDIX D: SMART CONTRACT CODE - -pragma solidity ^0.8.19; - -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; - -contract CertificateNFT is ERC721, ERC721URIStorage, Ownable { - struct Certificate { - string subject; - string studentName; - uint256 score; - uint256 timestamp; - bool verified; - } - - mapping(uint256 => Certificate) public certificates; - - function mintCertificate( - address to, - string memory subject, - string memory studentName, - uint256 score, - string memory _tokenURI - ) public onlyOwner returns (uint256) { - uint256 tokenId = uint256(keccak256(abi.encodePacked(to, subject))); - _safeMint(to, tokenId); - certificates[tokenId] = Certificate(subject, studentName, score, block.timestamp, true); - _setTokenURI(tokenId, _tokenURI); - return tokenId; - } - - function verifyCertificate(uint256 tokenId) public view returns (bool) { - return certificates[tokenId].verified; - } -} - -## APPENDIX E: API DOCUMENTATION - -### Authentication Endpoints - -POST /api/auth/nonce - Get nonce for signing -POST /api/auth/verify - Verify signature and get JWT token - -### Quiz Endpoints - -POST /api/quizzes/create - Create new quiz -GET /api/quizzes/list - List available quizzes -POST /api/adaptive-quiz/start - Start adaptive quiz session -POST /api/adaptive-quiz/submit - Submit answer to question - -### Compiler Endpoints - -POST /api/compiler/execute - Execute code submission - -Request Format: -{ - "code": "print('Hello World')", - "language": "python" -} - -Response Format: -{ - "output": "Hello World", - "error": null, - "execution_time": 0.45 -} - -### Certificate Endpoints - -POST /api/certificate/mint - Mint NFT certificate -GET /api/certificate/verify/{token_id} - Verify certificate on blockchain - -## APPENDIX F: TECHNOLOGY STACK - -| Component | Technology | Version | -|---|---|---| -| Frontend Framework | Next.js | 14.0.0 | -| Frontend Library | React | 19.0.0 | -| Language (Frontend) | TypeScript | 5.0.0 | -| Styling | TailwindCSS | 3.3.0 | -| Backend Framework | Flask | 2.3.3 | -| Backend Language | Python | 3.10+ | -| Database | MongoDB | 6.0+ | -| Cache | Redis | 7.0+ | -| ML Framework | TensorFlow | 2.13.0 | -| Blockchain | Solidity | 0.8.19 | -| Blockchain Client | Web3.py | 6.8.0 | -| Containerization | Docker | 24.0.0 | -| Storage | IPFS | Latest | -| Development | Foundry | 0.2.0 | - ---- - -# REFERENCES - -[1] Ambient Insight. (2018). The U.S. Self-Paced eLearning Market 2014-2025. Market research report. - -[2] Bloom, B. S. (1984). The 2 sigma problem: The search for methods of group instruction as effective as one-to-one tutoring. Educational Researcher, 13(6), 4-16. - -[3] Ebbinghaus, H. (1885). Memory: A contribution to experimental psychology. Teachers College, Columbia University. - -[4] Society for Human Resource Management. (2018). 2018 Employees Benefits Survey. SHRM research. - -[5] Anderson, J. R. (2005). Cognitive Psychology and its Implications. Worth Publishers, 6th edition. - -[6] Birnbaum, A. (1968). Some latent trait models and their use in inferring an examinee's ability. In F. M. Lord & M. R. Novick (Eds.), Statistical theories of mental test scores. Addison-Wesley. - -[7] Piech, C., Bassen, J., Huang, J., et al. (2015). Deep knowledge tracing. In Advances in Neural Information Processing Systems (pp. 505-513). - -[8] Rafferty, A. N., Brunskill, E., Griffiths, T. L., & Shih, B. (2016). Faster teaching via active learning. In International Conference on Machine Learning (pp. 590-598). - -[9] Zhang, L., Xiong, X., Zhao, S., Botelho, A., & Heffernan, N. T. (2017). Incorporating rich information into invasive branching student models. In Educational Data Mining. - -[10] Nakamoto, S. (2008). Bitcoin: A peer-to-peer electronic cash system. Whitepaper. - -[11] Buterin, V. (2013). Ethereum: A next-generation smart contract and decentralized application platform. Whitepaper. - -[12] MIT Media Lab. (2017). Learning machine and MIT media lab develop digital diplomas project. Press release. - -[13] Grech, A., & Camilleri, A. F. (2017). Blockchain in education. EUR 28778 EN. Publications Office of the European Union. - -[14] Benet, J. (2014). IPFS - content addressed, versioned, P2P file system. arXiv preprint arXiv:1407.3561. - -[15] Li, Z., Liu, H., Teng, K., Gao, Y., & Xiao, M. (2018). Online judge system security design and implementation. In 2018 International Conference on Intelligent and Interactive Systems and Applications. - ---- - -**Document Status**: Final Project Report - IEEE Paper Based - -**Submission Date**: April 9, 2026 - -**Total Pages**: 48 - -**Authors**: Stalin S [Roll: 312423243175], Sidarthan S [Roll: 312423243172] diff --git a/my_report/IEEE_Report.pdf b/my_report/IEEE_Report.pdf deleted file mode 100644 index 370c6ae..0000000 Binary files a/my_report/IEEE_Report.pdf and /dev/null differ diff --git a/my_report/report.md b/my_report/report.md deleted file mode 100644 index 0c9abc6..0000000 --- a/my_report/report.md +++ /dev/null @@ -1,874 +0,0 @@ -# Adaptive Decentralized Learning Platform with Blockchain-Based Verification and Secure Code Execution - -## TITLE PAGE - -**Adaptive Decentralized Learning Platform with Blockchain-Based Verification and Secure Code Execution** - -A Project Report Submitted in Partial Fulfillment of the Requirements for the Degree - -**Bachelor of Technology** - -**in Computer Science & Engineering** - ---- - -**Submitted By:** - -**Stalin S** – 302423243175 - -**Sidarthan** – 312423243172 - ---- - -**Under the Guidance of:** - -[Department Advisor] - -**Department of Computer Science & Engineering** - -[Institution Name] - -**April 2026** - ---- - -## BONAFIDE CERTIFICATE - -This is to certify that the project report titled **"Adaptive Decentralized Learning Platform with Blockchain-Based Verification and Secure Code Execution"** submitted by **Stalin S (302423243175)** and **Sidarthan (312423243172)** to the Department of Computer Science & Engineering is a record of bonafide project work carried out by them under my guidance and supervision. - -The project has been completed as per the requirements. The results, conclusions, and recommendations presented in this report are original and based on their work. - ---- - -**Signature** - -**Name:** [Advisor Name] - -**Designation:** [Title] - -**Date:** - ---- - -## CERTIFICATE OF EVALUATION - -This is to certify that the project work entitled **"Adaptive Decentralized Learning Platform with Blockchain-Based Verification and Secure Code Execution"** submitted by **Stalin S (302423243175)** and **Sidarthan (312423243172)** to the Department of Computer Science & Engineering has been evaluated and found to be satisfactory. - -The project demonstrates: -- Creative and innovative approach to problem-solving -- Technical competence in full-stack development -- Understanding of blockchain and distributed systems -- Proper implementation of software engineering principles - -**Internal Examiner Signature** - -**Name:** - -**Date:** - ---- - -**External Examiner Signature** - -**Name:** - -**Date:** - ---- - -## ACKNOWLEDGEMENT - -We express our sincere gratitude to our project guide and department faculty for their invaluable guidance, encouragement, and support throughout this project. Their insightful suggestions and constructive feedback have been instrumental in shaping this work. - -We would also like to acknowledge the open-source community for providing excellent frameworks and libraries that enabled us to build this comprehensive platform. The use of Flask, Next.js, Solidity, and various Python packages has significantly accelerated our development process. - -We thank our institution for providing access to computational resources and laboratory facilities necessary for the implementation and testing of this project. - -Finally, we express our appreciation to our families and peers for their moral support and encouragement during this project journey. - ---- - -## ABSTRACT - -The proliferation of online education has created unprecedented opportunities for accessible learning, yet fundamental challenges persist: static content delivery fails to accommodate diverse learner abilities, delayed feedback impedes learning momentum, and rampant credential fraud undermines trust in educational achievements. This report presents the design and implementation of **OpenLearnX**, a comprehensive adaptive learning platform that integrates three key technological innovations to address these critical issues. - -First, we implement an adaptive learning engine based on Item Response Theory (IRT) using the three-parameter logistic model, enhanced with TensorFlow-based machine learning for multi-dimensional ability estimation across skill domains. The system dynamically adjusts question difficulty based on learner responses, achieving convergence in fewer than 10 questions compared to 25-30 for traditional fixed-form assessments. - -Second, we develop a secure multi-language code execution environment utilizing subprocess-based compilation with strict process isolation, supporting eight programming languages (Python, JavaScript, Java, C++, C, Go, Rust, Ruby) with execution times under 3 seconds and comprehensive resource limits. - -Third, we introduce an ERC-721 NFT-based certification system deployed on Ethereum (with development mode using Anvil), with certificate metadata stored on IPFS for decentralized verification independent of institutional longevity. - -The platform comprises a Next.js 14 frontend with real-time analytics, a Flask backend with ten operational services, MongoDB for persistent data storage, and a fully integrated blockchain layer for immutable credential issuance. Experimental evaluation demonstrates successful handling of concurrent user sessions, accurate adaptive algorithm convergence, and secure sandboxed code execution. - -OpenLearnX represents a significant advancement in educational technology, providing a scalable, secure, and verifiable platform for personalized learning that ensures educational achievements remain permanent and tamper-proof regardless of institutional circumstances. - -**Keywords:** adaptive learning, blockchain certification, decentralized education, NFT credentials, Item Response Theory, smart contracts, IPFS, TensorFlow, ERC-721, secure code execution - ---- - -## TABLE OF CONTENTS - -1. Introduction...................................................... 1 - 1.1 Background and Motivation.................................... 1 - 1.2 Problem Statement............................................ 2 - 1.3 Proposed Solution............................................. 3 - 1.4 Contributions................................................. 4 - 1.5 Paper Organization............................................ 4 - -2. Literature Survey................................................ 5 - 2.1 Adaptive Learning Systems.................................... 5 - 2.2 Blockchain Applications in Education......................... 6 - 2.3 Decentralized Storage Systems................................ 7 - 2.4 Secure Code Execution Environment............................ 8 - -3. System Design and Architecture................................... 9 - 3.1 Design Principles............................................ 9 - 3.2 System Overview.............................................. 10 - 3.3 Architecture Components..................................... 11 - 3.4 Data Flow and Interactions.................................. 13 - -4. Implementation Details.......................................... 15 - 4.1 Frontend Implementation..................................... 15 - 4.2 Backend Services............................................ 16 - 4.3 Database Design.............................................. 17 - 4.4 Smart Contract Implementation............................... 18 - 4.5 Code Execution Engine....................................... 19 - 4.6 Adaptive Algorithm Implementation........................... 20 - -5. Results and Analysis............................................ 22 - 5.1 Performance Evaluation...................................... 22 - 5.2 Adaptive Algorithm Testing.................................. 23 - 5.3 Security Analysis........................................... 24 - 5.4 User Experience Validation.................................. 25 - -6. Deployment and Maintenance..................................... 26 - 6.1 Development Environment Setup............................... 26 - 6.2 Service Configuration....................................... 27 - 6.3 Monitoring and Debugging.................................... 27 - 6.4 Future Maintenance Considerations........................... 28 - -7. Conclusion and Future Work..................................... 29 - 7.1 Summary of Contributions.................................... 29 - 7.2 Limitations................................................... 29 - 7.3 Future Enhancements.......................................... 30 - -References........................................................ 31 - -Appendices........................................................ 33 - A. API Documentation............................................ 33 - B. Smart Contract Code........................................... 34 - C. Installation Guide............................................ 34 - D. Configuration Files........................................... 34 - ---- - -## 1. INTRODUCTION - -### 1.1 Background and Motivation - -The landscape of education has undergone a dramatic transformation in the digital age. Online learning platforms have democratized access to educational resources, enabling millions of learners worldwide to acquire new skills regardless of geographical or socioeconomic constraints. The global e-learning market, valued at approximately $250 billion in 2020, is projected to exceed $1 trillion by 2028. - -However, this rapid growth has exposed fundamental limitations in how online education delivers content, assesses learners, and verifies achievements. Traditional Learning Management Systems (LMS) operate on a one-size-fits-all model, presenting identical content sequences to all learners regardless of their prior knowledge, learning pace, or cognitive abilities. This approach fails to accommodate the natural variation in learner populations, leading to frustration for advanced students and discouragement for those struggling with material presented at an inappropriate difficulty level. - -Furthermore, the feedback loop in conventional online education is often measured in days or weeks. When learners cannot immediately identify and correct misconceptions, those errors become ingrained, requiring substantially more effort to remediate. Most critically, the credentialing ecosystem remains fundamentally broken—digital certificates can be trivially forged, and diploma fraud costs organizations billions annually. - -### 1.2 Problem Statement - -This project addresses three core problems in online education: - -1. **The Personalization Problem**: How can we efficiently estimate each learner's ability and dynamically select assessment items of appropriate difficulty to maximize learning outcomes? - -2. **The Feedback Latency Problem**: In skill domains requiring practical demonstration (such as programming), how can we provide immediate, accurate feedback while maintaining security against malicious code execution? - -3. **The Credential Verification Problem**: How can we issue educational credentials that are permanently verifiable, resistant to forgery, and independent of the issuing institution's continued operation? - -### 1.3 Proposed Solution: OpenLearnX - -We present **OpenLearnX**, a cutting-edge decentralized learning and assessment platform that revolutionizes education through the integration of three synergistic innovations: - -**Adaptive Learning Engine**: An adaptive testing system based on Item Response Theory (3PL model) extended with TensorFlow-based machine learning for multi-dimensional ability estimation. The algorithm dynamically adjusts question difficulty based on learner responses, converging to accurate ability estimates in fewer than 10 questions compared to 25-30 for fixed-form assessments. - -**Secure Code Execution Environment**: A sandboxed code execution service supporting eight programming languages with strict resource limits, timeout enforcement, and network isolation. Each submission executes in an isolated process with comprehensive security controls. - -**Blockchain Certification System**: An ERC-721 compliant smart contract on Ethereum for issuing NFT certificates. Certificate metadata is stored on IPFS, creating a permanent, decentralized record verifiable by any third party without institutional intermediation. - -### 1.4 Contributions - -The main contributions of this project include: - -1. A complete adaptive learning platform combining IRT with machine learning for accurate ability estimation -2. A secure multi-language code execution environment with comprehensive sandboxing -3. An ERC-721 NFT-based certification system with IPFS metadata storage -4. A comprehensive skill competency mapping system with visual analytics -5. A wallet-based authentication system using cryptographic signatures -6. Full integration of blockchain, decentralized storage, and centralized backend services -7. An open-source reference implementation demonstrating practical integration of these technologies - -### 1.5 Paper Organization - -This report is organized as follows: - -- **Section 2** reviews related work in adaptive learning, blockchain applications in education, and secure code execution -- **Section 3** presents the overall system architecture and design principles -- **Section 4** details the implementation of each major component -- **Section 5** describes evaluation results and validation -- **Section 6** covers deployment and maintenance considerations -- **Section 7** concludes with summary and future directions - ---- - -## 2. LITERATURE SURVEY - -### 2.1 Adaptive Learning Systems - -The concept of adapting instruction to individual learner characteristics dates to the earliest computerized educational systems. Intelligent Tutoring Systems (ITS) emerged in the 1970s, attempting to model student knowledge and adjust instruction accordingly. - -Item Response Theory (IRT) provides the mathematical foundation for modern adaptive testing. Developed by psychometricians including Lord, Rasch, and Birnbaum, IRT models the probability of a correct response as a function of learner ability and item characteristics. The three-parameter logistic (3PL) model, which we employ in OpenLearnX, is: - -``` -P(X_ij = 1 | theta_j) = c_i + (1 - c_i) / (1 + e^(-a_i(theta_j - b_i))) -``` - -Where theta_j represents learner ability, b_i is item difficulty, a_i is discrimination, and c_i is pseudo-guessing probability. - -Commercial platforms including Knewton, ALEKS, and DreamBox Learning have deployed adaptive learning at scale. Recent research has explored machine learning approaches beyond traditional IRT, with deep learning models for knowledge tracing and reinforcement learning for path optimization. - -OpenLearnX builds upon this foundation by combining classical IRT with TensorFlow-based machine learning, enabling multi-dimensional ability tracking while maintaining theoretical grounding. - -### 2.2 Blockchain Applications in Education - -Blockchain technology, introduced through Bitcoin, provides a decentralized, immutable ledger suitable for educational credential management. Ethereum's smart contracts enable programmable token issuance through the ERC-721 standard. - -The MIT Media Lab's digital diplomas project in 2017 demonstrated technical feasibility of blockchain credentials using the Blockcerts standard. Several platforms have emerged offering blockchain-based certification, including Learning Machine and the European Blockchain Services Infrastructure (EBSI). - -Existing platforms primarily treat blockchain as an add-on to traditional systems. OpenLearnX differentiates itself by integrating blockchain throughout the learning journey—from wallet-based authentication to progress tracking to certificate issuance. - -### 2.3 Decentralized Storage Systems - -The InterPlanetary File System (IPFS), developed by Protocol Labs, addresses limitations of location-based addressing through content-addressed storage. Each piece of content is identified by its cryptographic hash, enabling verification that retrieved content has not been altered. - -For educational applications, IPFS offers several advantages: course materials and credentials stored on IPFS remain accessible even if the original institution ceases operation. Content integrity is cryptographically verifiable, and geographic distribution improves access speeds. - -In OpenLearnX, we store certificate metadata on IPFS and record the IPFS hash in blockchain smart contracts. This hybrid approach combines blockchain's permanence with IPFS's ability to store arbitrary content. - -### 2.4 Secure Code Execution Environment - -Online judges for programming platforms face the challenge of executing untrusted user code safely. Malicious submissions might attempt to access sensitive files, consume excessive resources, or attack other systems. - -Process-level isolation using containerization provides defense with modest performance overhead. Platforms like HackerRank, LeetCode, and Codeforces implement secure execution at scale using Docker or similar technologies. Research identifies common vulnerabilities including insufficient resource limits, network isolation failures, and timing side channels. - -OpenLearnX implements defense in depth for code execution using subprocess isolation with CPU timeouts, memory limits, and network restrictions. Each submission executes in an isolated process destroyed after execution, preventing persistence of exploitations. - ---- - -## 3. SYSTEM DESIGN AND ARCHITECTURE - -### 3.1 Design Principles - -The OpenLearnX architecture follows several key design principles: - -1. **Decentralization**: Minimize reliance on centralized infrastructure where practical, enabling the platform to operate without single points of failure -2. **Security by Design**: Implement defense in depth, assuming that any single security control may fail -3. **Scalability**: Design for horizontal scaling to accommodate growing user populations -4. **Interoperability**: Adhere to open standards (ERC-721, JWT, REST) to enable integration with other systems -5. **User Sovereignty**: Give learners control over their identity, data, and credentials -6. **Graceful Degradation**: Services initialize with fallback functionality rather than failing completely when optional dependencies are unavailable - -### 3.2 System Overview - -OpenLearnX employs a modern microservices architecture with clear separation of concerns across four main layers: - -**Layer 1 - User Interface**: Next.js 14 frontend with React 19, TypeScript, and TailwindCSS providing real-time analytics, adaptive quiz interfaces, integrated code editor, and MetaMask wallet integration. - -**Layer 2 - Backend API**: Flask-based REST API with 9 blueprint modules (45+ endpoints) including auth, quiz, certificates, dashboard, courses, compiler, and adaptive systems. - -**Layer 3 - Data & Services**: MongoDB for persistent data storage, Redis for session/cache management, TensorFlow for adaptive algorithms, and Docker-based code execution. - -**Layer 4 - Blockchain & Storage**: Ethereum smart contracts (ERC-721) for NFT certificates and IPFS for decentralized metadata storage. - -### 3.3 Architecture Components - -**Frontend Architecture**: -- Next.js 14 with Turbopack for faster builds -- TypeScript for type safety across the application -- TailwindCSS for responsive, utility-first styling -- MetaMask integration for wallet operations -- Real-time update capabilities with WebSocket support -- Components for dashboard, quiz interface, code editor, and progress tracking - -**Backend Services**: -- **Auth Service**: Wallet nonce generation, signature verification, JWT token issuance -- **Quiz Service**: CRUD operations for quizzes, quiz attempt management, autograding -- **Certificate Service**: NFT minting, IPFS uploads, signature verification -- **Dashboard Service**: User analytics, progress tracking, competency mapping -- **Compiler Service**: Multi-language code compilation and execution -- **Adaptive Quiz Service**: IRT calculations, question selection, ability estimation -- **Course Service**: Course management and content delivery -- **Admin Service**: Platform administration and analytics -- **Exam Service**: Formal examination management -- **Web3 Service**: Blockchain interaction and smart contract calls - -**Database Schema**: -- **Users**: Authentication records, wallet addresses, learning profiles -- **Courses**: Course metadata, syllabus, prerequisites -- **Quizzes**: Question bank, difficulty ratings, IRT parameters -- **Attempts**: Quiz attempt records with responses and scores -- **Certificates**: NFT certificate records, IPFS hashes, blockchain transaction IDs -- **Progress**: User progress tracking across courses and skills -- **CodeSubmissions**: Programming exercise submissions with execution logs - -### 3.4 Data Flow and Interactions - -**Authentication Flow**: -``` -User → MetaMask Signature Request → Nonce from Backend - ↓ - Sign Nonce with Private Key - ↓ - Backend Verifies Signature → Issue JWT Token - ↓ - User Authenticated for Session -``` - -**Quiz Taking Flow**: -``` -User Requests Quiz Start → Backend Selects Questions (IRT Algorithm) - ↓ - User Views Questions and Submits Responses - ↓ - Backend Grades Responses, Updates Ability Estimate - ↓ - Algorithm Selects Next Question or Ends Quiz - ↓ - Results Returned, Progress Updated -``` - -**Certificate Minting Flow**: -``` -User Completes Quiz Successfully → Backend Validates Score - ↓ - Generate Certificate Metadata - ↓ - Upload to IPFS, Receive Content Hash - ↓ - Call Smart Contract mintCertificate() - ↓ - NFT Minted on Blockchain, Sent to User Wallet - ↓ - Transaction Hash Stored in Database -``` - -**Code Compilation Flow**: -``` -User Submits Code → Backend Creates Subprocess - ↓ - Execute Code with Resource Limits and Timeout - ↓ - Capture Output (stdout, stderr, execution time) - ↓ - Return Results or Timeout Message to User -``` - ---- - -## 4. IMPLEMENTATION DETAILS - -### 4.1 Frontend Implementation - -The frontend is built using Next.js 14 with the following key components: - -**Page Structure**: -- Dashboard: Real-time analytics and progress visualization -- Courses: Browse and enroll in available courses -- Quizzes: Adaptive quiz interface with real-time feedback -- Coding: Code editor with multi-language support -- Certificates: View and share earned NFT certificates -- Admin: Platform administration interface - -**Key Technologies**: -- React 19 components with hooks for state management -- TypeScript for type-safe development -- TailwindCSS for responsive design -- Web3.js and ethers.js for blockchain interaction -- Axios for API communication -- Firebase Authentication integration - -**UI Components**: -- Quiz runner with question display and answer recording -- Code editor with syntax highlighting -- Progress tracker with skill competency radar chart -- Certificate modal for viewing/sharing NFTs -- Dashboard with statistical visualizations -- Error boundary for graceful error handling - -### 4.2 Backend Services - -**Framework**: Flask with Python 3.13.12 - -**Core Services Implementation**: - -1. **Adaptive Quiz Service**: Implements IRT-based question selection - - Calculates ability estimates from response patterns - - Selects next question to maximize information gain - - Implements termination criteria based on convergence - -2. **AI Quiz Service**: TensorFlow integration with graceful fallback - - Pre-trained models for question generation - - Falls back to 30 hardcoded questions when models unavailable - - Supports easy, medium, and hard difficulty levels - -3. **Compiler Service**: Secure code execution - - Subprocess-based execution with resource limits - - Supports Python, JavaScript, Java, C++, C, and additional languages - - Implements timeouts and memory constraints - - Captures execution output with error handling - -4. **Certificate Service**: NFT minting and verification - - Interacts with Ethereum smart contracts - - Uploads metadata to IPFS - - Records certificate records in MongoDB - - Provides certificate verification endpoints - -5. **Wallet Service**: Cryptographic operations - - Generates nonces for signature verification - - Validates signatures using eth_account - - Issues JWT tokens with wallet claims - - Implements fallback mode for development - -### 4.3 Database Design - -MongoDB collections are organized as follows: - -``` -{ - users: [ - { wallet_address, username, email, created_at, last_login } - ], - courses: [ - { title, description, modules, prerequisites, updated_at } - ], - quizzes: [ - { title, course_id, questions, irt_parameters, difficulty } - ], - attempts: [ - { user_id, quiz_id, responses, score, completed_at, ability } - ], - certificates: [ - { user_id, course_id, tx_hash, ipfs_hash, minted_at } - ], - progress: [ - { user_id, course_id, completion_percentage, skills_acquired } - ] -} -``` - -### 4.4 Smart Contract Implementation - -**Language**: Solidity - -**Contract Features**: -- ERC-721 NFT standard implementation -- Certificate struct storing metadata -- Minting functions with access control -- Verification functions for third-party validation -- Event emission for blockchain indexing - -**Key Functions**: -``` -- mintCertificate(address to, uint256 courseId, string ipfsHash) -- getCertificate(uint256 tokenId) -- verifyCertificate(uint256 tokenId) -- getUserCertificates(address user) -``` - -### 4.5 Code Execution Engine - -**Architecture**: -- Subprocess-based execution with os.Popen() -- Resource limits via process control -- Timeout enforcement via signal handlers -- Network isolation via user namespace - -**Security Controls**: -- Maximum CPU time: 10 seconds per execution -- Maximum memory: 256MB per process -- No network access allowed -- No file system write access -- Process destroyed after execution - -### 4.6 Adaptive Algorithm Implementation - -**IRT Implementation**: -``` -Ability Estimate (theta) initialized to 0 -For each response (correct/incorrect): - 1. Calculate probability of response given current theta - 2. Update theta using Maximum Likelihood Estimation - 3. Calculate Fisher Information - 4. Select next item maximizing Fisher Information - 5. Repeat until convergence or max items reached -``` - -**Convergence Criteria**: -- Ability estimate changes < 0.1 in consecutive estimates -- Maximum 25 questions reached -- Confidence interval width < 0.5 - ---- - -## 5. RESULTS AND ANALYSIS - -### 5.1 Performance Evaluation - -**Backend Performance**: -- Health endpoint response: < 50ms -- Quiz creation: < 200ms -- Compiler execution: 1-3 seconds average -- Database queries: < 100ms avg - -**Frontend Performance**: -- Build time: < 5 minutes with Turbopack -- Page load time: < 2 seconds -- Interactive elements: sub-100ms response times - -**Scalability Testing**: -- Concurrent users supported: 500+ -- API throughput: 1000+ requests/second -- Database connection pool: 100 connections -- Cache hit ratio: 85%+ for frequently accessed data - -### 5.2 Adaptive Algorithm Testing - -**Convergence Analysis**: -- Average questions to convergence: 8.3 -- Accuracy correlation with theta: 0.94 -- Precision of ability estimates: ±0.25 (95% CI) -- Comparison to traditional assessment: 3x faster convergence - -**Question Selection Efficiency**: -- Information gain per question: 15-25% improvement over random -- Difficulty progression: Matches learner ability trajectory -- Discrimination Index: 0.75-0.85 average - -### 5.3 Security Analysis - -**Code Execution Security**: -- Sandbox escape attempts: 0/100 tested -- Resource limit enforcement: 100% compliance -- Timeout enforcement: 100% compliance -- Network isolation: Verified via strace analysis - -**Blockchain Security**: -- Smart contract audit: No critical vulnerabilities -- Authorization checks: Properly enforced -- Re-entrancy protection: Implemented -- External call safety: Verified - -**Application Security**: -- SQL injection: Prevented via parameterized queries -- XSS vulnerabilities: Mitigated via React escaping -- CSRF protection: Implemented via JWT validation -- Authentication bypass: No issues found - -### 5.4 User Experience Validation - -**Usability Metrics**: -- Successful authentication rate: 98% -- Quiz completion rate: 92% -- Certificate claim rate: 95% -- Error recovery rate: 88% - -**User Feedback**: -- Interface intuitiveness: 4.5/5.0 average -- Platform responsiveness: 4.6/5.0 average -- Feature completeness: 4.3/5.0 average - ---- - -## 6. DEPLOYMENT AND MAINTENANCE - -### 6.1 Development Environment Setup - -**Prerequisites**: -- Node.js 18+ and pnpm package manager -- Python 3.10+ with pip -- MongoDB 6.0+ or higher -- Foundry toolkit (anvil, forge) -- Docker (optional for production) - -**Installation Steps**: -```bash -# 1. Install Foundry -curl -L https://foundry.paradigm.xyz | bash -foundryup - -# 2. Start Anvil blockchain -anvil - -# 3. Setup backend -cd backend -python3 -m venv venv -source venv/bin/activate -pip install -r requirements.txt -python main.py - -# 4. Setup frontend -cd frontend -pnpm install -pnpm dev - -# 5. Access application -# Frontend: http://localhost:3001 -# Backend API: http://localhost:5000/api/health -``` - -### 6.2 Service Configuration - -**Environment Variables**: -``` -FLASK_ENV=development -MONGODB_URI=mongodb://localhost:27017/openlearnx -WEB3_PROVIDER_URL=http://127.0.0.1:8545 -CONTRACT_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 -NEXT_PUBLIC_API_URL=http://localhost:5000/api -``` - -**Service Dependencies**: -- MongoDB for data persistence -- Redis for session management (optional) -- Anvil for local blockchain -- Docker for code execution (optional) - -### 6.3 Monitoring and Debugging - -**Health Checks**: -- `/api/health`: Returns service status and availability -- Database connectivity monitoring -- Smart contract deployment verification -- API endpoint response time tracking - -**Logging**: -- Backend logs: `/tmp/backend.log` -- Frontend logs: Browser console -- Transaction logs: Blockchain explorer - -### 6.4 Future Maintenance Considerations - -- Regular database backup and archival -- Smart contract upgrade management via proxy pattern -- Performance optimization through caching improvements -- Security patches for dependencies -- Load balancing for horizontal scaling - ---- - -## 7. CONCLUSION AND FUTURE WORK - -### 7.1 Summary of Contributions - -OpenLearnX successfully demonstrates the integration of adaptive learning algorithms, secure code execution, and blockchain-based credentialing into a cohesive educational platform. The project makes significant contributions to online education: - -1. **Adaptive Learning**: Successfully reduced assessment time by 3x compared to traditional methods while maintaining accuracy -2. **Code Execution**: Implemented secure, sandboxed execution for 8+ programming languages -3. **Blockchain Integration**: Created verifiable, permanent credentials independent of institutional infrastructure -4. **Full Stack Implementation**: Demonstrated practical integration across frontend, backend, blockchain, and storage systems - -### 7.2 Limitations - -1. **Scalability**: Current implementation not optimized for 10,000+ concurrent users -2. **AI Models**: TensorFlow models not pre-trained for production use -3. **IPFS Integration**: Centralized IPFS node dependency for production -4. **Geographic Distribution**: Single-point deployment without CDN -5. **Mobile Support**: Frontend optimized for desktop, mobile support pending - -### 7.3 Future Enhancements - -**Short-term (3-6 months)**: -- Mobile application development -- Multi-language adaptation -- Additional programming languages support -- Real-time collaboration features -- Advanced analytics dashboards - -**Medium-term (6-12 months)**: -- Machine learning model improvements -- Distributed database replication -- Layer 2 blockchain integration (Polygon, Arbitrum) -- Decentralized governance through DAOs -- IPFS pinning service integration - -**Long-term (1-2 years)**: -- Federated learning across institutions -- Cross-platform credential recognition -- Advanced peer assessment algorithms -- Integration with institutional LMS platforms -- Research opportunity marketplace - ---- - -## REFERENCES - -[1] Ambient Insight. (2018). "The U.S. Self-Paced eLearning Market 2014-2025." Market research report. - -[2] Bloom, B. S. (1984). "The 2 sigma problem: The search for methods of group instruction as effective as one-to-one tutoring." Educational Researcher, 13(6), 4-16. - -[3] Ebbinghaus, H. (1885). "Memory: A contribution to experimental psychology." Teachers College, Columbia University. - -[4] Society for Human Resource Management. (2018). "2018 Employees Benefits Survey." SHRM research. - -[5] Anderson, J. R. (2005). "Cognitive Psychology and its Implications." Worth Publishers, 6th edition. - -[6] Birnbaum, A. (1968). "Some latent trait models and their use in inferring an examinee's ability." In F. M. Lord & M. R. Novick (Eds.), Statistical theories of mental test scores. Addison-Wesley. - -[7] Piech, C., Bassen, J., Huang, J., et al. (2015). "Deep knowledge tracing." In Advances in Neural Information Processing Systems (pp. 505-513). - -[8] Rafferty, A. N., Brunskill, E., Griffiths, T. L., & Shih, B. (2016). "Faster teaching via active learning." In International Conference on Machine Learning (pp. 590-598). - -[9] Zhang, L., Xiong, X., Zhao, S., Botelho, A., & Heffernan, N. T. (2017). "Incorporating rich information into invasive branching student models." In Educational Data Mining. - -[10] Nakamoto, S. (2008). "Bitcoin: A peer-to-peer electronic cash system." Whitepaper. - -[11] Buterin, V. (2013). "Ethereum: A next-generation smart contract and decentralized application platform." Whitepaper. - -[12] MIT Media Lab. (2017). "Learning machine and MIT media lab develop digital diplomas project." Press release. - -[13] Grech, A., & Camilleri, A. F. (2017). "Blockchain in education." EUR 28778 EN. Publications Office of the European Union. - -[14] Benet, J. (2014). "IPFS - content addressed, versioned, P2P file system." arXiv preprint arXiv:1407.3561. - -[15] Li, Z., Liu, H., Teng, K., Gao, Y., & Xiao, M. (2018). "Online judge system security design and implementation." In 2018 International Conference on Intelligent and Interactive Systems and Applications. - ---- - -## APPENDICES - -### A. API DOCUMENTATION - -**Health Check Endpoint** -``` -GET /api/health - -Response: -{ - "status": "healthy", - "blueprints_registered": 9, - "services": { - "ai_quiz_service": true, - "compiler": true, - "wallet": true, - "mongodb": "connected" - } -} -``` - -**Quiz Management Endpoints** -``` -POST /api/quizzes/create - Create new quiz -GET /api/quizzes/list - List available quizzes -POST /api/quizzes/start - Start quiz session -POST /api/quizzes/submit - Submit quiz responses -GET /api/quizzes/{quiz_id} - Get quiz details -``` - -**Code Compilation Endpoints** -``` -POST /api/compiler/execute -Request: { "code": "...", "language": "python" } -Response: { "output": "...", "error": null, "execution_time": 0.5 } -``` - -**Certificate Endpoints** -``` -POST /api/certificate/mint - Mint NFT certificate -GET /api/certificate/{token_id} - Get certificate details -POST /api/certificate/verify - Verify certificate on blockchain -``` - -### B. SMART CONTRACT CODE - -**CertificateNFT.sol** (Solidity) - -```solidity -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; - -contract CertificateNFT is ERC721, Ownable { - struct Certificate { - string course; - uint256 issueDate; - string ipfsHash; - bool verified; - } - - mapping(uint256 => Certificate) public certificates; - uint256 private tokenCounter; - - event CertificateMinted( - uint256 indexed tokenId, - address indexed student, - string course - ); - - constructor() ERC721("OpenLearnX", "OLX") {} - - function mintCertificate( - address to, - string memory course, - string memory ipfsHash - ) public onlyOwner returns (uint256) { - uint256 tokenId = tokenCounter++; - - _safeMint(to, tokenId); - certificates[tokenId] = Certificate({ - course: course, - issueDate: block.timestamp, - ipfsHash: ipfsHash, - verified: true - }); - - emit CertificateMinted(tokenId, to, course); - return tokenId; - } - - function verifyCertificate(uint256 tokenId) - public - view - returns (bool) - { - return certificates[tokenId].verified; - } -} -``` - -### C. INSTALLATION GUIDE - -See [QUICK_START.md](../QUICK_START.md) and [DOCUMENTATION.md](../DOCUMENTATION.md) in the project repository for comprehensive installation and setup instructions. - -### D. CONFIGURATION FILES - -**backend/.env** -``` -FLASK_ENV=development -MONGODB_URI=mongodb://localhost:27017/openlearnx -WEB3_PROVIDER_URL=http://127.0.0.1:8545 -CONTRACT_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3 -JWT_SECRET_KEY=your-secret-key-here -``` - -**frontend/.env.local** -``` -NEXT_PUBLIC_API_URL=http://localhost:5000/api -NEXT_PUBLIC_WEB3_PROVIDER_URL=http://127.0.0.1:8545 -``` - ---- - -**Document Generated**: April 2026 - -**Status**: Project Report - Final Submission - ---- - -# END OF REPORT diff --git a/my_report/report.pdf b/my_report/report.pdf deleted file mode 100644 index 882456e..0000000 Binary files a/my_report/report.pdf and /dev/null differ diff --git a/my_report/report_final.pdf b/my_report/report_final.pdf deleted file mode 100644 index eaa3d32..0000000 Binary files a/my_report/report_final.pdf and /dev/null differ diff --git a/my_report/report_formatted.md b/my_report/report_formatted.md deleted file mode 100644 index ec17d0d..0000000 --- a/my_report/report_formatted.md +++ /dev/null @@ -1,673 +0,0 @@ -# OPENLEARNX: ADAPTIVE DECENTRALIZED LEARNING PLATFORM WITH BLOCKCHAIN-BASED VERIFICATION AND SECURE CODE EXECUTION - -## A PROJECT REPORT - -Submitted By - -**Stalin S [Roll: 302423243175]** - -**Sidarthan [Roll: 312423243172]** - -in partial fulfillment for the of award of the degree - -of - -**BACHELOR OF TECHNOLOGY** - -in - -**COMPUTER SCIENCE & ENGINEERING** - -[INSTITUTION NAME]: DELHI 110001 - -APRIL 2026 - ---- - -## BONAFIDE CERTIFICATE - -Certified that this project report "OPENLEARNX: ADAPTIVE DECENTRALIZED LEARNING PLATFORM WITH BLOCKCHAIN-BASED VERIFICATION AND SECURE CODE EXECUTION" is the bonafide work of "Stalin S [Roll: 302423243175] and Sidarthan [Roll: 312423243172]" who carried out the project work under my supervision. - -SIGNATURE SIGNATURE - -[Signature] [Signature] - -Dr. [Name] [Advisor Name] - -Professor/ Head Assistant Professor - -HEAD OF THE DEPARTMENT SUPERVISOR - -Department of Department of - -Computer Science & Engineering Computer Science & Engineering - -[Institution Name] [Institution Name] - -Old Mamallapuram Road Old Mamallapuram Road - -Delhi-110001 Delhi-110001 - -Submitted for the Viva-Voce held on ________ - -INTERNAL EXAMINER EXTERNAL EXAMINER - -[Signature] [Signature] - ---- - -## CERTIFICATE OF EVALUATION - -College Name : [Institution Name] - -Branch & Semester : Computer Science & Engineering (VIII) - -S.NO NAMES OF TITLE OF THE NAME OF THE -STUDENTS PROJECT SUPERVISOR -WITH -DESIGNATION - -1. Stalin S OpenLearnX: Adaptive [Advisor Name] -[Roll: 302423243175] Decentralized Learning -2. Sidarthan Platform with [Designation] -[Roll: 312423243172] Blockchain-Based -Verification and Secure -Code Execution - -The report of the project work submitted by the above students for Project Work in Computer Science & Engineering were evaluated and confirmed to be reports of the work done by the above students and then evaluated. - -INTERNAL EXAMINER EXTERNAL EXAMINER - -[Signature] [Signature] - ---- - -## ACKNOWLEDGEMENT - -The contentment and elation that accompany the successful completion of any work would be incomplete without mentioning the people who made it possible. - -We are extremely happy to express our gratitude in thanking our beloved Chairman Dr. [Name] M.A., M.B.A., Ph.D who has been a pillar of strength to this college. - -Words are inadequate in offering our sincere thanks and gratitude to our respected Managing Director Mr. [Name] M.Sc and heartfelt gratitude to our respected Executive Director Mrs. [Name] M.Com and our beloved Principal Dr. [Name] M.E., Ph.D and heartfelt gratitude to our respected Dean Academics Dr. [Name] M.Tech., Ph.D for having encouraged us to do our undergraduation in Computer Science and Engineering in this esteemed college. - -We also express our sincere thanks and most heartfelt sense of gratitude to our eminent Head of the Department Dr. [Name] M.E, Ph.D for having extended her helping hand at all times. - -It is with deep sense of gratitude that we acknowledge our indebtedness to our Supervisor [Advisor Name] M.E.,(Ph.D) a perfectionist for her expert guidance and connoisseur suggestion. - -Last but not the least, we thank our family members and friends who have been the greatest source of support to us. - ---- - -## ABSTRACT - -The proliferation of online education has created unprecedented opportunities for accessible learning, yet fundamental challenges persist: static content delivery fails to accommodate diverse learner abilities, delayed feedback impedes learning momentum, and rampant credential fraud undermines trust in educational achievements. This project presents OpenLearnX, a comprehensive adaptive learning platform that integrates three key technological innovations to address these critical issues. - -First, we implement an adaptive learning engine based on Item Response Theory (IRT) using the three-parameter logistic model, enhanced with TensorFlow-based machine learning for multi-dimensional ability estimation across skill domains. The system dynamically adjusts question difficulty based on learner responses, achieving convergence in fewer than 10 questions compared to 25-30 for traditional fixed-form assessments. - -Second, we develop a secure multi-language code execution environment utilizing subprocess-based compilation with strict process isolation, supporting eight programming languages (Python, JavaScript, Java, C++, C, Go, Rust, Ruby) with execution times under 3 seconds and comprehensive resource limits. - -Third, we introduce an ERC-721 NFT-based certification system deployed on Ethereum (with development mode using Anvil), with certificate metadata stored on IPFS for decentralized verification independent of institutional longevity. - -The platform comprises a Next.js 14 frontend with real-time analytics, a Flask backend with ten operational services, MongoDB for persistent data storage, and a fully integrated blockchain layer for immutable credential issuance. Experimental evaluation demonstrates successful handling of concurrent user sessions, accurate adaptive algorithm convergence, and secure sandboxed code execution. OpenLearnX represents a significant advancement in educational technology, providing a scalable, secure, and verifiable platform for personalized learning that ensures educational achievements remain permanent and tamper-proof. - -**Keywords:** Adaptive Learning, Blockchain Certification, Decentralized Education, NFT Credentials, Item Response Theory, Smart Contracts, IPFS, TensorFlow, ERC-721, Secure Code Execution - ---- - -## TABLE OF CONTENTS - -| CHAPTER NO. | TITLE | PAGE NO. | -|---|---|---| -| | ABSTRACT | iv | -| | LIST OF TABLES | viii | -| | LIST OF FIGURES | ix | -| | LIST OF ABBREVIATION | x | -| 1 | INTRODUCTION | 1 | -| 1.1 | BACKGROUND | 3 | -| 1.2 | PROBLEM IDENTIFIED | 6 | -| 1.3 | OBJECTIVES | 7 | -| 1.4 | AIM OF PROJECT | 8 | -| 2 | LITERATURE REVIEW | 10 | -| 3 | EXISTING SYSTEM | 14 | -| 3.1 | LIMITATION OF THE EXISTING SYSTEM | 16 | -| 3.2 | SYSTEM REQUIREMENTS | 17 | -| 3.3 | FEASIBILITY STUDY | 20 | -| 3.3.1 | Technical Feasibility | 20 | -| 3.3.2 | Economic Feasibility | 21 | -| 3.3.3 | Operational Feasibility | 21 | -| 3.3.4 | Legal and Security Feasibility | 21 | -| 4 | SYSTEM DESIGN | 22 | -| 4.1 | ALGORITHMIC WORKFLOW | 28 | -| 4.2 | ADVANTAGES OF THE SYSTEM | 29 | -| 5 | IMPLEMENTATION | 32 | -| 5.1 | TECHNOLOGY STACK | 32 | -| 5.2 | IMPLEMENTATION OF CORE SYSTEM MODULES | 33 | -| 5.3 | MACHINE LEARNING INTEGRATION AND DEPLOYMENT | 34 | -| 6 | RESULTS AND PERFORMANCE ANALYSIS | 35 | -| 6.1 | FUNCTIONAL VALIDATION AND QUERY EXECUTION ANALYSIS | 35 | -| 6.2 | PREDICTIVE MODEL PERFORMANCE EVALUATION | 37 | -| 6.3 | SYSTEM PERFORMANCE AND EFFICIENCY ANALYSIS | 38 | -| 6.4 | COMPARATIVE ANALYSIS | 40 | -| 7 | CONCLUSION | 41 | -| | APPENDICES | 42 | -| | REFERENCES | 48 | - ---- - -## LIST OF TABLES - -| TABLE NO. | TITLE | PAGE NO. | -|---|---|---| -| 1 | Comparative Analysis of Adaptive Learning Systems | 14 | -| 2 | Functional Requirements | 18 | -| 3 | Non-Functional Requirements | 18 | -| 4 | Database Schema Description | 24 | -| 5 | API Endpoints Description | 27 | -| 6 | Smart Contract Functions | 44 | -| 7 | Code Execution Service Specifications | 45 | -| 8 | Performance Metrics | 45 | -| 9 | Security Test Results | 46 | -| 10 | Service Component Details | 47 | - ---- - -## LIST OF FIGURES - -| FIGURE NO. | NAME OF THE FIGURE | PAGE NO. | -|---|---|---| -| 1 | Overall Architecture of OpenLearnX | 23 | -| 2 | Workflow of Adaptive Quiz System | 25 | -| 3 | Smart Contract Deployment Flow | 26 | -| 4 | Code Execution Security Architecture | 36 | -| 5 | API Response Time Analysis | 37 | -| 6 | Ability Estimation Convergence | 38 | -| 7 | System Performance Dashboard | 39 | - ---- - -## LIST OF ABBREVIATIONS - -| ABBREVIATION | FULL FORM | -|---|---| -| IRT | Item Response Theory | -| 3PL | Three-Parameter Logistic | -| NFT | Non-Fungible Token | -| ERC | Ethereum Request for Comments | -| IPFS | InterPlanetary File System | -| JWT | JSON Web Token | -| REST | Representational State Transfer | -| SQL | Structured Query Language | -| LLM | Large Language Model | -| API | Application Programming Interface | -| MLOps | Machine Learning Operations | - ---- - -# 1 INTRODUCTION - -## 1.1 BACKGROUND - -The landscape of education has undergone a dramatic transformation in the digital age. Online learning platforms have democratized access to educational resources, enabling millions of learners worldwide to acquire new skills regardless of geographical or socioeconomic constraints. The global e-learning market, valued at approximately $250 billion in 2020, is projected to exceed $1 trillion by 2028. - -However, this rapid growth has exposed fundamental limitations in how online education delivers content, assesses learners, and verifies achievements. Traditional Learning Management Systems (LMS) operate on a one-size-fits-all model, presenting identical content sequences to all learners regardless of their prior knowledge, learning pace, or cognitive abilities. This approach fails to accommodate the natural variation in learner populations, leading to frustration for advanced students and discouragement for those struggling with material presented at an inappropriate difficulty level. - -Furthermore, the feedback loop in conventional online education is often measured in days or weeks. When learners cannot immediately identify and correct misconceptions, those errors become ingrained, requiring substantially more effort to remediate. Most critically, the credentialing ecosystem remains fundamentally broken—digital certificates can be trivially forged, and diploma fraud costs organizations billions annually. - -The need for personalized, secure, and verifiable education systems has never been more pressing. This project addresses these challenges directly through technological innovation. - -## 1.2 PROBLEM IDENTIFIED - -The core problems addressed by this research can be formalized as follows: - -1. **The Personalization Problem**: Given a heterogeneous population of learners with varying abilities, how can we efficiently estimate each learner's ability and dynamically select assessment items of appropriate difficulty to maximize learning outcomes? - -2. **The Feedback Latency Problem**: In skill domains requiring practical demonstration (such as programming), how can we provide immediate, accurate feedback on learner submissions while maintaining security against malicious code execution? - -3. **The Credential Verification Problem**: How can we issue educational credentials that are permanently verifiable, resistant to forgery, and independent of the issuing institution's continued operation? - -These problems have significant impacts on learner outcomes, institutional efficiency, and trust in educational systems. - -## 1.3 OBJECTIVES - -The main objectives of this project are: - -1. Design and implement an adaptive learning algorithm based on Item Response Theory that efficiently converges to accurate ability estimates -2. Develop a secure multi-language code execution environment with comprehensive sandboxing and resource control -3. Create a blockchain-based certification system using ERC-721 NFT standards for immutable credential issuance -4. Integrate multiple technologies (frontend, backend, blockchain, storage) into a cohesive learning platform -5. Validate system performance, security, and scalability through comprehensive testing -6. Demonstrate practical feasibility of decentralized education technology - -## 1.4 AIM OF PROJECT - -The aim of OpenLearnX is to revolutionize online education by providing a comprehensive platform that combines adaptive learning, instant feedback, and verifiable credentials. By integrating cutting-edge technologies including artificial intelligence, blockchain, and decentralized storage, the project aims to create an educational system that is: - -- **Personalized**: Adapts content and assessment to individual learner needs -- **Secure**: Protects learner data and prevents credential fraud -- **Scalable**: Can handle thousands of concurrent users -- **Decentralized**: Reduces dependency on centralized institutions -- **Verifiable**: Provides permanent, independently verifiable credentials - ---- - -# 2 LITERATURE REVIEW - -## 2.1 Adaptive Learning Systems - -The concept of adapting instruction to individual learner characteristics dates to the earliest computerized educational systems. Intelligent Tutoring Systems (ITS) emerged in the 1970s, attempting to model student knowledge and adjust instruction accordingly. Commercial platforms including ALEKS, Knewton, and DreamBox Learning have deployed adaptive learning at scale. - -Item Response Theory (IRT) provides the mathematical foundation for modern adaptive testing. The three-parameter logistic (3PL) model, which we employ in OpenLearnX, calculates the probability of a correct response based on learner ability and item characteristics. - -Recent research has explored machine learning approaches beyond traditional IRT, with deep learning models for knowledge tracing and reinforcement learning for path optimization. OpenLearnX builds upon this foundation by combining classical IRT with TensorFlow-based machine learning. - -## 2.2 Blockchain Applications in Education - -Blockchain technology provides a decentralized, immutable ledger suitable for educational credential management. The MIT Media Lab's digital diplomas project in 2017 demonstrated technical feasibility using the Blockcerts standard. Several platforms have emerged offering blockchain-based certification. - -Existing platforms primarily treat blockchain as an add-on to traditional systems. OpenLearnX differentiates itself by integrating blockchain throughout the learning journey—from wallet-based authentication to progress tracking to certificate issuance. - -## 2.3 Decentralized Storage Systems - -The InterPlanetary File System (IPFS), developed by Protocol Labs, addresses limitations of location-based addressing through content-addressed storage. For educational applications, IPFS offers several advantages: course materials remain accessible even if institutions cease operation, and content integrity is cryptographically verifiable. - -In OpenLearnX, we store certificate metadata on IPFS and record the IPFS hash in blockchain smart contracts, combining blockchain's permanence with IPFS's ability to store arbitrary content. - -## 2.4 Secure Code Execution - -Online judges for programming platforms face the challenge of executing untrusted user code safely. Platforms like HackerRank, LeetCode, and Codeforces implement secure execution at scale. Process-level isolation using containerization provides defense with modest performance overhead. - -OpenLearnX implements defense in depth for code execution using subprocess isolation with CPU timeouts, memory limits, and network restrictions. Each submission executes in an isolated process destroyed after execution. - ---- - -# 3 EXISTING SYSTEM - -## 3.1 LIMITATIONS OF THE EXISTING SYSTEM - -Current online learning platforms suffer from several critical limitations: - -1. **Static Content Delivery**: One-size-fits-all approach fails to accommodate diverse learner abilities -2. **Delayed Feedback**: Assessment often takes days or weeks, disrupting learning momentum -3. **Credential Fraud**: Digital certificates are easily forged using basic image editing -4. **Centralized Architecture**: Single points of failure and institutional dependency -5. **Limited Language Support**: Few platforms support multiple programming languages for coding assessment -6. **Privacy Concerns**: Centralized data storage raises privacy and ownership issues -7. **Lack of Interoperability**: Difficult to transfer credentials between institutions - -## 3.2 SYSTEM REQUIREMENTS - -### Functional Requirements - -| Requirement ID | Description | Priority | -|---|---|---| -| FR1 | User authentication via wallet signatures | High | -| FR2 | Adaptive quiz interface with real-time feedback | High | -| FR3 | Multi-language code compilation and execution | High | -| FR4 | NFT certificate minting and verification | High | -| FR5 | Progress tracking and analytics dashboard | High | -| FR6 | IPFS metadata storage integration | Medium | -| FR7 | Admin panel for course management | Medium | -| FR8 | Peer review system with AI bias detection | Low | - -### Non-Functional Requirements - -| Requirement ID | Description | Priority | -|---|---|---| -| NFR1 | System uptime: 99.5% | High | -| NFR2 | API response time: < 200ms (95th percentile) | High | -| NFR3 | Code execution timeout: < 10 seconds | High | -| NFR4 | Support for 500+ concurrent users | High | -| NFR5 | Database backup and recovery | Medium | -| NFR6 | Mobile-responsive design | Medium | -| NFR7 | GDPR compliance | Medium | - -## 3.3 FEASIBILITY STUDY - -### 3.3.1 Technical Feasibility - -**Conclusion: HIGHLY FEASIBLE** - -The project utilizes well-established technologies: -- Next.js and React for frontend development -- Flask for REST API backend -- MongoDB for document storage -- Ethereum for smart contracts -- IPFS for decentralized storage -- TensorFlow for machine learning - -All components have proven scalability and production-ready implementations available in the open-source community. - -### 3.3.2 Economic Feasibility - -**Conclusion: ECONOMICALLY VIABLE** - -Cost breakdown: -- **Infrastructure**: Minimal (can run on single server initially) -- **Development Time**: Estimated 6 months for MVP -- **Maintenance**: Low operational cost with automated scaling -- **Return on Investment**: B2B licensing model with potential SaaS offering - -### 3.3.3 Operational Feasibility - -**Conclusion: OPERATIONALLY PRACTICAL** - -- Development team has expertise in required technologies -- Agile development methodology enables iterative delivery -- Open-source tools reduce vendor lock-in -- Clear deployment and scaling procedures - -### 3.3.4 Legal and Security Feasibility - -**Conclusion: SECURE AND COMPLIANT** - -- Smart contract audited for vulnerabilities -- Data encryption in transit and at rest -- GDPR-compliant data handling -- Regular security testing and penetration assessments - ---- - -# 4 SYSTEM DESIGN - -## 4.1 ALGORITHMIC WORKFLOW - -### Adaptive Quiz Algorithm - -``` -1. Initialize learner ability theta = 0 -2. For each quiz attempt: - a. Calculate item difficulty using IRT - b. Select next question to maximize information gain - c. Learner responds to question - d. Evaluate response (correct/incorrect) - e. Update ability estimate using MLE - f. Calculate Fisher Information - g. If convergence criteria met: - - End quiz - - Issue certificate if passed - h. Else continue to step b -``` - -### Certificate Minting Workflow - -``` -1. Quiz completed successfully -2. Calculate final ability score -3. Generate certificate metadata JSON -4. Upload metadata to IPFS -5. Receive content hash -6. Call smart contract mintCertificate() -7. NFT minted, sent to user wallet -8. Store transaction hash in MongoDB -``` - -## 4.2 ADVANTAGES OF THE SYSTEM - -1. **Personalized Learning**: Adapts to individual learner pace and ability -2. **Immediate Feedback**: Code execution results within 3 seconds -3. **Secure Architecture**: Multi-layer security with defense-in-depth -4. **Scalable Design**: Horizontal scaling capability for thousands of users -5. **Permanent Credentials**: Blockchain-based certificates persist indefinitely -6. **Open Standards**: Uses ERC-721, JWT, REST APIs for interoperability -7. **Cost-Effective**: Minimal infrastructure requirements -8. **Privacy-Focused**: User data under learner control via wallet - ---- - -# 5 IMPLEMENTATION - -## 5.1 TECHNOLOGY STACK - -| Layer | Technology | Purpose | -|---|---|---| -| Frontend | Next.js 14, React 19, TypeScript | User interface and components | -| Styling | TailwindCSS | Responsive design | -| Backend | Flask (Python 3.13) | REST API backend | -| Database | MongoDB | Document storage | -| Cache | Redis | Session and cache management | -| ML/AI | TensorFlow, NumPy, Scikit-learn | Adaptive algorithm implementation | -| Blockchain | Solidity, Web3.py | Smart contracts and blockchain interaction | -| Storage | IPFS | Decentralized metadata storage | -| Dev Environment | Foundry (Anvil) | Local Ethereum development | - -## 5.2 IMPLEMENTATION OF CORE SYSTEM MODULES - -### Module 1: Authentication Service -- Wallet nonce generation -- Cryptographic signature verification -- JWT token issuance and validation -- Session management - -### Module 2: Adaptive Quiz Service -- Question bank management -- IRT-based difficulty calculation -- Ability estimation algorithm -- Convergence detection - -### Module 3: Code Execution Service -- Multi-language compilation support -- Subprocess isolation -- Resource limiting (CPU, memory, timeout) -- Execution result capture and reporting - -### Module 4: Certificate Service -- NFT minting operations -- IPFS metadata upload -- Blockchain transaction management -- Certificate verification endpoints - -### Module 5: Dashboard Service -- User analytics and statistics -- Progress tracking -- Competency mapping -- Performance visualization - -## 5.3 MACHINE LEARNING INTEGRATION AND DEPLOYMENT - -The TensorFlow integration enables: -- Multi-dimensional ability estimation -- Question generation using pre-trained models -- Difficulty prediction for new questions -- Performance forecasting - -Deployment considerations: -- Model versioning and management -- A/B testing framework -- Real-time inference with minimal latency -- GPU acceleration for large-scale inference - ---- - -# 6 RESULTS AND PERFORMANCE ANALYSIS - -## 6.1 FUNCTIONAL VALIDATION AND QUERY EXECUTION ANALYSIS - -**Quiz Execution Results:** -- [OK] Authentication: 100% success rate -- [OK] Quiz creation: Average 150ms -- [OK] Question retrieval: Average 80ms -- [OK] Answer grading: Average 120ms -- [OK] Certificate issuance: Average 2.5 seconds - -**Sample Output:** -``` -Quiz Session: QZ_001 -User Ability (Initial): 0.00 -Question 1: Difficulty 0.5 - Correct -Updated Ability: 0.45 -Question 2: Difficulty 0.7 - Correct -Updated Ability: 0.68 -Convergence achieved in 8 questions -Final Ability: 0.82 (+/- 0.15) -``` - -## 6.2 PREDICTIVE MODEL PERFORMANCE EVALUATION - -**Adaptive Algorithm Metrics:** -- Convergence speed: Average 8.3 questions (vs 25-30 for traditional) -- Ability estimation accuracy: 0.94 correlation -- Confidence interval width: 0.25 (95% CI) -- Information gain per question: 18% improvement - -**Machine Learning Model Performance:** -- Question difficulty prediction: 88% accuracy -- Learner performance prediction: 0.91 R-squared -- Recommendation precision: 0.86 - -## 6.3 SYSTEM PERFORMANCE AND EFFICIENCY ANALYSIS - -**API Performance:** -- Average response time: 95ms -- 95th percentile: 127ms -- 99th percentile: 356ms -- Throughput: 1250 requests/second - -**Code Execution Performance:** -- Python execution: 1.2 seconds average -- JavaScript execution: 0.9 seconds average -- Java execution: 2.1 seconds average -- Success rate: 99.7% - -**Database Performance:** -- Query response time: < 100ms -- Index efficiency: 0.94 -- Cache hit ratio: 87% - -## 6.4 COMPARATIVE ANALYSIS - -| Metric | OpenLearnX | ALEKS | Knewton | Traditional LMS | -|---|---|---|---|---| -| Convergence Speed (questions) | 8.3 | 12 | 15 | 25-30 | -| Credential Permanence | Permanent (NFT) | Institutional | Institutional | Institutional | -| Decentralization | Full | None | None | None | -| Code Execution Support | 8 languages | Limited | Limited | None | -| Security Model | Blockchain | Centralized | Centralized | Centralized | - ---- - -# 7 CONCLUSION - -OpenLearnX successfully demonstrates the integration of adaptive learning algorithms, secure code execution, and blockchain-based credentialing into a cohesive educational platform. The experimental evaluation confirms that the system achieves its objectives: - -1. **Adaptive learning** reduces assessment time by 3x while maintaining accuracy -2. **Secure code execution** handles multiple programming languages safely -3. **Blockchain certificates** provide permanent, verifiable credentials -4. **Scalable architecture** supports hundreds of concurrent users - -The project makes significant contributions to online education technology. Future enhancements include mobile applications, advanced ML models, and cross-institutional credential recognition. - ---- - -# APPENDICES - -## APPENDIX A: API DOCUMENTATION - -### Health Check Endpoint - -``` -GET /api/health -Response: { - "status": "healthy", - "blueprints_registered": 9, - "services": { - "ai_quiz_service": true, - "compiler": true - } -} -``` - -### Quiz Endpoints - -``` -POST /api/quizzes/create -POST /api/quizzes/start -POST /api/quizzes/submit -GET /api/quizzes/list -``` - -### Code Compilation - -``` -POST /api/compiler/execute -Request: {"code": "...", "language": "python"} -Response: {"output": "...", "error": null} -``` - -## APPENDIX B: SMART CONTRACT CODE - -```solidity -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; - -contract CertificateNFT is ERC721 { - struct Certificate { - string course; - uint256 issueDate; - string ipfsHash; - } - - mapping(uint256 => Certificate) public certificates; - - function mintCertificate( - address to, - string memory course, - string memory ipfsHash - ) public returns (uint256) { - uint256 tokenId = uint256(keccak256(abi.encodePacked(to, course))); - _safeMint(to, tokenId); - certificates[tokenId] = Certificate(course, block.timestamp, ipfsHash); - return tokenId; - } -} -``` - -## APPENDIX C: INSTALLATION GUIDE - -See QUICK_START.md and DOCUMENTATION.md for comprehensive installation instructions. - -## APPENDIX D: CONFIGURATION FILES - -**backend/.env:** -``` -FLASK_ENV=development -MONGODB_URI=mongodb://localhost:27017/openlearnx -WEB3_PROVIDER_URL=http://127.0.0.1:8545 -``` - -**frontend/.env.local:** -``` -NEXT_PUBLIC_API_URL=http://localhost:5000/api -``` - ---- - -# REFERENCES - -[1] Bloom, B. S. (1984). "The 2 Sigma Problem: The Search for Methods of Group Instruction as Effective as One-to-One Tutoring." Educational Researcher, 13(6), 4-16. - -[2] Birnbaum, A. (1968). "Some Latent Trait Models and Their Use in Inferring an Examinee's Ability." Statistical Theories of Mental Test Scores. Addison-Wesley. - -[3] Buterin, V. (2013). "Ethereum: A Next-Generation Smart Contract and Decentralized Application Platform." Whitepaper. - -[4] Piech, C., et al. (2015). "Deep Knowledge Tracing." Advances in Neural Information Processing Systems. - -[5] Society for Human Resource Management (2018). "2018 Employees Benefits Survey." - -[6] Grech, A., & Camilleri, A. F. (2017). "Blockchain in Education." EUR 28778 EN. - -[7] Benet, J. (2014). "IPFS - Content Addressed, Versioned, P2P File System." arXiv:1407.3561. - -[8] Li, Z., et al. (2018). "Online Judge System Security Design and Implementation." - -[9] Anderson, J. R. (2005). "Cognitive Psychology and its Implications." Worth Publishers, 6th edition. - -[10] Nakamoto, S. (2008). "Bitcoin: A Peer-to-Peer Electronic Cash System." Whitepaper. - ---- - -**Document Status**: Final Project Report - -**Submission Date**: April 9, 2026 - -**Total Pages**: 48 diff --git a/nohup.out b/nohup.out deleted file mode 100644 index e69de29..0000000 diff --git a/paper.md b/paper.md deleted file mode 100644 index a482f71..0000000 --- a/paper.md +++ /dev/null @@ -1,1026 +0,0 @@ -# OpenLearnX: A Decentralized Adaptive Learning Platform with Blockchain-Based Certification for Verifiable Skill Assessment - -**Authors:** - - - -## Abstract - -The proliferation of online education has created unprecedented opportunities for accessible learning, yet fundamental challenges persist: static content delivery fails to accommodate diverse learner abilities, delayed feedback impedes learning momentum, and rampant credential fraud undermines trust in educational achievements. This paper presents OpenLearnX, a comprehensive decentralized learning and assessment platform that addresses these critical issues through the integration of three key technological innovations. First, we implement an adaptive learning engine based on Item Response Theory (IRT) using the three-parameter logistic model, enhanced with TensorFlow-based machine learning for multi-dimensional ability estimation across skill domains. Second, we develop a secure multi-language code execution environment utilizing Docker containerization with strict resource isolation, supporting eight programming languages with sub-3-second execution times. Third, we introduce an ERC-721 NFT-based certification system deployed on Ethereum, with certificate metadata permanently stored on IPFS for decentralized verification. Our experimental evaluation across 1,000 simulated quiz sessions demonstrates 0.94 correlation accuracy in ability estimation with convergence within 8.3 questions on average, compared to 25-30 questions for traditional fixed-form assessments. Load testing confirms the platform handles 500 concurrent users with 95th percentile API response times under 127ms. Security analysis including penetration testing, smart contract auditing using Slither and Mythril, and sandbox escape testing reveals no critical vulnerabilities. OpenLearnX represents a significant advancement in educational technology, providing a scalable, secure, and verifiable platform for personalized learning that ensures educational achievements remain permanent and tamper-proof regardless of institutional longevity. - -**Keywords:** adaptive learning, blockchain certification, decentralized education, NFT credentials, Item Response Theory, smart contracts, IPFS, TensorFlow, ERC-721, personalized assessment - ---- - -## I. Introduction - -### A. Background and Motivation - -The landscape of education has undergone a dramatic transformation in the digital age. Online learning platforms have democratized access to educational resources, enabling millions of learners worldwide to acquire new skills regardless of geographical or socioeconomic constraints. The global e-learning market, valued at approximately $250 billion in 2020, is projected to exceed $1 trillion by 2028 [1]. However, this rapid growth has exposed fundamental limitations in how online education delivers content, assesses learners, and verifies achievements. - -Traditional learning management systems (LMS) operate on a one-size-fits-all model, presenting identical content sequences to all learners regardless of their prior knowledge, learning pace, or cognitive abilities. This approach fails to accommodate the natural variation in learner populations, leading to frustration for advanced students who find content too easy and discouragement for those who struggle with material presented at an inappropriate difficulty level. Research in educational psychology consistently demonstrates that learning outcomes improve significantly when instruction is tailored to individual learner characteristics [2]. - -Furthermore, the feedback loop in conventional online education is often measured in days or weeks. Students submit assignments, await instructor review, and eventually receive grades with varying degrees of constructive feedback. This delay disrupts the immediate reinforcement that cognitive science identifies as crucial for effective learning [3]. When learners cannot immediately identify and correct misconceptions, those errors become ingrained, requiring substantially more effort to remediate later. - -Perhaps most critically, the credentialing ecosystem supporting online education remains fundamentally broken. Digital certificates and badges can be trivially forged using basic image editing software. Paper credentials can be fabricated or purchased from diploma mills. According to the Society for Human Resource Management, nearly 85% of employers have caught applicants lying on their resumes, with fraudulent credentials representing a significant portion of these deceptions [4]. This credential fraud costs organizations billions annually in hiring mistakes and undermines the legitimate achievements of honest learners. - -### B. Problem Statement - -The core problems addressed by this research can be formalized as follows: - -1. **The Personalization Problem**: Given a heterogeneous population of learners with varying abilities θ ∈ ℝ, how can we efficiently estimate each learner's ability and dynamically select assessment items of appropriate difficulty to maximize learning outcomes? - -2. **The Feedback Latency Problem**: In skill domains requiring practical demonstration (such as programming), how can we provide immediate, accurate feedback on learner submissions while maintaining security against malicious code execution? - -3. **The Credential Verification Problem**: How can we issue educational credentials that are permanently verifiable by any third party, resistant to forgery, and independent of the issuing institution's continued operation? - -### C. Proposed Solution: OpenLearnX - -We present OpenLearnX, a cutting-edge decentralized learning and assessment platform that revolutionizes education through the integration of adaptive testing, instant feedback, and blockchain-based certification. The platform provides learners with a smarter, personalized, and verifiable way to build and prove skills—from code challenges to real-world learning paths, all backed by blockchain technology. - -OpenLearnX addresses the identified problems through three synergistic innovations: - -**Adaptive Learning Engine**: We implement a sophisticated adaptive testing system based on Item Response Theory (IRT), specifically the three-parameter logistic (3PL) model. Our implementation extends traditional IRT with TensorFlow-based machine learning to enable multi-dimensional ability estimation across distinct skill domains. The algorithm dynamically adjusts question difficulty based on learner responses, converging to accurate ability estimates in fewer than 10 questions compared to 25-30 for fixed-form assessments. - -**Secure Code Execution Environment**: For programming-focused assessments, we develop a sandboxed code execution service supporting Python, JavaScript, Java, C++, C, Go, Rust, Ruby, and PHP. Each submission executes in an ephemeral Docker container with strict resource limits (10-second CPU timeout, 256MB memory, network isolation), providing immediate compilation and execution results while preventing malicious code from affecting the host system. - -**Blockchain Certification System**: We implement an ERC-721 compliant smart contract on Ethereum for issuing non-fungible token (NFT) certificates. Certificate metadata is stored on the InterPlanetary File System (IPFS), creating a permanent, decentralized record. Any third party can verify certificate authenticity by querying the blockchain, eliminating reliance on the issuing institution for verification. - -### D. Contributions - -The main contributions of this paper include: - -1. A novel adaptive learning algorithm combining Item Response Theory with TensorFlow-based machine learning for multi-dimensional ability estimation across skill domains -2. A secure multi-language code execution environment using Docker containerization with comprehensive resource isolation and security controls -3. An ERC-721 NFT-based certification system with IPFS metadata storage enabling permanent, decentralized credential verification -4. A comprehensive peer review system with AI-powered bias detection for collaborative learning assessment -5. A skill competency mapping system that tracks learner progress across multiple dimensions with radar chart visualization -6. A wallet-based authentication system eliminating password vulnerabilities through cryptographic signature verification -7. An open-source reference implementation demonstrating practical integration of these technologies - -### E. Paper Organization - -The remainder of this paper is organized as follows. Section II reviews related work in adaptive learning, blockchain applications in education, and decentralized storage systems. Section III presents the overall system architecture and design principles. Section IV details the implementation of each major component. Section V describes our evaluation methodology and presents experimental results. Section VI discusses the implications and limitations of our approach. Section VII outlines future work directions, and Section VIII concludes the paper. - ---- - -## II. Related Work - -### A. Adaptive Learning Systems - -The concept of adapting instruction to individual learner characteristics dates to the earliest computerized educational systems. Intelligent Tutoring Systems (ITS) emerged in the 1970s, attempting to model student knowledge and adjust instruction accordingly [5]. Systems like LISP Tutor and later ALEKS demonstrated that computer-based adaptive instruction could achieve learning gains comparable to human tutoring. - -Item Response Theory (IRT) provides the mathematical foundation for modern adaptive testing. Developed by psychometricians including Lord, Rasch, and Birnbaum [6], IRT models the probability of a correct response as a function of learner ability and item characteristics. The three-parameter logistic (3PL) model, which we employ in OpenLearnX, accounts for item difficulty, discrimination, and guessing probability: - -$$P(X_{ij} = 1 | \theta_j) = c_i + \frac{1 - c_i}{1 + e^{-a_i(\theta_j - b_i)}}$$ - -Where: -- $\theta_j$ represents the ability of learner $j$ -- $b_i$ is the difficulty of item $i$ -- $a_i$ is the discrimination parameter of item $i$ -- $c_i$ is the pseudo-guessing parameter of item $i$ - -Commercial platforms including Knewton, ALEKS (acquired by McGraw-Hill), and DreamBox Learning have deployed adaptive learning at scale. However, these systems remain proprietary and centralized, raising concerns about data ownership, algorithmic transparency, and vendor lock-in. - -Recent research has explored machine learning approaches beyond traditional IRT. Deep learning models for knowledge tracing [7] can capture complex temporal dependencies in learning sequences. Reinforcement learning has been applied to optimize learning path recommendations [8]. Zhang et al. [9] demonstrated that neural network-based approaches can outperform classical IRT for ability estimation in certain domains. - -OpenLearnX builds upon this foundation by combining classical IRT with TensorFlow-based machine learning, enabling multi-dimensional ability tracking while maintaining the interpretability and theoretical grounding of psychometric models. - -### B. Blockchain Applications in Education - -Blockchain technology, introduced through Bitcoin by Nakamoto [10], provides a decentralized, immutable ledger suitable for recording transactions without trusted intermediaries. Buterin's Ethereum [11] extended this concept with Turing-complete smart contracts, enabling programmable applications on blockchain infrastructure. - -The application of blockchain to educational credentials began with the MIT Media Lab's digital diplomas project in 2017 [12]. Using the Blockcerts open standard, MIT issued blockchain-anchored digital diplomas that graduates could share and employers could verify without contacting the university. The project demonstrated both the technical feasibility and the organizational challenges of blockchain credentialing. - -Several platforms have emerged offering blockchain-based certification. Learning Machine (now Hyland Credentials) provides enterprise solutions for issuing verifiable credentials. Blockcerts offers an open-source standard for blockchain certificates. The European Blockchain Services Infrastructure (EBSI) is developing a framework for cross-border credential recognition within the European Union. - -Grech and Camilleri [13] provide a comprehensive analysis of blockchain applications in education, identifying credentialing, lifelong learning records, and intellectual property management as primary use cases. They note that while technical solutions exist, adoption barriers include institutional inertia, regulatory uncertainty, and the challenge of managing cryptographic keys. - -Existing blockchain education platforms primarily focus on credential issuance and verification, treating blockchain as an add-on to traditional learning management systems. OpenLearnX differentiates itself by integrating blockchain throughout the learning journey—from wallet-based authentication to progress tracking to certificate issuance—creating a cohesive decentralized learning experience. - -### C. Decentralized Storage Systems - -Traditional web architecture relies on location-based addressing, where content is identified by server location (URL) rather than content itself. This creates single points of failure, enables censorship, and results in link rot as servers go offline. - -The InterPlanetary File System (IPFS), developed by Protocol Labs [14], addresses these limitations through content-addressed storage. Each piece of content is identified by its cryptographic hash, enabling verification that retrieved content has not been altered. IPFS operates as a peer-to-peer network, where content can be retrieved from any node hosting it, providing redundancy and resilience. - -For educational applications, IPFS offers several advantages. Course materials and credentials stored on IPFS remain accessible even if the original hosting institution ceases operation. Content integrity is cryptographically verifiable. Geographic distribution improves access speeds for global learner populations. - -Filecoin, built on IPFS, provides economic incentives for long-term storage through a decentralized marketplace where storage providers are compensated for hosting data. This addresses the concern that IPFS content may become unavailable if no nodes choose to host it. - -In OpenLearnX, we store certificate metadata on IPFS and record the IPFS hash in the blockchain smart contract. This hybrid approach combines blockchain's permanence and verifiability with IPFS's ability to store arbitrary content, creating a robust system where certificates remain verifiable indefinitely. - -### D. Secure Code Execution - -Online judges for programming competitions and coding education face the challenge of executing untrusted user code safely. Malicious submissions might attempt to access sensitive files, consume excessive resources, or attack other systems through the network. - -Containerization using Docker provides process-level isolation with modest performance overhead. Containers share the host kernel but operate in separate namespaces for processes, network, and filesystem. Resource limits can constrain CPU time, memory, and disk usage. - -Platforms like HackerRank, LeetCode, and Codeforces implement secure code execution at scale. Research by Li et al. [15] analyzes the security architecture of online judges, identifying common vulnerabilities including insufficient resource limits, network isolation failures, and timing side channels. - -OpenLearnX implements defense in depth for code execution: Docker containers with dropped capabilities, user namespace isolation, read-only filesystems, network isolation, CPU and memory limits, and timeout enforcement. Each submission executes in an ephemeral container destroyed after execution, preventing persistence of any exploitation. - ---- - -## III. System Architecture - -### A. Design Principles - -The OpenLearnX architecture follows several key design principles: - -1. **Decentralization**: Minimize reliance on centralized infrastructure where practical, enabling the platform to operate without single points of failure -2. **Security by Design**: Implement defense in depth, assuming that any single security control may fail -3. **Scalability**: Design for horizontal scaling to accommodate growing user populations -4. **Interoperability**: Adhere to open standards (ERC-721, JWT, REST) to enable integration with other systems -5. **User Sovereignty**: Give learners control over their identity, data, and credentials - -### B. System Overview - -OpenLearnX employs a modern microservices architecture with clear separation of concerns. The system comprises four main layers: - -``` -┌─────────────────────────────────────────────────────────────────────┐ -│ USER INTERFACE LAYER │ -│ Next.js 14 + React + TypeScript + TailwindCSS │ -│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ -│ │Dashboard │ │Quiz UI │ │Code │ │Wallet │ │ -│ │Analytics │ │Adaptive │ │Editor │ │Connect │ │ -│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ -└────────────────────────────┬────────────────────────────────────────┘ - │ HTTPS / WebSocket -┌────────────────────────────▼────────────────────────────────────────┐ -│ BACKEND API LAYER │ -│ Flask (Python) │ -│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ -│ │ Auth Service │ │ Quiz Service │ │ Cert Service │ │ -│ │ • Nonce Gen │ │ • CRUD Ops │ │ • NFT Mint │ │ -│ │ • Sig Verify │ │ • Grading │ │ • IPFS Upload│ │ -│ │ • JWT Issue │ │ • Attempts │ │ • Verify │ │ -│ └──────────────┘ └──────────────┘ └──────────────┘ │ -│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ -│ │Compiler Svc │ │Dashboard Svc │ │ Adaptive AI │ │ -│ │ • Docker Run │ │ • Analytics │ │ • IRT Calc │ │ -│ │ • Sandboxing │ │ • Progress │ │ • TensorFlow │ │ -│ │ • Multi-lang │ │ • Competency │ │ • Question │ │ -│ └──────────────┘ └──────────────┘ │ Selection │ │ -│ └──────────────┘ │ -└────────────────────────────┬────────────────────────────────────────┘ - │ - ┌─────────────────────┼─────────────────────┐ - │ │ │ -┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ -│ MongoDB │ │ Redis │ │ Docker │ -│ Database │ │ Cache │ │ Runtime │ -│ • Users │ │ • Sessions │ │ • Sandboxed │ -│ • Courses │ │ • Rate Limit│ │ Code Exec │ -│ • Quizzes │ │ • Temp Data │ │ │ -│ • Certs │ │ │ │ │ -└─────────────┘ └─────────────┘ └─────────────┘ - │ -┌──────▼───────────────────────────────────────────────────────────────┐ -│ BLOCKCHAIN LAYER (Ethereum) │ -│ ┌────────────────────────────────────────────────────────────────┐ │ -│ │ CertificateNFT Smart Contract (Solidity) │ │ -│ │ │ │ -│ │ • ERC-721 Compliant • mintCertificate() │ │ -│ │ • OpenZeppelin Base • mintCertificateWithDetails() │ │ -│ │ • Certificate Struct • getCertificate() │ │ -│ │ • User Mappings • verifyCertificate() │ │ -│ │ • Event Emissions • getUserCertificates() │ │ -│ └────────────────────────────────────────────────────────────────┘ │ -│ │ -│ Deployment: Local (Anvil) / Production (Ethereum Mainnet / L2) │ -└───────────────────────────────────┬───────────────────────────────────┘ - │ -┌───────────────────────────────────▼───────────────────────────────────┐ -│ DECENTRALIZED STORAGE LAYER (IPFS) │ -│ │ -│ Certificate Metadata Storage: │ -│ • Student information • Course/subject details │ -│ • Achievement scores • Issue timestamps │ -│ • Certificate images • Verification data │ -│ │ -│ Properties: Content-addressed, Immutable, Distributed, Permanent │ -└────────────────────────────────────────────────────────────────────────┘ -``` - -### C. User Interface Layer - -The frontend is built using Next.js 14 with TypeScript, leveraging React 18's concurrent features for optimal rendering performance. TailwindCSS provides utility-first styling, while shadcn/ui and Radix UI supply accessible, customizable component primitives. - -The user interface supports three primary user roles with distinct experiences: - -**Students**: Access personalized dashboards showing progress across courses, competency radar charts visualizing skill distribution, certificate galleries with blockchain verification, and learning history timelines. - -**Instructors**: Manage courses and assessments, monitor class performance analytics, track individual student progress, author quizzes with automatic and manual grading, and receive alerts from the bias detection system. - -**Employers/Verifiers**: Instantly verify candidate credentials on the blockchain, view detailed skill assessments, access transparent learning histories, and confirm certificate authenticity. - -Key frontend components include: - -- **WalletConnect**: MetaMask SDK integration for Ethereum wallet connection -- **QuestionCard**: Adaptive quiz question display with real-time difficulty indicators -- **CodeEditor**: Monaco-based editor with syntax highlighting for eight programming languages -- **ProgressChart**: Chart.js and Recharts visualizations for performance analytics -- **CertificateCard**: NFT certificate display with QR codes for verification - -### D. Backend API Layer - -The backend is implemented in Flask 2.3.3 with Python, providing RESTful APIs and WebSocket connections for real-time updates. The architecture follows a service-oriented design where each major feature is encapsulated in a separate service module. - -**Authentication Service** (`routes/auth.py`): Implements wallet-based authentication using cryptographic signatures. Generates time-limited nonces to prevent replay attacks, verifies ECDSA signatures using eth-account, and issues JWT tokens for session management. - -**Quiz Service** (`routes/quizzes.py`): Manages the full lifecycle of assessments including creation, retrieval, updating, and deletion. Supports multiple question types (multiple-choice, coding, essay), implements auto-grading for objective questions, and tracks quiz attempts with detailed analytics. - -**Adaptive Quiz Service** (`routes/adaptive_quiz.py`, `services/adaptive_quiz_service.py`): Implements the IRT-based adaptive algorithm. Manages quiz sessions with real-time difficulty adjustment, estimates learner ability using Bayesian updating, and selects optimal questions using maximum information criteria. - -**Certificate Service** (`routes/certificate.py`): Orchestrates the NFT minting process including eligibility verification, metadata generation, IPFS upload, smart contract interaction, and transaction confirmation. - -**Compiler Service** (`routes/compiler.py`, `services/compiler_service.py`): Executes user-submitted code in Docker containers. Implements security controls including resource limits, network isolation, and timeout enforcement. Returns compilation and execution results. - -**Dashboard Service** (`routes/dashboard.py`, `services/dashboard_service.py`): Aggregates analytics from across the platform including progress percentages, competency distributions, performance time series, and recommendation engine outputs. - -**AI Quiz Service** (`services/ai_quiz_service.py`): Leverages TensorFlow models for intelligent question generation. Creates contextual questions based on topic, validates question quality, and generates plausible distractors for multiple-choice items. - -### E. Blockchain Layer - -The blockchain layer consists of Solidity smart contracts deployed on Ethereum. The primary contract, CertificateNFT, implements the ERC-721 standard using OpenZeppelin's audited base contracts for security. - -```solidity -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.19; - -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/utils/Counters.sol"; - -contract CertificateNFT is ERC721, ERC721URIStorage, Ownable { - using Counters for Counters.Counter; - Counters.Counter private _tokenIds; - - struct Certificate { - string subject; - string studentName; - uint256 score; - uint256 timestamp; - bool verified; - } - - mapping(uint256 => Certificate) public certificates; - mapping(address => uint256[]) public userCertificates; - - event CertificateMinted( - uint256 indexed tokenId, - address indexed student, - string subject, - uint256 score, - string tokenURI - ); - - constructor() ERC721("OpenLearnX Certificate", "OLXC") {} - - function mintCertificate( - address to, - string memory _tokenURI - ) public onlyOwner returns (uint256); - - function mintCertificateWithDetails( - address to, - string memory _tokenURI, - string memory subject, - string memory studentName, - uint256 score - ) public onlyOwner returns (uint256); - - function getCertificate(uint256 tokenId) - public view returns (Certificate memory); - - function getUserCertificates(address user) - public view returns (uint256[] memory); - - function verifyCertificate(uint256 tokenId) - public view returns (bool); -} -``` - -The contract stores certificate details on-chain including subject, student name, score, timestamp, and verification status. The `tokenURI` field links to IPFS-hosted metadata containing additional details and the certificate image. - -Development uses the Foundry toolkit including forge for testing and building, anvil for local Ethereum node simulation, and cast for CLI contract interaction. Production deployment targets Ethereum mainnet or Layer 2 solutions (Polygon, Arbitrum) for reduced gas costs. - -### F. Decentralized Storage Layer - -Certificate metadata is stored on IPFS using a JSON structure compatible with NFT marketplace standards: - -```json -{ - "name": "OpenLearnX Certificate - Python Programming", - "description": "Certificate of Achievement for completing Advanced Python Programming with distinction", - "image": "ipfs://QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/certificate.png", - "external_url": "https://openlearnx.io/verify/12345", - "attributes": [ - { - "trait_type": "Subject", - "value": "Python Programming" - }, - { - "trait_type": "Level", - "value": "Advanced" - }, - { - "trait_type": "Score", - "display_type": "number", - "value": 95 - }, - { - "trait_type": "Competency", - "value": "Expert" - }, - { - "trait_type": "Issue Date", - "display_type": "date", - "value": 1704067200 - }, - { - "trait_type": "Institution", - "value": "OpenLearnX Platform" - }, - { - "trait_type": "Skills Demonstrated", - "value": "Object-Oriented Programming, Data Structures, Algorithms" - } - ] -} -``` - -The IPFS content identifier (CID) is stored in the smart contract's tokenURI field. This design ensures that even if OpenLearnX ceases operation, certificates remain verifiable through any IPFS gateway and the Ethereum blockchain. - ---- - -## IV. Implementation - -### A. Adaptive Learning Algorithm - -#### A.1 Item Response Theory Foundation - -Our adaptive learning system implements a sophisticated version of Item Response Theory using the three-parameter logistic (3PL) model. The probability that learner $j$ with ability $\theta_j$ correctly answers item $i$ is: - -$$P(\theta_j) = c_i + \frac{1 - c_i}{1 + e^{-a_i(\theta_j - b_i)}}$$ - -Where: -- $\theta_j$ ∈ ℝ represents learner ability (typically normalized to mean 0, standard deviation 1) -- $b_i$ is the difficulty parameter indicating the ability level at which the probability of correct response is midway between chance and certainty -- $a_i$ is the discrimination parameter indicating how sharply the item differentiates between learners of different abilities -- $c_i$ is the pseudo-guessing parameter representing the probability of a correct response by a learner with infinitely low ability - -#### A.2 Ability Estimation - -We estimate learner ability using maximum likelihood estimation (MLE) with Bayesian priors. Given a response pattern $\mathbf{u} = (u_1, u_2, ..., u_n)$ where $u_i \in \{0, 1\}$ indicates incorrect or correct response to item $i$, the likelihood function is: - -$$L(\theta | \mathbf{u}) = \prod_{i=1}^{n} P_i(\theta)^{u_i} Q_i(\theta)^{1-u_i}$$ - -Where $Q_i(\theta) = 1 - P_i(\theta)$. - -We incorporate a Bayesian prior $\pi(\theta)$ assuming $\theta \sim N(0, 1)$, yielding the posterior: - -$$\pi(\theta | \mathbf{u}) \propto L(\theta | \mathbf{u}) \cdot \pi(\theta)$$ - -The ability estimate $\hat{\theta}$ is the mode of this posterior, found using Newton-Raphson iteration. - -#### A.3 Adaptive Question Selection - -Question selection follows the maximum information criterion. Fisher information for item $i$ at ability level $\theta$ is: - -$$I_i(\theta) = \frac{[P'_i(\theta)]^2}{P_i(\theta) Q_i(\theta)}$$ - -For the 3PL model: - -$$I_i(\theta) = a_i^2 \frac{(P_i(\theta) - c_i)^2}{(1 - c_i)^2} \cdot \frac{Q_i(\theta)}{P_i(\theta)}$$ - -At each step, we select the item not yet administered that maximizes information at the current ability estimate: - -$$i^* = \arg\max_{i \in \text{remaining}} I_i(\hat{\theta})$$ - -This ensures that each question provides maximum information for refining the ability estimate. - -#### A.4 Difficulty Adjustment Rules - -Our implementation uses a simplified difficulty adjustment scheme suitable for real-time interaction: - -```python -def _adjust_difficulty(self, session_data, is_correct): - """ - Difficulty adjustment rules: - - 3 consecutive correct: Easy→Medium→Hard - - 1 incorrect: Hard→Medium→Easy (stay on Easy if already there) - """ - current_difficulty = session_data['current_difficulty'] - consecutive = session_data['consecutive_correct'] - - if is_correct: - if consecutive[current_difficulty] >= 3: - if current_difficulty == 'easy': - session_data['consecutive_correct']['easy'] = 0 - return 'medium' - elif current_difficulty == 'medium': - session_data['consecutive_correct']['medium'] = 0 - return 'hard' - else: - if current_difficulty == 'hard': - return 'medium' - elif current_difficulty == 'medium': - return 'easy' - - return current_difficulty -``` - -#### A.5 TensorFlow Integration - -Our TensorFlow implementation extends traditional IRT with three innovations: - -**Multi-dimensional ability estimation**: Rather than a single scalar $\theta$, we maintain a vector $\boldsymbol{\theta} = (\theta_1, \theta_2, ..., \theta_k)$ representing ability across $k$ skill dimensions (e.g., algorithms, data structures, language syntax). A neural network maps learner response patterns to this multi-dimensional ability space. - -**Temporal modeling**: We incorporate recency weighting, recognizing that recent performance is more indicative of current ability than historical performance. A time-decay factor $\lambda^{(t - t_i)}$ weights older responses less heavily in the likelihood calculation. - -**Content-area weighting**: To ensure balanced coverage across topics, we modify the item selection criterion to penalize repeated selection from the same content area: - -$$i^* = \arg\max_{i} \left[ I_i(\hat{\theta}) - \alpha \cdot \text{coverage\_penalty}(i) \right]$$ - -### B. Secure Code Execution - -#### B.1 Architecture Overview - -The code compilation service supports eight programming languages with secure, sandboxed execution. Each language is configured with an appropriate Docker image, file extension, and execution command: - -```python -class CompilerService: - def __init__(self): - self.client = docker.from_env() - self.language_configs = { - 'python': { - 'image': 'python:3.9-alpine', - 'file_ext': '.py', - 'run_command': 'python /app/solution{ext}', - 'timeout': 10 - }, - 'java': { - 'image': 'openjdk:11-alpine', - 'file_ext': '.java', - 'run_command': 'cd /app && javac Solution.java && java Solution', - 'timeout': 15 - }, - 'c': { - 'image': 'gcc:9-alpine', - 'file_ext': '.c', - 'run_command': 'cd /app && gcc -o solution solution.c && ./solution', - 'timeout': 15 - }, - 'cpp': { - 'image': 'gcc:9-alpine', - 'file_ext': '.cpp', - 'run_command': 'cd /app && g++ -o solution solution.cpp && ./solution', - 'timeout': 15 - }, - 'javascript': { - 'image': 'node:16-alpine', - 'file_ext': '.js', - 'run_command': 'node /app/solution.js', - 'timeout': 10 - }, - 'go': { - 'image': 'golang:1.19-alpine', - 'file_ext': '.go', - 'run_command': 'cd /app && go run solution.go', - 'timeout': 15 - }, - 'rust': { - 'image': 'rust:1.65-alpine', - 'file_ext': '.rs', - 'run_command': 'cd /app && rustc solution.rs && ./solution', - 'timeout': 20 - }, - 'ruby': { - 'image': 'ruby:3.1-alpine', - 'file_ext': '.rb', - 'run_command': 'ruby /app/solution.rb', - 'timeout': 10 - } - } -``` - -#### B.2 Execution Flow - -The execution process follows these steps: - -1. **Receive Submission**: Accept code string and language specification from the API -2. **Validate Input**: Check language is supported, code size is within limits -3. **Create Container**: Spawn ephemeral Docker container with appropriate runtime image -4. **Mount Code**: Write submitted code to a temporary file mounted in the container -5. **Execute**: Run the compilation/execution command with timeout enforcement -6. **Capture Output**: Collect stdout, stderr, and exit code -7. **Cleanup**: Destroy the container, removing all traces of execution -8. **Return Results**: Send sanitized output back to the client - -#### B.3 Security Controls - -We implement defense in depth with multiple security layers: - -**Process Isolation**: Each submission runs in a separate Docker container with its own process namespace. Processes cannot see or interact with other containers or the host system. - -**Resource Limits**: Containers are constrained to: -- CPU: 10-second maximum execution time -- Memory: 256MB maximum -- Disk: Minimal writable storage -- PIDs: Limited number of processes to prevent fork bombs - -**Network Isolation**: Containers have no network access, preventing: -- Exfiltration of data -- Attacks against external systems -- Downloading additional malicious code - -**User Namespace Isolation**: Code runs as an unprivileged user within the container, limiting damage from any container escape. - -**Read-only Filesystem**: Container filesystems are mounted read-only except for the specific directory containing the code file. - -**Capability Dropping**: Containers run with dropped Linux capabilities, removing privileged operations like raw socket access. - -### C. Authentication System - -#### C.1 Wallet-Based Authentication - -OpenLearnX implements passwordless authentication using Ethereum wallet signatures. This approach provides several security advantages: - -- **No password storage**: The system never stores user passwords, eliminating the risk of credential database breaches -- **Cryptographic strength**: Authentication relies on ECDSA signatures with 256-bit keys -- **Self-sovereign identity**: Users control their identity through their wallet - -#### C.2 Authentication Flow - -The authentication process consists of five steps: - -**Step 1 - Connection**: User clicks "Connect Wallet" in the frontend. MetaMask prompts for connection approval. - -**Step 2 - Nonce Request**: Frontend sends the wallet address to `POST /api/auth/nonce`. Backend generates a random nonce, stores it with a timestamp, and returns it. - -```json -{ - "wallet_address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "nonce": "Sign this message to authenticate with OpenLearnX: 7f3b2a1c", - "expires": 1704067200 -} -``` - -**Step 3 - Signing**: Frontend prompts the user to sign the nonce message using MetaMask. The signature is generated using the wallet's private key. - -**Step 4 - Verification**: Frontend sends the signature to `POST /api/auth/verify`. Backend: -- Retrieves the stored nonce for the wallet address -- Checks the nonce has not expired -- Recovers the signing address from the signature using `eth_account.Account.recover_message()` -- Verifies the recovered address matches the claimed wallet address -- Invalidates the used nonce - -**Step 5 - Token Issuance**: If verification succeeds, the backend issues a JWT token: - -```json -{ - "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", - "token_type": "Bearer", - "expires_in": 3600, - "wallet_address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" -} -``` - -#### C.3 Security Properties - -**Replay Protection**: Each nonce is single-use and time-limited. Captured authentication messages cannot be reused. - -**Phishing Resistance**: Users sign a human-readable message identifying the platform. This makes phishing attacks more visible. - -**Session Management**: JWT tokens include expiration claims. Refresh tokens (if implemented) enable seamless session continuation without repeated signing. - -### D. NFT Certificate Minting - -#### D.1 Eligibility Verification - -Before minting a certificate, the backend verifies: - -1. The user has completed the required course or quiz -2. The achieved score meets the minimum passing threshold -3. No certificate has already been minted for this achievement -4. The user's wallet address is valid - -#### D.2 Metadata Generation - -Certificate metadata is formatted according to ERC-721 metadata standards with extensions for educational credentials: - -```python -def generate_certificate_metadata(user, course, score, completion_date): - return { - "name": f"OpenLearnX Certificate - {course.title}", - "description": f"Certificate of Achievement awarded to {user.name} " - f"for completing {course.title} with a score of {score}%", - "image": generate_certificate_image(user, course, score), - "external_url": f"https://openlearnx.io/verify/{token_id}", - "attributes": [ - {"trait_type": "Subject", "value": course.title}, - {"trait_type": "Level", "value": course.difficulty}, - {"trait_type": "Score", "display_type": "number", "value": score}, - {"trait_type": "Issue Date", "display_type": "date", - "value": int(completion_date.timestamp())}, - {"trait_type": "Institution", "value": "OpenLearnX Platform"}, - {"trait_type": "Skills", "value": ", ".join(course.skills)} - ] - } -``` - -#### D.3 IPFS Upload - -The metadata JSON is uploaded to IPFS using a pinning service to ensure permanence: - -```python -def upload_to_ipfs(metadata): - # Convert metadata to JSON bytes - metadata_bytes = json.dumps(metadata).encode('utf-8') - - # Upload to IPFS - result = ipfs_client.add_bytes(metadata_bytes) - - # Pin the content for permanence - ipfs_client.pin(result['Hash']) - - return f"ipfs://{result['Hash']}" -``` - -#### D.4 Smart Contract Interaction - -The backend interacts with the CertificateNFT contract using Web3.py: - -```python -def mint_certificate(user_wallet, token_uri, subject, student_name, score): - # Build transaction - tx = contract.functions.mintCertificateWithDetails( - user_wallet, - token_uri, - subject, - student_name, - score - ).build_transaction({ - 'from': platform_wallet, - 'gas': 200000, - 'nonce': w3.eth.get_transaction_count(platform_wallet) - }) - - # Sign and send transaction - signed_tx = w3.eth.account.sign_transaction(tx, platform_private_key) - tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction) - - # Wait for confirmation - receipt = w3.eth.wait_for_transaction_receipt(tx_hash) - - # Extract token ID from event logs - token_id = extract_token_id_from_logs(receipt) - - return token_id, tx_hash.hex() -``` - -#### D.5 Verification Process - -Any third party can verify a certificate by: - -1. Querying the smart contract with the token ID -2. Retrieving the certificate details stored on-chain -3. Fetching the metadata from IPFS using the tokenURI -4. Verifying the metadata matches the on-chain details -5. Confirming the certificate was issued by the legitimate platform contract - ---- - -## V. Evaluation - -### A. Experimental Setup - -#### A.1 Environment - -Experiments were conducted on the following infrastructure: - -- **Backend Server**: 8-core CPU, 32GB RAM, Ubuntu 22.04 LTS -- **Database**: MongoDB 6.0 with 16GB allocated memory -- **Blockchain**: Local Anvil node forking Ethereum mainnet -- **Testing Tools**: Apache JMeter 5.5, custom Python scripts - -#### A.2 Datasets - -**Adaptive Algorithm Evaluation**: 1,000 simulated quiz sessions with synthetic learner abilities drawn from N(0, 1). Question bank of 500 items with calibrated IRT parameters (a ∈ [0.5, 2.5], b ∈ [-3, 3], c = 0.2). - -**Performance Testing**: Load tests with 50-500 concurrent virtual users following realistic usage patterns (login, browse courses, take quiz, view results, request certificate). - -**Security Testing**: Penetration testing using OWASP ZAP and manual testing. Smart contract analysis using Slither and Mythril. Sandbox escape attempts using known container escape techniques. - -### B. Adaptive Algorithm Performance - -#### B.1 Ability Estimation Accuracy - -We evaluated the accuracy of ability estimation by comparing estimated abilities ($\hat{\theta}$) to true simulated abilities ($\theta$). Across 1,000 sessions: - -| Metric | Value | -|--------|-------| -| Pearson Correlation (r) | 0.94 | -| Root Mean Square Error (RMSE) | 0.38 | -| Mean Absolute Error (MAE) | 0.29 | -| Bias (Mean Error) | 0.02 | - -The high correlation indicates that our adaptive algorithm accurately recovers learner ability levels. - -#### B.2 Convergence Speed - -We measured the number of questions required for ability estimates to stabilize (defined as subsequent updates < 0.1 in magnitude): - -| Statistic | Questions to Convergence | -|-----------|-------------------------| -| Mean | 8.3 | -| Median | 7 | -| Standard Deviation | 2.8 | -| 90th Percentile | 12 | - -Traditional fixed-form assessments typically require 25-30 items for comparable reliability. Our adaptive approach achieves equivalent measurement precision with approximately one-third the items. - -#### B.3 Score Prediction Accuracy - -We evaluated the algorithm's ability to predict final scores: - -| Metric | Value | -|--------|-------| -| RMSE | 4.2% | -| MAE | 3.1% | -| R² | 0.91 | - -The algorithm accurately predicts learner performance, enabling appropriate difficulty adjustment and accurate final score calculation. - -### C. System Performance - -#### C.1 API Response Times - -Load testing with Apache JMeter measured response times across key endpoints: - -| Endpoint | Median (ms) | p95 (ms) | p99 (ms) | -|----------|-------------|----------|----------| -| GET /api/courses | 45 | 89 | 142 | -| POST /api/auth/verify | 67 | 127 | 198 | -| GET /api/dashboard/student | 78 | 134 | 211 | -| POST /api/quizzes/:id/attempt | 52 | 89 | 156 | -| POST /api/adaptive-quiz/answer | 61 | 112 | 178 | -| POST /api/compiler/run | 1,240 | 2,300 | 3,100 | -| POST /api/certificates/mint | 12,400 | 15,600 | 18,200 | - -Most operations complete with sub-200ms latency at the 95th percentile. Code execution takes 1-3 seconds depending on language and complexity. NFT minting requires 12-18 seconds due to blockchain confirmation times. - -#### C.2 Scalability - -We tested the system with increasing concurrent users: - -| Concurrent Users | Throughput (req/s) | Error Rate (%) | p95 Latency (ms) | -|------------------|-------------------|----------------|------------------| -| 50 | 234 | 0.0 | 89 | -| 100 | 412 | 0.0 | 112 | -| 200 | 678 | 0.1 | 156 | -| 500 | 923 | 0.3 | 287 | - -The system scales gracefully to 500 concurrent users with minimal degradation. Error rates remain below 0.5% throughout. - -#### C.3 Database Performance - -MongoDB query performance under load: - -| Query Type | Avg Time (ms) | Queries/Second | -|------------|---------------|----------------| -| User Lookup | 2.3 | 4,200 | -| Quiz Retrieval | 5.8 | 1,700 | -| Progress Aggregation | 34.2 | 290 | -| Certificate History | 8.1 | 1,200 | - -Indexes on frequently queried fields (wallet_address, user_id, course_id) ensure consistent performance. - -### D. Security Analysis - -#### D.1 Penetration Testing - -Security testing using OWASP ZAP and manual penetration testing revealed: - -| Category | Findings | -|----------|----------| -| Critical | 0 | -| High | 0 | -| Medium | 2 | -| Low | 5 | -| Informational | 12 | - -Medium findings included missing rate limiting on some endpoints (subsequently addressed) and verbose error messages in development mode. - -#### D.2 Smart Contract Audit - -Analysis using Slither and Mythril: - -| Tool | High Risk | Medium Risk | Low Risk | -|------|-----------|-------------|----------| -| Slither | 0 | 1 | 4 | -| Mythril | 0 | 0 | 2 | - -The medium risk finding was a reentrancy concern that does not apply due to the contract's structure (no external calls after state changes). - -#### D.3 Sandbox Escape Testing - -We attempted container escapes using known techniques: - -| Technique | Result | -|-----------|--------| -| Kernel Exploit (DirtyCow) | Blocked (patched kernel) | -| Docker Socket Access | Blocked (socket not mounted) | -| Capability Abuse | Blocked (capabilities dropped) | -| Network Exfiltration | Blocked (network isolated) | -| Resource Exhaustion | Blocked (limits enforced) | -| Fork Bomb | Blocked (PID limits) | - -All escape attempts were unsuccessful. - -#### D.4 Authentication Security - -Testing of the wallet-based authentication system: - -| Attack | Result | -|--------|--------| -| Replay Attack | Blocked (single-use nonces) | -| Signature Forgery | Blocked (ECDSA security) | -| Nonce Prediction | Blocked (cryptographic randomness) | -| Session Hijacking | Blocked (JWT signature verification) | -| Brute Force | Blocked (rate limiting) | - ---- - -## VI. Discussion - -### A. Key Findings - -Our evaluation demonstrates that OpenLearnX successfully addresses the three problems identified in the introduction: - -**Personalization**: The adaptive algorithm accurately estimates learner ability (r = 0.94) and converges rapidly (8.3 questions average), enabling personalized assessments that efficiently target each learner's level. - -**Feedback Latency**: The code execution service provides immediate results (median 1.2 seconds), enabling learners to iterate quickly on programming challenges. The sandboxing approach successfully isolates untrusted code. - -**Credential Verification**: The NFT-based certification system creates permanent, verifiable credentials. Any third party can confirm certificate authenticity by querying the blockchain, eliminating reliance on the issuing institution. - -### B. Comparison with Existing Systems - -OpenLearnX offers several advantages over existing platforms: - -| Feature | OpenLearnX | Traditional LMS | Blockchain Cert. Platforms | -|---------|------------|-----------------|---------------------------| -| Adaptive Learning | ✓ IRT + ML | Limited/None | None | -| Instant Feedback | ✓ Real-time | Delayed | N/A | -| Code Execution | ✓ 8 Languages | Limited | None | -| Credential Verification | ✓ Blockchain | Manual | ✓ Blockchain | -| Decentralized Storage | ✓ IPFS | Centralized | Partial | -| Open Source | ✓ Yes | Varies | Varies | - -### C. Limitations - -Several limitations should be acknowledged: - -**Scalability of NFT Minting**: Ethereum mainnet transaction costs and confirmation times limit throughput for certificate minting. Layer 2 solutions (Polygon, Arbitrum) can address this but introduce additional complexity. - -**Cold Start Problem**: The adaptive algorithm requires a calibrated question bank with known IRT parameters. New questions must be piloted before use in adaptive assessments. - -**Wallet Usability**: Wallet-based authentication provides strong security but may present barriers for users unfamiliar with cryptocurrency wallets. - -**Content Creation**: The platform focuses on assessment and certification; course content creation tools are less developed than in mature LMS platforms. - -### D. Practical Implications - -For educational institutions, OpenLearnX provides a path to issue verifiable credentials that remain valid regardless of institutional longevity. This is particularly relevant for professional certifications, continuing education, and non-traditional learning providers. - -For employers, blockchain verification eliminates the need to contact issuing institutions, reducing hiring friction and credential fraud. The detailed skill mapping provides more nuanced information than traditional pass/fail credentials. - -For learners, self-sovereign credentials stored in personal wallets provide portability and permanence. The adaptive assessment approach provides more efficient measurement of skills. - ---- - -## VII. Future Work - -Several extensions are planned for future development: - -### A. Mobile Application - -Development of native iOS and Android applications using React Native will extend platform accessibility to mobile learners. Mobile-specific features will include offline quiz caching, push notifications for deadlines, and camera-based proctoring. - -### B. Live Proctoring - -Integration of computer vision-based proctoring for high-stakes assessments. The system will detect: -- Face presence and identity verification -- Multiple persons in frame -- Suspicious eye movements suggesting external reference -- Audio anomalies suggesting coaching - -### C. Course Marketplace - -A decentralized marketplace enabling course creators to publish content and receive cryptocurrency payments. Smart contracts will manage revenue sharing, refunds, and access control. - -### D. Cross-Chain Support - -Deployment of certificate contracts on multiple blockchains (Ethereum, Polygon, Arbitrum, potentially non-EVM chains) with bridges for cross-chain verification. - -### E. AI Question Generation - -Integration of large language models for automatic question generation. Given course content, the system will generate contextually appropriate questions, automatically estimate difficulty, and create plausible distractors. - -### F. Enhanced Peer Review - -Expansion of the peer review system with NLP-based bias detection, automated feedback quality scoring, and incentive mechanisms (tokens, reputation) for high-quality reviews. - -### G. Learning Analytics - -Advanced analytics using machine learning to predict: -- Learner dropout risk -- Optimal intervention timing -- Knowledge decay and refresh scheduling -- Career path recommendations - ---- - -## VIII. Conclusion - -This paper presented OpenLearnX, a comprehensive decentralized learning and assessment platform that addresses fundamental challenges in online education through the integration of adaptive learning, instant feedback, and blockchain-based certification. - -Our adaptive learning algorithm, combining Item Response Theory with TensorFlow-based machine learning, achieves 0.94 correlation in ability estimation while converging in 8.3 questions on average—approximately one-third the items required for traditional fixed-form assessments. This enables personalized assessments that efficiently target each learner's ability level. - -The secure code execution environment, implemented using Docker containerization with strict resource isolation, provides immediate feedback on programming submissions while successfully preventing all tested sandbox escape attempts. Support for eight programming languages enables practical skill assessment across the technology industry's most important languages. - -The blockchain certification system, using ERC-721 NFTs with IPFS-stored metadata, creates permanent, verifiable credentials that can be confirmed by any third party without contacting the issuing institution. This addresses the credential fraud problem while ensuring that educational achievements remain verifiable regardless of institutional longevity. - -OpenLearnX demonstrates that it is practical to combine these advanced technologies into a cohesive platform that serves learners, instructors, and employers. The platform addresses critical challenges in modern education: personalization at scale, instant feedback, and credential authenticity. - -As the education landscape continues to evolve toward digital-first approaches, platforms like OpenLearnX provide a blueprint for how emerging technologies can be combined to create more effective, trustworthy learning experiences. By open-sourcing our implementation, we hope to accelerate the adoption of these technologies and contribute to the democratization of verifiable education. - ---- - -## Acknowledgment - -We acknowledge the contributions of the open-source community whose tools made this platform possible. In particular, we thank the developers of Next.js (Vercel), Flask (Pallets Projects), OpenZeppelin (smart contract security), Foundry (blockchain development toolkit), TensorFlow (machine learning), MongoDB (database), and the IPFS/Protocol Labs team (decentralized storage). - -We also thank the beta testers and early adopters who provided valuable feedback during development, and the educational institutions and employers who participated in our usability studies. - ---- - -## References - -[1] Statista Research Department, "E-learning and Digital Education Market Size Worldwide from 2019 to 2026," Statista, 2023. [Online]. Available: https://www.statista.com/statistics/1130331/e-learning-market-size-segment-worldwide/ - -[2] B. S. Bloom, "The 2 Sigma Problem: The Search for Methods of Group Instruction as Effective as One-to-One Tutoring," Educational Researcher, vol. 13, no. 6, pp. 4-16, 1984. - -[3] R. A. Bjork and E. L. Bjork, "A New Theory of Disuse and an Old Theory of Stimulus Fluctuation," in From Learning Processes to Cognitive Processes: Essays in Honor of William K. Estes, A. Healy, S. Kosslyn, and R. Shiffrin, Eds. Hillsdale, NJ: Erlbaum, 1992, pp. 35-67. - -[4] Society for Human Resource Management, "More than Half of Workers Lie on Their Resumes," SHRM, 2017. [Online]. Available: https://www.shrm.org/resourcesandtools/hr-topics/talent-acquisition/pages/more-than-half-workers-lie-resumes.aspx - -[5] J. R. Anderson, C. F. Boyle, and B. J. Reiser, "Intelligent Tutoring Systems," Science, vol. 228, no. 4698, pp. 456-462, 1985. - -[6] F. M. Lord, Applications of Item Response Theory to Practical Testing Problems. Hillsdale, NJ: Lawrence Erlbaum Associates, 1980. - -[7] C. Piech et al., "Deep Knowledge Tracing," in Advances in Neural Information Processing Systems 28 (NIPS 2015), C. Cortes, N. D. Lawrence, D. D. Lee, M. Sugiyama, and R. Garnett, Eds. Curran Associates, Inc., 2015, pp. 505-513. - -[8] M. Chi, K. VanLehn, D. Litman, and P. Jordan, "An Evaluation of Pedagogical Tutorial Tactics for a Natural Language Tutoring System: A Reinforcement Learning Approach," International Journal of Artificial Intelligence in Education, vol. 21, no. 1, pp. 83-113, 2011. - -[9] J. Zhang, X. Shi, I. King, and D. Y. Yeung, "Dynamic Key-Value Memory Networks for Knowledge Tracing," in Proceedings of the 26th International Conference on World Wide Web (WWW '17), Perth, Australia, 2017, pp. 765-774. - -[10] S. Nakamoto, "Bitcoin: A Peer-to-Peer Electronic Cash System," 2008. [Online]. Available: https://bitcoin.org/bitcoin.pdf - -[11] V. Buterin, "A Next-Generation Smart Contract and Decentralized Application Platform," Ethereum White Paper, 2014. [Online]. Available: https://ethereum.org/en/whitepaper/ - -[12] MIT Media Lab, "Digital Diplomas," MIT Media Lab, 2017. [Online]. Available: https://www.media.mit.edu/projects/digital-diplomas/overview/ - -[13] A. Grech and A. F. Camilleri, "Blockchain in Education," JRC Science for Policy Report, European Commission, Luxembourg, 2017. - -[14] J. Benet, "IPFS - Content Addressed, Versioned, P2P File System," arXiv preprint arXiv:1407.3561, 2014. - -[15] L. Li, H. Yang, S. Li, and Y. Liu, "Security Analysis of Online Judge Systems: Threats and Countermeasures," in Proceedings of the 2019 ACM SIGSAC Conference on Computer and Communications Security (CCS '19), London, UK, 2019, pp. 2495-2497. - -[16] W. J. van der Linden and C. A. W. Glas, Eds., Elements of Adaptive Testing. New York, NY: Springer, 2010. - -[17] OpenZeppelin, "OpenZeppelin Contracts: A library for secure smart contract development," 2023. [Online]. Available: https://openzeppelin.com/contracts/ - -[18] A. M. Antonopoulos and G. Wood, Mastering Ethereum: Building Smart Contracts and DApps. Sebastopol, CA: O'Reilly Media, 2018. - -[19] M. Brown and V. Diaz, "Digital Credentials: Why, Where, and How," EDUCAUSE Learning Initiative Brief, 2011. - -[20] L. Zhong, L. Hu, and Y. Zheng, "Deep Learning for Computerized Adaptive Testing," in Proceedings of the 26th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining (KDD '20), Virtual Event, 2020, pp. 2719-2729. - -[21] D. Merkel, "Docker: Lightweight Linux Containers for Consistent Development and Deployment," Linux Journal, vol. 2014, no. 239, 2014. - -[22] Next.js Team, "Next.js: The React Framework for Production," Vercel, 2023. [Online]. Available: https://nextjs.org/ - -[23] TensorFlow Developers, "TensorFlow: An End-to-End Open Source Machine Learning Platform," 2023. [Online]. Available: https://www.tensorflow.org/ - -[24] Foundry Team, "Foundry: A Blazing Fast, Portable and Modular Toolkit for Ethereum Application Development," 2023. [Online]. Available: https://book.getfoundry.sh/ - -[25] L. Cronbach and P. Meehl, "Construct Validity in Psychological Tests," Psychological Bulletin, vol. 52, no. 4, pp. 281-302, 1955. - ---- - -*This paper follows IEEE conference format guidelines. Supplementary materials including source code, datasets, and additional evaluation results are available in the project repository: https://github.com/th30d4y/OpenLearnX* diff --git a/paper.tex b/paper.tex deleted file mode 100644 index 8266451..0000000 --- a/paper.tex +++ /dev/null @@ -1,626 +0,0 @@ -\documentclass[conference]{IEEEtran} -\IEEEoverridecommandlockouts -\usepackage{cite} -\usepackage{amsmath,amssymb,amsfonts} -\usepackage{algorithmic} -\usepackage{graphicx} -\usepackage{textcomp} -\usepackage{xcolor} -\usepackage{hyperref} -\usepackage{listings} -\usepackage{booktabs} - -\lstset{ - basicstyle=\ttfamily\footnotesize, - breaklines=true, - frame=single, - language=Python -} - -\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em - T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} - -\begin{document} - -\title{OpenLearnX: A Decentralized Adaptive Learning Platform with Blockchain-Based Certification for Verifiable Skill Assessment} - -\author{\IEEEauthorblockN{OpenLearnX Development Team} -\IEEEauthorblockA{\textit{Department of Computer Science} \\ -\textit{OpenLearnX Research Initiative}\\ -https://github.com/th30d4y/OpenLearnX} -} - -\maketitle - -\begin{abstract} -The proliferation of online education has created unprecedented opportunities for accessible learning, yet fundamental challenges persist: static content delivery fails to accommodate diverse learner abilities, delayed feedback impedes learning momentum, and rampant credential fraud undermines trust in educational achievements. This paper presents OpenLearnX, a comprehensive decentralized learning and assessment platform that addresses these critical issues through the integration of three key technological innovations. First, we implement an adaptive learning engine based on Item Response Theory (IRT) using the three-parameter logistic model, enhanced with TensorFlow-based machine learning for multi-dimensional ability estimation across skill domains. Second, we develop a secure multi-language code execution environment utilizing Docker containerization with strict resource isolation, supporting eight programming languages with sub-3-second execution times. Third, we introduce an ERC-721 NFT-based certification system deployed on Ethereum, with certificate metadata permanently stored on IPFS for decentralized verification. Our experimental evaluation across 1,000 simulated quiz sessions demonstrates 0.94 correlation accuracy in ability estimation with convergence within 8.3 questions on average, compared to 25-30 questions for traditional fixed-form assessments. Load testing confirms the platform handles 500 concurrent users with 95th percentile API response times under 127ms. Security analysis including penetration testing, smart contract auditing using Slither and Mythril, and sandbox escape testing reveals no critical vulnerabilities. OpenLearnX represents a significant advancement in educational technology, providing a scalable, secure, and verifiable platform for personalized learning that ensures educational achievements remain permanent and tamper-proof regardless of institutional longevity. -\end{abstract} - -\begin{IEEEkeywords} -adaptive learning, blockchain certification, decentralized education, NFT credentials, Item Response Theory, smart contracts, IPFS, TensorFlow, ERC-721, personalized assessment -\end{IEEEkeywords} - -\section{Introduction} - -\subsection{Background and Motivation} - -The landscape of education has undergone a dramatic transformation in the digital age. Online learning platforms have democratized access to educational resources, enabling millions of learners worldwide to acquire new skills regardless of geographical or socioeconomic constraints. The global e-learning market, valued at approximately \$250 billion in 2020, is projected to exceed \$1 trillion by 2028 \cite{b1}. However, this rapid growth has exposed fundamental limitations in how online education delivers content, assesses learners, and verifies achievements. - -Traditional learning management systems (LMS) operate on a one-size-fits-all model, presenting identical content sequences to all learners regardless of their prior knowledge, learning pace, or cognitive abilities. This approach fails to accommodate the natural variation in learner populations, leading to frustration for advanced students who find content too easy and discouragement for those who struggle with material presented at an inappropriate difficulty level. Research in educational psychology consistently demonstrates that learning outcomes improve significantly when instruction is tailored to individual learner characteristics \cite{b2}. - -Furthermore, the feedback loop in conventional online education is often measured in days or weeks. Students submit assignments, await instructor review, and eventually receive grades with varying degrees of constructive feedback. This delay disrupts the immediate reinforcement that cognitive science identifies as crucial for effective learning \cite{b3}. - -Perhaps most critically, the credentialing ecosystem supporting online education remains fundamentally broken. Digital certificates and badges can be trivially forged using basic image editing software. Paper credentials can be fabricated or purchased from diploma mills. According to the Society for Human Resource Management, nearly 85\% of employers have caught applicants lying on their resumes, with fraudulent credentials representing a significant portion of these deceptions \cite{b4}. - -\subsection{Problem Statement} - -The core problems addressed by this research can be formalized as follows: - -\begin{enumerate} - \item \textbf{The Personalization Problem}: Given a heterogeneous population of learners with varying abilities $\theta \in \mathbb{R}$, how can we efficiently estimate each learner's ability and dynamically select assessment items of appropriate difficulty to maximize learning outcomes? - - \item \textbf{The Feedback Latency Problem}: In skill domains requiring practical demonstration (such as programming), how can we provide immediate, accurate feedback on learner submissions while maintaining security against malicious code execution? - - \item \textbf{The Credential Verification Problem}: How can we issue educational credentials that are permanently verifiable by any third party, resistant to forgery, and independent of the issuing institution's continued operation? -\end{enumerate} - -\subsection{Proposed Solution: OpenLearnX} - -We present OpenLearnX, a cutting-edge decentralized learning and assessment platform that revolutionizes education through the integration of adaptive testing, instant feedback, and blockchain-based certification. The platform provides learners with a smarter, personalized, and verifiable way to build and prove skills---from code challenges to real-world learning paths, all backed by blockchain technology. - -OpenLearnX addresses the identified problems through three synergistic innovations: - -\textbf{Adaptive Learning Engine}: We implement a sophisticated adaptive testing system based on Item Response Theory (IRT), specifically the three-parameter logistic (3PL) model. Our implementation extends traditional IRT with TensorFlow-based machine learning to enable multi-dimensional ability estimation across distinct skill domains. - -\textbf{Secure Code Execution Environment}: For programming-focused assessments, we develop a sandboxed code execution service supporting Python, JavaScript, Java, C++, C, Go, Rust, and Ruby. Each submission executes in an ephemeral Docker container with strict resource limits (10-second CPU timeout, 256MB memory, network isolation). - -\textbf{Blockchain Certification System}: We implement an ERC-721 compliant smart contract on Ethereum for issuing non-fungible token (NFT) certificates. Certificate metadata is stored on the InterPlanetary File System (IPFS), creating a permanent, decentralized record. - -\subsection{Contributions} - -The main contributions of this paper include: - -\begin{enumerate} - \item A novel adaptive learning algorithm combining Item Response Theory with TensorFlow-based machine learning for multi-dimensional ability estimation across skill domains - \item A secure multi-language code execution environment using Docker containerization with comprehensive resource isolation and security controls - \item An ERC-721 NFT-based certification system with IPFS metadata storage enabling permanent, decentralized credential verification - \item A comprehensive peer review system with AI-powered bias detection for collaborative learning assessment - \item A skill competency mapping system that tracks learner progress across multiple dimensions with radar chart visualization - \item A wallet-based authentication system eliminating password vulnerabilities through cryptographic signature verification - \item An open-source reference implementation demonstrating practical integration of these technologies -\end{enumerate} - -\subsection{Paper Organization} - -The remainder of this paper is organized as follows. Section II reviews related work in adaptive learning, blockchain applications in education, and decentralized storage systems. Section III presents the overall system architecture and design principles. Section IV details the implementation of each major component. Section V describes our evaluation methodology and presents experimental results. Section VI discusses the implications and limitations of our approach. Section VII outlines future work directions, and Section VIII concludes the paper. - -\section{Related Work} - -\subsection{Adaptive Learning Systems} - -The concept of adapting instruction to individual learner characteristics dates to the earliest computerized educational systems. Intelligent Tutoring Systems (ITS) emerged in the 1970s, attempting to model student knowledge and adjust instruction accordingly \cite{b5}. Systems like LISP Tutor and later ALEKS demonstrated that computer-based adaptive instruction could achieve learning gains comparable to human tutoring. - -Item Response Theory (IRT) provides the mathematical foundation for modern adaptive testing. Developed by psychometricians including Lord, Rasch, and Birnbaum \cite{b6}, IRT models the probability of a correct response as a function of learner ability and item characteristics. The three-parameter logistic (3PL) model, which we employ in OpenLearnX, accounts for item difficulty, discrimination, and guessing probability: - -\begin{equation} -P(X_{ij} = 1 | \theta_j) = c_i + \frac{1 - c_i}{1 + e^{-a_i(\theta_j - b_i)}} -\label{eq:irt} -\end{equation} - -Where $\theta_j$ represents the ability of learner $j$, $b_i$ is the difficulty of item $i$, $a_i$ is the discrimination parameter, and $c_i$ is the pseudo-guessing parameter. - -Commercial platforms including Knewton, ALEKS (acquired by McGraw-Hill), and DreamBox Learning have deployed adaptive learning at scale. However, these systems remain proprietary and centralized, raising concerns about data ownership, algorithmic transparency, and vendor lock-in. - -Recent research has explored machine learning approaches beyond traditional IRT. Deep learning models for knowledge tracing \cite{b7} can capture complex temporal dependencies in learning sequences. Zhang et al. \cite{b9} demonstrated that neural network-based approaches can outperform classical IRT for ability estimation in certain domains. - -\subsection{Blockchain Applications in Education} - -Blockchain technology, introduced through Bitcoin by Nakamoto \cite{b10}, provides a decentralized, immutable ledger suitable for recording transactions without trusted intermediaries. Buterin's Ethereum \cite{b11} extended this concept with Turing-complete smart contracts, enabling programmable applications on blockchain infrastructure. - -The application of blockchain to educational credentials began with the MIT Media Lab's digital diplomas project in 2017 \cite{b12}. Using the Blockcerts open standard, MIT issued blockchain-anchored digital diplomas that graduates could share and employers could verify without contacting the university. - -Grech and Camilleri \cite{b13} provide a comprehensive analysis of blockchain applications in education, identifying credentialing, lifelong learning records, and intellectual property management as primary use cases. - -Existing blockchain education platforms primarily focus on credential issuance and verification, treating blockchain as an add-on to traditional learning management systems. OpenLearnX differentiates itself by integrating blockchain throughout the learning journey---from wallet-based authentication to progress tracking to certificate issuance. - -\subsection{Decentralized Storage Systems} - -The InterPlanetary File System (IPFS), developed by Protocol Labs \cite{b14}, addresses limitations of traditional web architecture through content-addressed storage. Each piece of content is identified by its cryptographic hash, enabling verification that retrieved content has not been altered. - -For educational applications, IPFS offers several advantages. Course materials and credentials stored on IPFS remain accessible even if the original hosting institution ceases operation. In OpenLearnX, we store certificate metadata on IPFS and record the IPFS hash in the blockchain smart contract. - -\subsection{Secure Code Execution} - -Online judges for programming competitions and coding education face the challenge of executing untrusted user code safely. Containerization using Docker provides process-level isolation with modest performance overhead \cite{b21}. Research by Li et al. \cite{b15} analyzes the security architecture of online judges, identifying common vulnerabilities. - -OpenLearnX implements defense in depth for code execution: Docker containers with dropped capabilities, user namespace isolation, read-only filesystems, network isolation, CPU and memory limits, and timeout enforcement. - -\section{System Architecture} - -\subsection{Design Principles} - -The OpenLearnX architecture follows several key design principles: - -\begin{enumerate} - \item \textbf{Decentralization}: Minimize reliance on centralized infrastructure where practical - \item \textbf{Security by Design}: Implement defense in depth, assuming that any single security control may fail - \item \textbf{Scalability}: Design for horizontal scaling to accommodate growing user populations - \item \textbf{Interoperability}: Adhere to open standards (ERC-721, JWT, REST) to enable integration - \item \textbf{User Sovereignty}: Give learners control over their identity, data, and credentials -\end{enumerate} - -\subsection{System Overview} - -OpenLearnX employs a modern microservices architecture with clear separation of concerns. The system comprises four main layers: - -\textbf{User Interface Layer}: Built using Next.js 14 with TypeScript, leveraging React 18's concurrent features for optimal rendering performance. TailwindCSS provides utility-first styling, while shadcn/ui and Radix UI supply accessible component primitives. - -\textbf{Backend API Layer}: Implemented in Flask 2.3.3 with Python, providing RESTful APIs and WebSocket connections for real-time updates. Services include Authentication, Quiz Management, Adaptive Quiz Engine, Certificate Minting, Code Compiler, Dashboard Analytics, and AI Quiz Generation. - -\textbf{Blockchain Layer}: Solidity smart contracts deployed on Ethereum implementing ERC-721 standard using OpenZeppelin's audited base contracts. Development uses the Foundry toolkit. - -\textbf{Decentralized Storage Layer}: Certificate metadata stored on IPFS with content-addressed, immutable, distributed, and permanent properties. - -\subsection{User Interface Layer} - -The user interface supports three primary user roles: - -\textbf{Students}: Access personalized dashboards showing progress across courses, competency radar charts, certificate galleries with blockchain verification, and learning history timelines. - -\textbf{Instructors}: Manage courses and assessments, monitor class performance analytics, track individual student progress, and receive alerts from the bias detection system. - -\textbf{Employers/Verifiers}: Instantly verify candidate credentials on the blockchain, view detailed skill assessments, and confirm certificate authenticity. - -Key frontend components include WalletConnect for MetaMask integration, QuestionCard for adaptive quiz display, Monaco-based CodeEditor, Chart.js visualizations, and CertificateCard with QR verification codes. - -\subsection{Backend Services} - -The backend follows a service-oriented design: - -\textbf{Authentication Service}: Implements wallet-based authentication using cryptographic signatures, generates time-limited nonces to prevent replay attacks, verifies ECDSA signatures, and issues JWT tokens. - -\textbf{Quiz Service}: Manages assessment lifecycle including creation, retrieval, updating, deletion, supports multiple question types, and implements auto-grading. - -\textbf{Adaptive Quiz Service}: Implements the IRT-based adaptive algorithm, manages quiz sessions with real-time difficulty adjustment, and estimates learner ability using Bayesian updating. - -\textbf{Certificate Service}: Orchestrates NFT minting including eligibility verification, metadata generation, IPFS upload, and smart contract interaction. - -\textbf{Compiler Service}: Executes user-submitted code in Docker containers with security controls including resource limits, network isolation, and timeout enforcement. - -\textbf{Dashboard Service}: Aggregates analytics including progress percentages, competency distributions, and performance time series. - -\textbf{AI Quiz Service}: Leverages TensorFlow models for intelligent question generation. - -\subsection{Blockchain Layer} - -The primary smart contract, CertificateNFT, implements ERC-721: - -\begin{lstlisting}[language=Solidity] -contract CertificateNFT is ERC721, - ERC721URIStorage, Ownable { - - struct Certificate { - string subject; - string studentName; - uint256 score; - uint256 timestamp; - bool verified; - } - - mapping(uint256 => Certificate) - public certificates; - mapping(address => uint256[]) - public userCertificates; - - function mintCertificateWithDetails( - address to, - string memory _tokenURI, - string memory subject, - string memory studentName, - uint256 score - ) public onlyOwner returns (uint256); - - function verifyCertificate(uint256 tokenId) - public view returns (bool); -} -\end{lstlisting} - -\subsection{Decentralized Storage Layer} - -Certificate metadata follows NFT marketplace standards: - -\begin{lstlisting}[language=json] -{ - "name": "OpenLearnX Certificate", - "description": "Certificate of Achievement", - "image": "ipfs://Qm.../certificate.png", - "attributes": [ - {"trait_type": "Subject", - "value": "Python Programming"}, - {"trait_type": "Score", - "display_type": "number", - "value": 95} - ] -} -\end{lstlisting} - -\section{Implementation} - -\subsection{Adaptive Learning Algorithm} - -\subsubsection{Item Response Theory Foundation} - -Our adaptive learning system implements the three-parameter logistic (3PL) model. The probability that learner $j$ with ability $\theta_j$ correctly answers item $i$ is: - -\begin{equation} -P(\theta_j) = c_i + \frac{1 - c_i}{1 + e^{-a_i(\theta_j - b_i)}} -\end{equation} - -Where $\theta_j \in \mathbb{R}$ represents learner ability, $b_i$ is the difficulty parameter, $a_i$ is the discrimination parameter, and $c_i$ is the pseudo-guessing parameter. - -\subsubsection{Ability Estimation} - -We estimate learner ability using maximum likelihood estimation (MLE) with Bayesian priors. Given a response pattern $\mathbf{u} = (u_1, u_2, ..., u_n)$, the likelihood function is: - -\begin{equation} -L(\theta | \mathbf{u}) = \prod_{i=1}^{n} P_i(\theta)^{u_i} Q_i(\theta)^{1-u_i} -\end{equation} - -We incorporate a Bayesian prior $\pi(\theta)$ assuming $\theta \sim N(0, 1)$, yielding the posterior: - -\begin{equation} -\pi(\theta | \mathbf{u}) \propto L(\theta | \mathbf{u}) \cdot \pi(\theta) -\end{equation} - -\subsubsection{Adaptive Question Selection} - -Question selection follows the maximum information criterion. Fisher information for item $i$ at ability level $\theta$ is: - -\begin{equation} -I_i(\theta) = a_i^2 \frac{(P_i(\theta) - c_i)^2}{(1 - c_i)^2} \cdot \frac{Q_i(\theta)}{P_i(\theta)} -\end{equation} - -At each step, we select the item maximizing information: - -\begin{equation} -i^* = \arg\max_{i \in \text{remaining}} I_i(\hat{\theta}) -\end{equation} - -\subsubsection{TensorFlow Integration} - -Our TensorFlow implementation extends traditional IRT with: - -\textbf{Multi-dimensional ability estimation}: A vector $\boldsymbol{\theta} = (\theta_1, \theta_2, ..., \theta_k)$ representing ability across $k$ skill dimensions. - -\textbf{Temporal modeling}: Recency weighting with time-decay factor $\lambda^{(t - t_i)}$. - -\textbf{Content-area weighting}: Modified item selection to ensure balanced coverage: - -\begin{equation} -i^* = \arg\max_{i} \left[ I_i(\hat{\theta}) - \alpha \cdot \text{coverage\_penalty}(i) \right] -\end{equation} - -\subsection{Secure Code Execution} - -\subsubsection{Architecture Overview} - -The code compilation service supports eight programming languages with secure, sandboxed execution including Python, JavaScript, Java, C++, C, Go, Rust, and Ruby. - -\subsubsection{Security Controls} - -We implement defense in depth: - -\begin{itemize} - \item \textbf{Process Isolation}: Separate Docker containers with own process namespace - \item \textbf{Resource Limits}: 10-second CPU timeout, 256MB memory, limited PIDs - \item \textbf{Network Isolation}: No network access - \item \textbf{User Namespace Isolation}: Unprivileged user execution - \item \textbf{Read-only Filesystem}: Containers mounted read-only - \item \textbf{Capability Dropping}: Removed privileged operations -\end{itemize} - -\subsection{Wallet-Based Authentication} - -OpenLearnX implements passwordless authentication using Ethereum wallet signatures: - -\begin{enumerate} - \item \textbf{Connection}: User connects MetaMask wallet - \item \textbf{Nonce Request}: Backend generates time-limited nonce - \item \textbf{Signing}: User signs nonce with wallet private key - \item \textbf{Verification}: Backend recovers signing address and verifies - \item \textbf{Token Issuance}: JWT token issued for session -\end{enumerate} - -Security properties include replay protection (single-use nonces), phishing resistance (human-readable messages), and cryptographic strength (ECDSA with 256-bit keys). - -\subsection{NFT Certificate Minting} - -The minting process includes: - -\begin{enumerate} - \item \textbf{Eligibility Verification}: Verify completion and minimum score - \item \textbf{Metadata Generation}: Create ERC-721 compliant metadata - \item \textbf{IPFS Upload}: Store metadata permanently on IPFS - \item \textbf{Smart Contract Interaction}: Call mintCertificateWithDetails - \item \textbf{Transaction Confirmation}: Wait for blockchain confirmation -\end{enumerate} - -Any third party can verify certificates by querying the smart contract and fetching IPFS metadata. - -\section{Evaluation} - -\subsection{Experimental Setup} - -\subsubsection{Environment} - -Experiments were conducted on: -\begin{itemize} - \item Backend Server: 8-core CPU, 32GB RAM, Ubuntu 22.04 LTS - \item Database: MongoDB 6.0 with 16GB allocated memory - \item Blockchain: Local Anvil node forking Ethereum mainnet - \item Testing Tools: Apache JMeter 5.5, custom Python scripts -\end{itemize} - -\subsubsection{Datasets} - -\textbf{Adaptive Algorithm}: 1,000 simulated quiz sessions with synthetic learner abilities drawn from $N(0, 1)$. Question bank of 500 items with calibrated IRT parameters. - -\textbf{Performance Testing}: Load tests with 50-500 concurrent virtual users. - -\textbf{Security Testing}: OWASP ZAP penetration testing, Slither and Mythril smart contract analysis. - -\subsection{Adaptive Algorithm Performance} - -\subsubsection{Ability Estimation Accuracy} - -\begin{table}[htbp] -\caption{Ability Estimation Accuracy} -\begin{center} -\begin{tabular}{|l|c|} -\hline -\textbf{Metric} & \textbf{Value} \\ -\hline -Pearson Correlation (r) & 0.94 \\ -\hline -Root Mean Square Error (RMSE) & 0.38 \\ -\hline -Mean Absolute Error (MAE) & 0.29 \\ -\hline -Bias (Mean Error) & 0.02 \\ -\hline -\end{tabular} -\label{tab:accuracy} -\end{center} -\end{table} - -\subsubsection{Convergence Speed} - -\begin{table}[htbp] -\caption{Questions to Convergence} -\begin{center} -\begin{tabular}{|l|c|} -\hline -\textbf{Statistic} & \textbf{Questions} \\ -\hline -Mean & 8.3 \\ -\hline -Median & 7 \\ -\hline -Standard Deviation & 2.8 \\ -\hline -90th Percentile & 12 \\ -\hline -\end{tabular} -\label{tab:convergence} -\end{center} -\end{table} - -Traditional fixed-form assessments require 25-30 items for comparable reliability. Our adaptive approach achieves equivalent precision with approximately one-third the items. - -\subsection{System Performance} - -\subsubsection{API Response Times} - -\begin{table}[htbp] -\caption{API Response Times (milliseconds)} -\begin{center} -\begin{tabular}{|l|c|c|c|} -\hline -\textbf{Endpoint} & \textbf{Median} & \textbf{p95} & \textbf{p99} \\ -\hline -GET /api/courses & 45 & 89 & 142 \\ -\hline -POST /api/auth/verify & 67 & 127 & 198 \\ -\hline -GET /api/dashboard & 78 & 134 & 211 \\ -\hline -POST /api/compiler/run & 1,240 & 2,300 & 3,100 \\ -\hline -POST /api/certificates/mint & 12,400 & 15,600 & 18,200 \\ -\hline -\end{tabular} -\label{tab:response} -\end{center} -\end{table} - -\subsubsection{Scalability} - -Table~\ref{tab:scalability} shows aggregate system-wide latency under varying user loads. Note that individual endpoint response times (Table~\ref{tab:response}) were measured under baseline load conditions, while scalability metrics reflect mixed workload stress testing. - -\begin{table}[htbp] -\caption{Scalability Testing Results} -\begin{center} -\begin{tabular}{|c|c|c|c|} -\hline -\textbf{Users} & \textbf{Throughput} & \textbf{Error} & \textbf{p95 Latency} \\ -\hline -50 & 234 req/s & 0.0\% & 89ms \\ -\hline -100 & 412 req/s & 0.0\% & 112ms \\ -\hline -200 & 678 req/s & 0.1\% & 156ms \\ -\hline -500 & 923 req/s & 0.3\% & 287ms \\ -\hline -\end{tabular} -\label{tab:scalability} -\end{center} -\end{table} - -\subsection{Security Analysis} - -\subsubsection{Penetration Testing} - -\begin{table}[htbp] -\caption{Security Findings} -\begin{center} -\begin{tabular}{|l|c|} -\hline -\textbf{Category} & \textbf{Findings} \\ -\hline -Critical & 0 \\ -\hline -High & 0 \\ -\hline -Medium & 2 \\ -\hline -Low & 5 \\ -\hline -Informational & 12 \\ -\hline -\end{tabular} -\label{tab:security} -\end{center} -\end{table} - -\subsubsection{Smart Contract Audit} - -Analysis using Slither and Mythril revealed no high-risk vulnerabilities. - -\subsubsection{Sandbox Escape Testing} - -All escape attempts were unsuccessful including kernel exploits, Docker socket access, capability abuse, network exfiltration, resource exhaustion, and fork bombs. - -\section{Discussion} - -\subsection{Key Findings} - -Our evaluation demonstrates that OpenLearnX successfully addresses the three identified problems: - -\textbf{Personalization}: The adaptive algorithm accurately estimates learner ability ($r = 0.94$) and converges rapidly (8.3 questions average). - -\textbf{Feedback Latency}: The code execution service provides immediate results (median 1.2 seconds) with successful sandbox isolation. - -\textbf{Credential Verification}: The NFT-based certification system creates permanent, verifiable credentials on blockchain. - -\subsection{Comparison with Existing Systems} - -\begin{table}[htbp] -\caption{Feature Comparison} -\begin{center} -\begin{tabular}{|l|c|c|c|} -\hline -\textbf{Feature} & \textbf{OpenLearnX} & \textbf{LMS} & \textbf{Blockchain} \\ -\hline -Adaptive Learning & IRT+ML & Limited & None \\ -\hline -Instant Feedback & Real-time & Delayed & N/A \\ -\hline -Code Execution & 8 Languages & Limited & None \\ -\hline -Blockchain Cert & Yes & No & Yes \\ -\hline -Open Source & Yes & Varies & Varies \\ -\hline -\end{tabular} -\label{tab:comparison} -\end{center} -\end{table} - -\subsection{Limitations} - -\textbf{Scalability of NFT Minting}: Ethereum transaction costs and confirmation times limit throughput. - -\textbf{Cold Start Problem}: The adaptive algorithm requires a calibrated question bank. - -\textbf{Wallet Usability}: May present barriers for users unfamiliar with cryptocurrency wallets. - -\subsection{Practical Implications} - -For educational institutions, OpenLearnX provides verifiable credentials that remain valid regardless of institutional longevity. For employers, blockchain verification eliminates the need to contact issuing institutions. For learners, self-sovereign credentials provide portability and permanence. - -\section{Future Work} - -\subsection{Mobile Application} - -Development of native iOS and Android applications using React Native with offline quiz caching and push notifications. - -\subsection{Live Proctoring} - -Integration of computer vision-based proctoring including face verification, multiple person detection, and suspicious eye movement detection. - -\subsection{Course Marketplace} - -A decentralized marketplace enabling course creators to publish content and receive cryptocurrency payments through smart contracts. - -\subsection{Cross-Chain Support} - -Deployment on multiple blockchains (Ethereum, Polygon, Arbitrum) with bridges for cross-chain verification. - -\subsection{AI Question Generation} - -Integration of large language models for automatic question generation with difficulty estimation and distractor creation. - -\subsection{Enhanced Peer Review} - -NLP-based bias detection, automated feedback quality scoring, and token incentives for high-quality reviews. - -\subsection{Learning Analytics} - -Advanced analytics using machine learning for dropout risk prediction, intervention timing optimization, and career path recommendations. - -\section{Conclusion} - -This paper presented OpenLearnX, a comprehensive decentralized learning and assessment platform that addresses fundamental challenges in online education through the integration of adaptive learning, instant feedback, and blockchain-based certification. - -Our adaptive learning algorithm, combining Item Response Theory with TensorFlow-based machine learning, achieves 0.94 correlation in ability estimation while converging in 8.3 questions on average---approximately one-third the items required for traditional fixed-form assessments. - -The secure code execution environment, implemented using Docker containerization with strict resource isolation, provides immediate feedback on programming submissions while successfully preventing all tested sandbox escape attempts. Support for eight programming languages enables practical skill assessment. - -The blockchain certification system, using ERC-721 NFTs with IPFS-stored metadata, creates permanent, verifiable credentials that can be confirmed by any third party without contacting the issuing institution. - -OpenLearnX demonstrates that it is practical to combine these advanced technologies into a cohesive platform that serves learners, instructors, and employers. By open-sourcing our implementation, we hope to accelerate the adoption of these technologies and contribute to the democratization of verifiable education. - -\section*{Acknowledgment} - -We acknowledge the contributions of the open-source community including Next.js (Vercel), Flask (Pallets Projects), OpenZeppelin, Foundry, TensorFlow, MongoDB, and IPFS/Protocol Labs. We also thank the beta testers and educational institutions who participated in usability studies. - -\begin{thebibliography}{00} -\bibitem{b1} Statista Research Department, ``E-learning and Digital Education Market Size Worldwide from 2019 to 2026,'' Statista, 2023. -\bibitem{b2} B. S. Bloom, ``The 2 Sigma Problem: The Search for Methods of Group Instruction as Effective as One-to-One Tutoring,'' Educational Researcher, vol. 13, no. 6, pp. 4--16, 1984. -\bibitem{b3} R. A. Bjork and E. L. Bjork, ``A New Theory of Disuse and an Old Theory of Stimulus Fluctuation,'' in From Learning Processes to Cognitive Processes, Hillsdale, NJ: Erlbaum, 1992. -\bibitem{b4} Society for Human Resource Management, ``More than Half of Workers Lie on Their Resumes,'' SHRM, 2017. -\bibitem{b5} J. R. Anderson, C. F. Boyle, and B. J. Reiser, ``Intelligent Tutoring Systems,'' Science, vol. 228, no. 4698, pp. 456--462, 1985. -\bibitem{b6} F. M. Lord, Applications of Item Response Theory to Practical Testing Problems. Hillsdale, NJ: Lawrence Erlbaum Associates, 1980. -\bibitem{b7} C. Piech et al., ``Deep Knowledge Tracing,'' in Advances in Neural Information Processing Systems 28, 2015. -\bibitem{b8} M. Chi, K. VanLehn, D. Litman, and P. Jordan, ``An Evaluation of Pedagogical Tutorial Tactics,'' IJAIED, vol. 21, 2011. -\bibitem{b9} J. Zhang, X. Shi, I. King, and D. Y. Yeung, ``Dynamic Key-Value Memory Networks for Knowledge Tracing,'' in WWW '17, 2017. -\bibitem{b10} S. Nakamoto, ``Bitcoin: A Peer-to-Peer Electronic Cash System,'' 2008. -\bibitem{b11} V. Buterin, ``A Next-Generation Smart Contract and Decentralized Application Platform,'' Ethereum White Paper, 2014. -\bibitem{b12} MIT Media Lab, ``Digital Diplomas,'' MIT Media Lab, 2017. -\bibitem{b13} A. Grech and A. F. Camilleri, ``Blockchain in Education,'' JRC Science for Policy Report, European Commission, 2017. -\bibitem{b14} J. Benet, ``IPFS - Content Addressed, Versioned, P2P File System,'' arXiv:1407.3561, 2014. -\bibitem{b15} L. Li, H. Yang, S. Li, and Y. Liu, ``Security Analysis of Online Judge Systems,'' in CCS '19, 2019. -\bibitem{b16} W. J. van der Linden and C. A. W. Glas, Eds., Elements of Adaptive Testing. New York: Springer, 2010. -\bibitem{b17} OpenZeppelin, ``OpenZeppelin Contracts,'' 2023. -\bibitem{b18} A. M. Antonopoulos and G. Wood, Mastering Ethereum. O'Reilly Media, 2018. -\bibitem{b19} M. Brown and V. Diaz, ``Digital Credentials: Why, Where, and How,'' EDUCAUSE, 2011. -\bibitem{b20} L. Zhong, L. Hu, and Y. Zheng, ``Deep Learning for Computerized Adaptive Testing,'' in KDD '20, 2020. -\bibitem{b21} D. Merkel, ``Docker: Lightweight Linux Containers,'' Linux Journal, 2014. -\bibitem{b22} Next.js Team, ``Next.js: The React Framework for Production,'' Vercel, 2023. -\bibitem{b23} TensorFlow Developers, ``TensorFlow: An End-to-End Open Source Machine Learning Platform,'' 2023. -\bibitem{b24} Foundry Team, ``Foundry: A Blazing Fast Toolkit for Ethereum Development,'' 2023. -\bibitem{b25} L. Cronbach and P. Meehl, ``Construct Validity in Psychological Tests,'' Psychological Bulletin, vol. 52, no. 4, 1955. -\end{thebibliography} - -\end{document}