From 4b45c031e0d48f50ac3b297444e43ec055756469 Mon Sep 17 00:00:00 2001 From: Robert Chery Date: Wed, 8 Jul 2026 19:16:44 -0400 Subject: [PATCH] Initial commit --- .gitignore | 19 + README.md | 44 + Run-Hidden.vbs | 4 + SoundVolumeView.exe | Bin 0 -> 144896 bytes Start-Macropad.bat | 7 + package-lock.json | 2692 +++++++++++++++++++++++++++++++++++++ package.json | 20 + server.js | 294 +++++ ui/.gitignore | 24 + ui/README.md | 16 + ui/eslint.config.js | 21 + ui/index.html | 13 + ui/package-lock.json | 2774 +++++++++++++++++++++++++++++++++++++++ ui/package.json | 29 + ui/public/favicon.svg | 1 + ui/public/icons.svg | 24 + ui/src/App.css | 297 +++++ ui/src/App.jsx | 277 ++++ ui/src/assets/hero.png | Bin 0 -> 13057 bytes ui/src/assets/react.svg | 1 + ui/src/assets/vite.svg | 1 + ui/src/index.css | 105 ++ ui/src/main.jsx | 10 + ui/vite.config.js | 7 + 24 files changed, 6680 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 Run-Hidden.vbs create mode 100644 SoundVolumeView.exe create mode 100644 Start-Macropad.bat create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 server.js create mode 100644 ui/.gitignore create mode 100644 ui/README.md create mode 100644 ui/eslint.config.js create mode 100644 ui/index.html create mode 100644 ui/package-lock.json create mode 100644 ui/package.json create mode 100644 ui/public/favicon.svg create mode 100644 ui/public/icons.svg create mode 100644 ui/src/App.css create mode 100644 ui/src/App.jsx create mode 100644 ui/src/assets/hero.png create mode 100644 ui/src/assets/react.svg create mode 100644 ui/src/assets/vite.svg create mode 100644 ui/src/index.css create mode 100644 ui/src/main.jsx create mode 100644 ui/vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b706ef1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules/ +ui/node_modules/ + +# Build outputs +ui/dist/ +ui/dist-ssr/ + +# Local configuration (optional, can be commented out if you want to track it) +config.json + +# OS files +.DS_Store +Thumbs.db diff --git a/README.md b/README.md new file mode 100644 index 0000000..ffd9ae6 --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +# sfmacro-client + +`sfmacro-client` is a Node.js server that acts as a bridge between a custom Raspberry Pi Pico-based Macropad and your computer. It listens for physical button presses on the Pico over a USB Serial connection and executes corresponding configurable macros (such as simulating key presses, running commands, or toggling application audio). It also controls the RGB LEDs on the Macropad based on the button state or system metrics (e.g., CPU load). + +## How It Works + +The architecture consists of three main components: + +1. **Hardware (Raspberry Pi Pico)** + - The Pico is connected via USB and communicates over a Serial port. + - It sends serial messages when buttons are pressed (`P,`) and released (`R,`). + - It receives serial messages to set the RGB LED color for each button (`C,,,,`). + +2. **Node.js Server (`server.js`)** + - The server auto-detects the connected Pico (by its Vendor ID `2E8A`) and maintains the serial connection. + - It stores the configuration in `config.json`. + - When a button press is detected, it triggers the configured action: + - **`key`**: Uses the `@nut-tree-fork/nut-js` library to simulate keyboard keystrokes or complex keyboard combos (e.g., `LeftControl + G`). + - **`cmd`**: Runs arbitrary system commands using Node's `child_process.exec`. + - **`mute_app`**: Toggles the mute state of specific applications (like `firefox.exe`) using the included `SoundVolumeView.exe` utility. + - **`cpu_monitor`**: Instead of triggering an action, a button assigned this action will constantly have its LED color updated based on the host computer's current CPU utilization (Green -> Yellow -> Orange -> Red) by polling with the `systeminformation` library. + - It hosts a local REST API and web server on port `3001` to allow configuration changes via a frontend UI. + +3. **Web Interface (`ui/` folder)** + - A Vite/React-based frontend is bundled into the `ui/dist` folder and served by the Node application. + - It allows the user to easily configure each of the 16 buttons, setting their action type, command/key, idle LED color, and pressed LED color. + +## Starting the Server + +There are a couple of ways to launch the software depending on your needs: + +- **Interactive Mode (`Start-Macropad.bat`)**: Starts the Node.js server, displays the console output, and automatically opens your default web browser to the `http://localhost:3001` configuration page. +- **Background Mode (`Run-Hidden.vbs`)**: Silently launches the Node server in the background without opening a visible command prompt window. This is ideal for adding to your Windows Startup folder for seamless background operation. + +## Configuration + +Configuration is saved automatically to `config.json` when updated via the web interface. + +Each of the 16 buttons has the following properties: +- `actionType`: Can be `"key"`, `"cmd"`, `"mute_app"`, `"cpu_monitor"`, or `"none"`. +- `key`: The keystroke combination to send (e.g., `F20` or `LeftControl + G`). Used for the `key` action type. +- `cmd`: The command to execute or executable to mute. Used for the `cmd` and `mute_app` action types. +- `color`: The default RGB LED color when the button is idle. +- `pressedColor`: The RGB LED color when the button is actively pressed down. diff --git a/Run-Hidden.vbs b/Run-Hidden.vbs new file mode 100644 index 0000000..4b0fb27 --- /dev/null +++ b/Run-Hidden.vbs @@ -0,0 +1,4 @@ +Set fso = CreateObject("Scripting.FileSystemObject") +Set WshShell = CreateObject("WScript.Shell") +WshShell.CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName) +WshShell.Run "cmd /c node server.js", 0, False diff --git a/SoundVolumeView.exe b/SoundVolumeView.exe new file mode 100644 index 0000000000000000000000000000000000000000..d9ffbc52be28a510c98083f99656ffa09f4dcdc8 GIT binary patch literal 144896 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 Z{jtgMiTIz`qwk$}-|hMG`+Md5_#fp!su}nul +start http://localhost:3001 +exit diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0052392 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2692 @@ +{ + "name": "sfmacro-client", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "sfmacro-client", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@nut-tree-fork/nut-js": "^4.2.6", + "cors": "^2.8.6", + "express": "^5.2.1", + "serialport": "^13.0.0", + "systeminformation": "^5.31.7" + } + }, + "node_modules/@jimp/bmp": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.22.12.tgz", + "integrity": "sha512-aeI64HD0npropd+AR76MCcvvRaa+Qck6loCOS03CkkxGHN5/r336qTM5HPUdHKMDOGzqknuVPA8+kK1t03z12g==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "bmp-js": "^0.1.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/core": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.22.12.tgz", + "integrity": "sha512-l0RR0dOPyzMKfjUW1uebzueFEDtCOj9fN6pyTYWWOM/VS4BciXQ1VVrJs8pO3kycGYZxncRKhCoygbNr8eEZQA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^16.5.4", + "isomorphic-fetch": "^3.0.0", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.6.0" + } + }, + "node_modules/@jimp/custom": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.22.12.tgz", + "integrity": "sha512-xcmww1O/JFP2MrlGUMd3Q78S3Qu6W3mYTXYuIqFq33EorgYHV/HqymHfXy9GjiCJ7OI+7lWx6nYFOzU7M4rd1Q==", + "license": "MIT", + "dependencies": { + "@jimp/core": "^0.22.12" + } + }, + "node_modules/@jimp/gif": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.22.12.tgz", + "integrity": "sha512-y6BFTJgch9mbor2H234VSjd9iwAhaNf/t3US5qpYIs0TSbAvM02Fbc28IaDETj9+4YB4676sz4RcN/zwhfu1pg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "gifwrap": "^0.10.1", + "omggif": "^1.0.9" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/jpeg": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.22.12.tgz", + "integrity": "sha512-Rq26XC/uQWaQKyb/5lksCTCxXhtY01NJeBN+dQv5yNYedN0i7iYu+fXEoRsfaJ8xZzjoANH8sns7rVP4GE7d/Q==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "jpeg-js": "^0.4.4" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.22.12.tgz", + "integrity": "sha512-xslz2ZoFZOPLY8EZ4dC29m168BtDx95D6K80TzgUi8gqT7LY6CsajWO0FAxDwHz6h0eomHMfyGX0stspBrTKnQ==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.22.12.tgz", + "integrity": "sha512-S0vJADTuh1Q9F+cXAwFPlrKWzDj2F9t/9JAbUvaaDuivpyWuImEKXVz5PUZw2NbpuSHjwssbTpOZ8F13iJX4uw==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.22.12.tgz", + "integrity": "sha512-SWVXx1yiuj5jZtMijqUfvVOJBwOifFn0918ou4ftoHgegc5aHWW5dZbYPjvC9fLpvz7oSlptNl2Sxr1zwofjTg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.22.12.tgz", + "integrity": "sha512-xImhTE5BpS8xa+mAN6j4sMRWaUgUDLoaGHhJhpC+r7SKKErYDR0WQV4yCE4gP+N0gozD0F3Ka1LUSaMXrn7ZIA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "tinycolor2": "^1.6.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.22.12.tgz", + "integrity": "sha512-Eo3DmfixJw3N79lWk8q/0SDYbqmKt1xSTJ69yy8XLYQj9svoBbyRpSnHR+n9hOw5pKXytHwUW6nU4u1wegHNoQ==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.22.12.tgz", + "integrity": "sha512-z0w/1xH/v/knZkpTNx+E8a7fnasQ2wHG5ze6y5oL2dhH1UufNua8gLQXlv8/W56+4nJ1brhSd233HBJCo01BXA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.22.12.tgz", + "integrity": "sha512-FNuUN0OVzRCozx8XSgP9MyLGMxNHHJMFt+LJuFjn1mu3k0VQxrzqbN06yIl46TVejhyAhcq5gLzqmSCHvlcBVw==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.22.12.tgz", + "integrity": "sha512-qpRM8JRicxfK6aPPqKZA6+GzBwUIitiHaZw0QrJ64Ygd3+AsTc7BXr+37k2x7QcyCvmKXY4haUrSIsBug4S3CA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.22.12.tgz", + "integrity": "sha512-jYgGdSdSKl1UUEanX8A85v4+QUm+PE8vHFwlamaKk89s+PXQe7eVE3eNeSZX4inCq63EHL7cX580dMqkoC3ZLw==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.22.12.tgz", + "integrity": "sha512-LGuUTsFg+fOp6KBKrmLkX4LfyCy8IIsROwoUvsUPKzutSqMJnsm3JGDW2eOmWIS/jJpPaeaishjlxvczjgII+Q==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.22.12.tgz", + "integrity": "sha512-m251Rop7GN8W0Yo/rF9LWk6kNclngyjIJs/VXHToGQ6EGveOSTSQaX2Isi9f9lCDLxt+inBIb7nlaLLxnvHX8Q==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-rotate": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-gaussian": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.22.12.tgz", + "integrity": "sha512-sBfbzoOmJ6FczfG2PquiK84NtVGeScw97JsCC3rpQv1PHVWyW+uqWFF53+n3c8Y0P2HWlUjflEla2h/vWShvhg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-invert": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.22.12.tgz", + "integrity": "sha512-N+6rwxdB+7OCR6PYijaA/iizXXodpxOGvT/smd/lxeXsZ/empHmFFFJ/FaXcYh19Tm04dGDaXcNF/dN5nm6+xQ==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.22.12.tgz", + "integrity": "sha512-4AWZg+DomtpUA099jRV8IEZUfn1wLv6+nem4NRJC7L/82vxzLCgXKTxvNvBcNmJjT9yS1LAAmiJGdWKXG63/NA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-normalize": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.22.12.tgz", + "integrity": "sha512-0So0rexQivnWgnhacX4cfkM2223YdExnJTTy6d06WbkfZk5alHUx8MM3yEzwoCN0ErO7oyqEWRnEkGC+As1FtA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.22.12.tgz", + "integrity": "sha512-c7TnhHlxm87DJeSnwr/XOLjJU/whoiKYY7r21SbuJ5nuH+7a78EW1teOaj5gEr2wYEd7QtkFqGlmyGXY/YclyQ==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "load-bmfont": "^1.4.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.22.12.tgz", + "integrity": "sha512-3NyTPlPbTnGKDIbaBgQ3HbE6wXbAlFfxHVERmrbqAi8R3r6fQPxpCauA8UVDnieg5eo04D0T8nnnNIX//i/sXg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.22.12.tgz", + "integrity": "sha512-9YNEt7BPAFfTls2FGfKBVgwwLUuKqy+E8bDGGEsOqHtbuhbshVGxN2WMZaD4gh5IDWvR+emmmPPWGgaYNYt1gA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-scale": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.22.12.tgz", + "integrity": "sha512-dghs92qM6MhHj0HrV2qAwKPMklQtjNpoYgAB94ysYpsXslhRTiPisueSIELRwZGEr0J0VUxpUY7HgJwlSIgGZw==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-shadow": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.22.12.tgz", + "integrity": "sha512-FX8mTJuCt7/3zXVoeD/qHlm4YH2bVqBuWQHXSuBK054e7wFRnRnbSLPUqAwSeYP3lWqpuQzJtgiiBxV3+WWwTg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blur": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.22.12.tgz", + "integrity": "sha512-4x5GrQr1a/9L0paBC/MZZJjjgjxLYrqSmWd+e+QfAEPvmRxdRoQ5uKEuNgXnm9/weHQBTnQBQsOY2iFja+XGAw==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-color": ">=0.8.0", + "@jimp/plugin-resize": ">=0.8.0" + } + }, + "node_modules/@jimp/plugins": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.22.12.tgz", + "integrity": "sha512-yBJ8vQrDkBbTgQZLty9k4+KtUQdRjsIDJSPjuI21YdVeqZxYywifHl4/XWILoTZsjTUASQcGoH0TuC0N7xm3ww==", + "license": "MIT", + "dependencies": { + "@jimp/plugin-blit": "^0.22.12", + "@jimp/plugin-blur": "^0.22.12", + "@jimp/plugin-circle": "^0.22.12", + "@jimp/plugin-color": "^0.22.12", + "@jimp/plugin-contain": "^0.22.12", + "@jimp/plugin-cover": "^0.22.12", + "@jimp/plugin-crop": "^0.22.12", + "@jimp/plugin-displace": "^0.22.12", + "@jimp/plugin-dither": "^0.22.12", + "@jimp/plugin-fisheye": "^0.22.12", + "@jimp/plugin-flip": "^0.22.12", + "@jimp/plugin-gaussian": "^0.22.12", + "@jimp/plugin-invert": "^0.22.12", + "@jimp/plugin-mask": "^0.22.12", + "@jimp/plugin-normalize": "^0.22.12", + "@jimp/plugin-print": "^0.22.12", + "@jimp/plugin-resize": "^0.22.12", + "@jimp/plugin-rotate": "^0.22.12", + "@jimp/plugin-scale": "^0.22.12", + "@jimp/plugin-shadow": "^0.22.12", + "@jimp/plugin-threshold": "^0.22.12", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/png": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.22.12.tgz", + "integrity": "sha512-Mrp6dr3UTn+aLK8ty/dSKELz+Otdz1v4aAXzV5q53UDD2rbB5joKVJ/ChY310B+eRzNxIovbUF1KVrUsYdE8Hg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "pngjs": "^6.0.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/tiff": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.22.12.tgz", + "integrity": "sha512-E1LtMh4RyJsoCAfAkBRVSYyZDTtLq9p9LUiiYP0vPtXyxX4BiYBUYihTLSBlCQg5nF2e4OpQg7SPrLdJ66u7jg==", + "license": "MIT", + "dependencies": { + "utif2": "^4.0.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/types": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.22.12.tgz", + "integrity": "sha512-wwKYzRdElE1MBXFREvCto5s699izFHNVvALUv79GXNbsOVqlwlOxlWJ8DuyOGIXoLP4JW/m30YyuTtfUJgMRMA==", + "license": "MIT", + "dependencies": { + "@jimp/bmp": "^0.22.12", + "@jimp/gif": "^0.22.12", + "@jimp/jpeg": "^0.22.12", + "@jimp/png": "^0.22.12", + "@jimp/tiff": "^0.22.12", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/utils": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.22.12.tgz", + "integrity": "sha512-yJ5cWUknGnilBq97ZXOyOS0HhsHOyAyjHwYfHxGbSyMTohgQI6sVyE8KPgDwH8HHW/nMKXk8TrSwAE71zt716Q==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/@nut-tree-fork/default-clipboard-provider": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@nut-tree-fork/default-clipboard-provider/-/default-clipboard-provider-4.2.6.tgz", + "integrity": "sha512-Hzqj57rheIMGtsS4zK4//kOhaX5FxMluOiz+4TVaHXx+idZS/bPhZwd8e6o1w1GT0PVJOUIP+4CdUe//k5VRig==", + "license": "Apache-2.0", + "dependencies": { + "clipboardy": "2.3.0" + } + }, + "node_modules/@nut-tree-fork/libnut": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@nut-tree-fork/libnut/-/libnut-4.2.6.tgz", + "integrity": "sha512-2FCiTBokMGrMl4eL/trEIO+mtpkXpdPHoVKdTBmW8UBIbhCbrCKmnXb2skWGfVs+U3q7o5EYDjVTNUYaUWbaxQ==", + "license": "Apache-2.0", + "dependencies": { + "@nut-tree-fork/libnut-darwin": "2.7.5", + "@nut-tree-fork/libnut-linux": "2.7.5", + "@nut-tree-fork/libnut-win32": "2.7.5" + }, + "engines": { + "node": ">=10.15.3" + } + }, + "node_modules/@nut-tree-fork/libnut-darwin": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/@nut-tree-fork/libnut-darwin/-/libnut-darwin-2.7.5.tgz", + "integrity": "sha512-LbqtPtMPTJUcg4XoPP2jsU1wc8flBcGyKTerKsIfK9cD7nBHROnO0QksbrsbSWEpLym8T8fRtuU7XEY83l6Z2Q==", + "cpu": [ + "x64", + "arm64" + ], + "license": "Apache-2.0", + "os": [ + "darwin", + "linux", + "win32" + ], + "dependencies": { + "bindings": "1.5.0" + }, + "engines": { + "node": ">=10.15.3" + }, + "optionalDependencies": { + "@nut-tree-fork/node-mac-permissions": "2.2.1" + } + }, + "node_modules/@nut-tree-fork/libnut-linux": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/@nut-tree-fork/libnut-linux/-/libnut-linux-2.7.5.tgz", + "integrity": "sha512-uxaXEcRKnFObAljsoR6tLOBUU1dJ2sctloG6gFgCBGN7+k6Jdv6jZfOuNjd/fpdq2C5WPMm0rtn9EE7h5J3Jcg==", + "cpu": [ + "x64", + "arm64" + ], + "license": "Apache-2.0", + "os": [ + "darwin", + "linux", + "win32" + ], + "dependencies": { + "bindings": "1.5.0" + }, + "engines": { + "node": ">=10.15.3" + }, + "optionalDependencies": { + "@nut-tree-fork/node-mac-permissions": "2.2.1" + } + }, + "node_modules/@nut-tree-fork/libnut-win32": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/@nut-tree-fork/libnut-win32/-/libnut-win32-2.7.5.tgz", + "integrity": "sha512-yqC87zvmFcDPwFrRU40DYhN0xmEVM3aSkOuyF0IX+y1x+HWSu/i0PNklATpPBhGid3QVb/TOHuVoaraMrUFCNw==", + "cpu": [ + "x64", + "arm64" + ], + "license": "Apache-2.0", + "os": [ + "darwin", + "linux", + "win32" + ], + "dependencies": { + "bindings": "1.5.0" + }, + "engines": { + "node": ">=10.15.3" + }, + "optionalDependencies": { + "@nut-tree-fork/node-mac-permissions": "2.2.1" + } + }, + "node_modules/@nut-tree-fork/node-mac-permissions": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@nut-tree-fork/node-mac-permissions/-/node-mac-permissions-2.2.1.tgz", + "integrity": "sha512-iSfOTDiBZ7VDa17PoQje5rUaZSvSAaq+XEyXCmhPuQwV5XuNU02Grv6oFhsdpz89w7+UvB/8KX/cX5IYQ5o2Bw==", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "1.5.0", + "node-addon-api": "5.0.0" + } + }, + "node_modules/@nut-tree-fork/nut-js": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@nut-tree-fork/nut-js/-/nut-js-4.2.6.tgz", + "integrity": "sha512-aI/WCX7gE1HFGPH3EZP/UWqpNMM1NMoM/EkXqp7pKMgXFCi8e5+o5p+jd/QOYpmALv9bQg7+s69nI7FONbMqDg==", + "cpu": [ + "x64", + "arm64" + ], + "license": "Apache-2.0", + "os": [ + "linux", + "darwin", + "win32" + ], + "dependencies": { + "@nut-tree-fork/default-clipboard-provider": "4.2.6", + "@nut-tree-fork/libnut": "4.2.6", + "@nut-tree-fork/provider-interfaces": "4.2.6", + "@nut-tree-fork/shared": "4.2.6", + "jimp": "0.22.10", + "node-abort-controller": "3.1.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@nut-tree-fork/provider-interfaces": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@nut-tree-fork/provider-interfaces/-/provider-interfaces-4.2.6.tgz", + "integrity": "sha512-brtRegDkLSV0sa5DUAigjWf6hCoamBNPb/hKK9AQlW+j3BxQ/8djaEdEB2cihqUh1ZjEtgPyXRqpCWSdKCX68A==", + "license": "Apache-2.0", + "dependencies": { + "@nut-tree-fork/shared": "4.2.6" + } + }, + "node_modules/@nut-tree-fork/shared": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@nut-tree-fork/shared/-/shared-4.2.6.tgz", + "integrity": "sha512-xZaa0YtJt/DDDq/i1vZkabjq8HOWzfhXieMai61cMbYD11J6VhAfhV23ZtQEM02WG7nc2LKjl4UwRnQCteikwA==", + "license": "Apache-2.0", + "dependencies": { + "jimp": "0.22.10", + "node-abort-controller": "3.1.1" + } + }, + "node_modules/@serialport/binding-mock": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-10.2.2.tgz", + "integrity": "sha512-HAFzGhk9OuFMpuor7aT5G1ChPgn5qSsklTFOTUX72Rl6p0xwcSVsRtG/xaGp6bxpN7fI9D/S8THLBWbBgS6ldw==", + "license": "MIT", + "dependencies": { + "@serialport/bindings-interface": "^1.2.1", + "debug": "^4.3.3" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@serialport/bindings-cpp": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/bindings-cpp/-/bindings-cpp-13.0.0.tgz", + "integrity": "sha512-r25o4Bk/vaO1LyUfY/ulR6hCg/aWiN6Wo2ljVlb4Pj5bqWGcSRC4Vse4a9AcapuAu/FeBzHCbKMvRQeCuKjzIQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@serialport/bindings-interface": "1.2.2", + "@serialport/parser-readline": "12.0.0", + "debug": "4.4.0", + "node-addon-api": "8.3.0", + "node-gyp-build": "4.8.4" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/bindings-cpp/node_modules/@serialport/parser-delimiter": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-12.0.0.tgz", + "integrity": "sha512-gu26tVt5lQoybhorLTPsH2j2LnX3AOP2x/34+DUSTNaUTzu2fBXw+isVjQJpUBFWu6aeQRZw5bJol5X9Gxjblw==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/bindings-cpp/node_modules/@serialport/parser-readline": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-12.0.0.tgz", + "integrity": "sha512-O7cywCWC8PiOMvo/gglEBfAkLjp/SENEML46BXDykfKP5mTPM46XMaX1L0waWU6DXJpBgjaL7+yX6VriVPbN4w==", + "license": "MIT", + "dependencies": { + "@serialport/parser-delimiter": "12.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/bindings-cpp/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@serialport/bindings-cpp/node_modules/node-addon-api": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.0.tgz", + "integrity": "sha512-8VOpLHFrOQlAH+qA0ZzuGRlALRA6/LVh8QJldbrC4DY0hXoMP0l4Acq8TzFC018HztWiRqyCEj2aTWY2UvnJUg==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/@serialport/bindings-interface": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@serialport/bindings-interface/-/bindings-interface-1.2.2.tgz", + "integrity": "sha512-CJaUd5bLvtM9c5dmO9rPBHPXTa9R2UwpkJ0wdh9JCYcbrPWsKz+ErvR0hBLeo7NPeiFdjFO4sonRljiw4d2XiA==", + "license": "MIT", + "engines": { + "node": "^12.22 || ^14.13 || >=16" + } + }, + "node_modules/@serialport/parser-byte-length": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-13.0.0.tgz", + "integrity": "sha512-32yvqeTAqJzAEtX5zCrN1Mej56GJ5h/cVFsCDPbF9S1ZSC9FWjOqNAgtByseHfFTSTs/4ZBQZZcZBpolt8sUng==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-cctalk": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-13.0.0.tgz", + "integrity": "sha512-RErAe57g9gvnlieVYGIn1xymb1bzNXb2QtUQd14FpmbQQYlcrmuRnJwKa1BgTCujoCkhtaTtgHlbBWOxm8U2uA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-delimiter": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-13.0.0.tgz", + "integrity": "sha512-Qqyb0FX1avs3XabQqNaZSivyVbl/yl0jywImp7ePvfZKLwx7jBZjvL+Hawt9wIG6tfq6zbFM24vzCCK7REMUig==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-inter-byte-timeout": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-inter-byte-timeout/-/parser-inter-byte-timeout-13.0.0.tgz", + "integrity": "sha512-a0w0WecTW7bD2YHWrpTz1uyiWA2fDNym0kjmPeNSwZ2XCP+JbirZt31l43m2ey6qXItTYVuQBthm75sPVeHnGA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-packet-length": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-packet-length/-/parser-packet-length-13.0.0.tgz", + "integrity": "sha512-60ZDDIqYRi0Xs2SPZUo4Jr5LLIjtb+rvzPKMJCohrO6tAqSDponcNpcB1O4W21mKTxYjqInSz+eMrtk0LLfZIg==", + "license": "MIT", + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@serialport/parser-readline": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-13.0.0.tgz", + "integrity": "sha512-dov3zYoyf0dt1Sudd1q42VVYQ4WlliF0MYvAMA3MOyiU1IeG4hl0J6buBA2w4gl3DOCC05tGgLDN/3yIL81gsA==", + "license": "MIT", + "dependencies": { + "@serialport/parser-delimiter": "13.0.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-ready": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-13.0.0.tgz", + "integrity": "sha512-JNUQA+y2Rfs4bU+cGYNqOPnNMAcayhhW+XJZihSLQXOHcZsFnOa2F9YtMg9VXRWIcnHldHYtisp62Etjlw24bw==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-regex": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-13.0.0.tgz", + "integrity": "sha512-m7HpIf56G5XcuDdA3DB34Z0pJiwxNRakThEHjSa4mG05OnWYv0IG8l2oUyYfuGMowQWaVnQ+8r+brlPxGVH+eA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-slip-encoder": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-slip-encoder/-/parser-slip-encoder-13.0.0.tgz", + "integrity": "sha512-fUHZEExm6izJ7rg0A1yjXwu4sOzeBkPAjDZPfb+XQoqgtKAk+s+HfICiYn7N2QU9gyaeCO8VKgWwi+b/DowYOg==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-spacepacket": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-spacepacket/-/parser-spacepacket-13.0.0.tgz", + "integrity": "sha512-DoXJ3mFYmyD8X/8931agJvrBPxqTaYDsPoly9/cwQSeh/q4EjQND9ySXBxpWz5WcpyCU4jOuusqCSAPsbB30Eg==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/stream": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-13.0.0.tgz", + "integrity": "sha512-F7xLJKsjGo2WuEWMSEO1SimRcOA+WtWICsY13r0ahx8s2SecPQH06338g28OT7cW7uRXI7oEQAk62qh5gHJW3g==", + "license": "MIT", + "dependencies": { + "@serialport/bindings-interface": "1.2.2", + "debug": "4.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/stream/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", + "license": "MIT" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", + "license": "MIT" + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "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/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/centra": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/centra/-/centra-2.7.0.tgz", + "integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6" + } + }, + "node_modules/clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "license": "MIT", + "dependencies": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "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/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "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/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "license": "MIT", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/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/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/gifwrap": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz", + "integrity": "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==", + "license": "MIT", + "dependencies": { + "image-q": "^4.0.0", + "omggif": "^1.0.10" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.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-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/image-q": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", + "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", + "license": "MIT", + "dependencies": { + "@types/node": "16.9.1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/jimp": { + "version": "0.22.10", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.22.10.tgz", + "integrity": "sha512-lCaHIJAgTOsplyJzC1w/laxSxrbSsEBw4byKwXgUdMmh+ayPsnidTblenQm+IvhIs44Gcuvlb6pd2LQ0wcKaKg==", + "license": "MIT", + "dependencies": { + "@jimp/custom": "^0.22.10", + "@jimp/plugins": "^0.22.10", + "@jimp/types": "^0.22.10", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "license": "BSD-3-Clause" + }, + "node_modules/load-bmfont": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.2.tgz", + "integrity": "sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==", + "license": "MIT", + "dependencies": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^3.7.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/min-document": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.2.tgz", + "integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==", + "license": "MIT", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "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/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "license": "MIT" + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==", + "license": "MIT", + "optional": true + }, + "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-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==", + "license": "MIT" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==", + "license": "MIT" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz", + "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==", + "license": "MIT", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.5.0" + } + }, + "node_modules/parse-headers": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.6.tgz", + "integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/phin": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/phin/-/phin-3.7.1.tgz", + "integrity": "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "dependencies": { + "centra": "^2.7.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==", + "license": "ISC", + "dependencies": { + "pngjs": "^3.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pixelmatch/node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pngjs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "license": "MIT", + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.4.tgz", + "integrity": "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^4.7.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serialport": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/serialport/-/serialport-13.0.0.tgz", + "integrity": "sha512-PHpnTd8isMGPfFTZNCzOZp9m4mAJSNWle9Jxu6BPTcWq7YXl5qN7tp8Sgn0h+WIGcD6JFz5QDgixC2s4VW7vzg==", + "license": "MIT", + "dependencies": { + "@serialport/binding-mock": "10.2.2", + "@serialport/bindings-cpp": "13.0.0", + "@serialport/parser-byte-length": "13.0.0", + "@serialport/parser-cctalk": "13.0.0", + "@serialport/parser-delimiter": "13.0.0", + "@serialport/parser-inter-byte-timeout": "13.0.0", + "@serialport/parser-packet-length": "13.0.0", + "@serialport/parser-readline": "13.0.0", + "@serialport/parser-ready": "13.0.0", + "@serialport/parser-regex": "13.0.0", + "@serialport/parser-slip-encoder": "13.0.0", + "@serialport/parser-spacepacket": "13.0.0", + "@serialport/stream": "13.0.0", + "debug": "4.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/serialport/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/systeminformation": { + "version": "5.31.7", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.7.tgz", + "integrity": "sha512-/8NC53e5nP9nmhn42/ncdOkyJnOoue/Vy+tJOyUGd1Yv66G069wK4rrziwhrqDETgk78CudTQupw5z19S5uoZw==", + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, + "node_modules/timm": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", + "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==", + "license": "MIT" + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utif2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/utif2/-/utif2-4.1.0.tgz", + "integrity": "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w==", + "license": "MIT", + "dependencies": { + "pako": "^1.0.11" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "license": "MIT", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==", + "license": "MIT" + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..aa6b958 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "sfmacro-client", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "dependencies": { + "@nut-tree-fork/nut-js": "^4.2.6", + "cors": "^2.8.6", + "express": "^5.2.1", + "serialport": "^13.0.0", + "systeminformation": "^5.31.7" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..0485687 --- /dev/null +++ b/server.js @@ -0,0 +1,294 @@ +const { SerialPort } = require('serialport'); +const { ReadlineParser } = require('@serialport/parser-readline'); +const { keyboard, Key } = require('@nut-tree-fork/nut-js'); +const express = require('express'); +const cors = require('cors'); +const fs = require('fs'); +const path = require('path'); +const { exec } = require('child_process'); +const si = require('systeminformation'); + +const app = express(); +app.use(cors()); +app.use(express.json()); +app.use(express.static(path.join(__dirname, 'ui', 'dist'))); + +const CONFIG_FILE = path.join(__dirname, 'config.json'); + +const sseClients = []; + +// Default configuration structure +let config = { + portPath: "auto", + buttons: {} +}; + +// Initialize 16 default buttons if empty +for(let i=0; i<16; i++) { + config.buttons[i] = { + actionType: "none", // "key", "cmd", "none" + key: "", + cmd: "", + color: { r: 0, g: 0, b: 50 }, // Dim blue + pressedColor: { r: 255, g: 0, b: 0 } // Red + }; +} + +if (fs.existsSync(CONFIG_FILE)) { + try { + const savedConfig = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8')); + config = { ...config, ...savedConfig }; + } catch (e) { + console.error("Failed to parse config.json, resetting to default config.", e); + } +} + +function saveConfig() { + fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2)); +} + +let serialPort = null; +let parser = null; +let reconnectTimeout = null; +let isConnecting = false; + +function normalizeKeyName(name) { + const mapping = { + 'ctrl': 'LeftControl', + 'control': 'LeftControl', + 'leftcontrol': 'LeftControl', + 'rightcontrol': 'RightControl', + 'shift': 'LeftShift', + 'leftshift': 'LeftShift', + 'rightshift': 'RightShift', + 'alt': 'LeftAlt', + 'leftalt': 'LeftAlt', + 'rightalt': 'RightAlt', + 'win': 'LeftSuper', + 'super': 'LeftSuper', + 'cmd': 'LeftSuper', + 'command': 'LeftSuper', + 'leftsuper': 'LeftSuper', + 'rightsuper': 'RightSuper', + 'enter': 'Enter', + 'escape': 'Escape', + 'space': 'Space', + 'tab': 'Tab', + 'backspace': 'Backspace', + 'delete': 'Delete', + 'up': 'Up', + 'down': 'Down', + 'left': 'Left', + 'right': 'Right' + }; + const norm = name.trim().toLowerCase(); + if (mapping[norm]) return mapping[norm]; + + if (norm.length === 1) return norm.toUpperCase(); + + if (/^f\d+$/.test(norm)) { + return 'F' + norm.substring(1); + } + + return name.trim().charAt(0).toUpperCase() + name.trim().slice(1); +} + +async function connectToPico() { + if (isConnecting) return; + isConnecting = true; + + if (reconnectTimeout) { + clearTimeout(reconnectTimeout); + reconnectTimeout = null; + } + + let portPath = config.portPath; + + if (portPath === "auto") { + try { + const ports = await SerialPort.list(); + // The Pico's Vendor ID is 2E8A. The Arduino core PID for USB Serial is 0005 (or similar depending on stack) + const picoPort = ports.find(p => p.vendorId && p.vendorId.toUpperCase() === '2E8A'); + if (picoPort) { + portPath = picoPort.path; + console.log(`Found Raspberry Pi Pico on ${portPath}`); + } else { + console.log("Could not auto-detect Raspberry Pi Pico. Retrying in 5 seconds..."); + isConnecting = false; + scheduleReconnect(); + return; + } + } catch(e) { + console.error(e); + isConnecting = false; + scheduleReconnect(); + return; + } + } + + if (serialPort && serialPort.isOpen) { + serialPort.removeAllListeners('close'); + serialPort.close(); + } + + serialPort = new SerialPort({ path: portPath, baudRate: 115200 }, (err) => { + isConnecting = false; + if (err) { + console.log('Error opening port: ', err.message); + scheduleReconnect(); + return; + } + console.log("Connected to Pico!"); + + // Sync all LEDs to their idle states + setTimeout(() => { + for(let i=0; i<16; i++) { + setLedColor(i, config.buttons[i].color.r, config.buttons[i].color.g, config.buttons[i].color.b); + } + }, 1000); + }); + + parser = serialPort.pipe(new ReadlineParser({ delimiter: '\n' })); + + parser.on('data', async (line) => { + line = line.trim(); + if (line.startsWith("P,")) { + const id = parseInt(line.split(',')[1]); + console.log(`[EVENT] Button ${id} Pressed`); + sseClients.forEach(c => c.write(`data: ${JSON.stringify({ type: 'press', id })}\n\n`)); + setLedColor(id, config.buttons[id].pressedColor.r, config.buttons[id].pressedColor.g, config.buttons[id].pressedColor.b); + + // Execute Macro + const btn = config.buttons[id]; + if (btn.actionType === "key" && btn.key) { + try { + const parts = btn.key.split('+').map(p => p.trim()); + const keysToPress = []; + let isCombo = true; + + for (const p of parts) { + const normalized = normalizeKeyName(p); + if (Key[normalized] !== undefined) { + keysToPress.push(Key[normalized]); + } else { + isCombo = false; + break; + } + } + + if (isCombo && keysToPress.length > 0) { + await keyboard.type(...keysToPress); + } else { + // If it's not a recognizable combo of Key properties, type it out as a raw string + await keyboard.type(btn.key); + } + } catch(e) { console.error("Key Error", e); } + } else if (btn.actionType === "cmd" && btn.cmd) { + console.log(`Executing: ${btn.cmd}`); + exec(btn.cmd, (error, stdout, stderr) => { + if (error) { + console.error(`exec error: ${error}`); + return; + } + }); + } else if (btn.actionType === "mute_app" && btn.cmd) { + console.log(`Toggling mute for: ${btn.cmd}`); + const svvPath = path.join(__dirname, 'SoundVolumeView.exe'); + exec(`"${svvPath}" /Switch "${btn.cmd}"`, (error, stdout, stderr) => { + if (error) console.error(`Mute error: ${error}\n${stderr}`); + }); + } + + } else if (line.startsWith("R,")) { + const id = parseInt(line.split(',')[1]); + console.log(`[EVENT] Button ${id} Released`); + sseClients.forEach(c => c.write(`data: ${JSON.stringify({ type: 'release', id })}\n\n`)); + if (config.buttons[id].actionType !== "cpu_monitor") { + setLedColor(id, config.buttons[id].color.r, config.buttons[id].color.g, config.buttons[id].color.b); + } + } + }); + + serialPort.on('close', () => { + console.log("Port closed, reconnecting in 5s..."); + scheduleReconnect(); + }); +} + +function scheduleReconnect() { + if (!reconnectTimeout) { + reconnectTimeout = setTimeout(() => { + isConnecting = false; + connectToPico(); + }, 5000); + } +} + +function setLedColor(id, r, g, b) { + if (serialPort && serialPort.isOpen) { + serialPort.write(`C,${id},${r},${g},${b}\n`); + } +} + +// REST API for Frontend Configuration UI +app.get('/api/events', (req, res) => { + res.setHeader('Content-Type', 'text/event-stream'); + res.setHeader('Cache-Control', 'no-cache'); + res.setHeader('Connection', 'keep-alive'); + res.flushHeaders(); + + sseClients.push(res); + + req.on('close', () => { + const index = sseClients.indexOf(res); + if (index !== -1) sseClients.splice(index, 1); + }); +}); + +app.get('/api/config', (req, res) => { + res.json(config); +}); + +app.post('/api/config', (req, res) => { + config = req.body; + saveConfig(); + res.json({ success: true }); + // Update colors immediately on the device + for(let i=0; i<16; i++) { + if (config.buttons[i].actionType !== "cpu_monitor") { + setLedColor(i, config.buttons[i].color.r, config.buttons[i].color.g, config.buttons[i].color.b); + } + } +}); + +// CPU Polling Loop +setInterval(async () => { + try { + const hasCpuMonitor = Object.values(config.buttons).some(b => b.actionType === "cpu_monitor"); + if (!hasCpuMonitor) return; + + const load = await si.currentLoad(); + const cpu = load.currentLoad; // 0 to 100 + + let r=0, g=0, b=0; + if (cpu < 30) { g = 150; } // Green + else if (cpu < 60) { r = 150; g = 150; } // Yellow + else if (cpu < 85) { r = 200; g = 50; } // Orange + else { r = 255; } // Red + + for(let i=0; i<16; i++) { + if (config.buttons[i].actionType === "cpu_monitor") { + setLedColor(i, r, g, b); + } + } + } catch (e) { + console.error("CPU Poll Error", e); + } +}, 1000); + +app.listen(3001, () => { + console.log("-----------------------------------------"); + console.log("Macropad Server listening on port 3001"); + console.log("-----------------------------------------"); + connectToPico(); +}); diff --git a/ui/.gitignore b/ui/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/ui/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/ui/README.md b/ui/README.md new file mode 100644 index 0000000..a36934d --- /dev/null +++ b/ui/README.md @@ -0,0 +1,16 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/ui/eslint.config.js b/ui/eslint.config.js new file mode 100644 index 0000000..ea36dd3 --- /dev/null +++ b/ui/eslint.config.js @@ -0,0 +1,21 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + globals: globals.browser, + parserOptions: { ecmaFeatures: { jsx: true } }, + }, + }, +]) diff --git a/ui/index.html b/ui/index.html new file mode 100644 index 0000000..8d26686 --- /dev/null +++ b/ui/index.html @@ -0,0 +1,13 @@ + + + + + + + Macropad Control Center + + +
+ + + diff --git a/ui/package-lock.json b/ui/package-lock.json new file mode 100644 index 0000000..e53283d --- /dev/null +++ b/ui/package-lock.json @@ -0,0 +1,2774 @@ +{ + "name": "ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ui", + "version": "0.0.0", + "dependencies": { + "axios": "^1.18.0", + "lucide-react": "^1.21.0", + "react": "^19.2.6", + "react-dom": "^19.2.6" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.3.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "vite": "^8.0.12" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "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/@vitejs/plugin-react": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/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/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/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/axios": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz", + "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==", + "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/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.38", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", + "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "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-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/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "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.376", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.376.tgz", + "integrity": "sha512-cUVA7/RvbFTEuw/i3obUwDTRIXojaxkResf+ibByPFxjc6XK3VNtcQXV0NSbAlJ0FMjcJGgftVVB4Qo184EXvA==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.5.0.tgz", + "integrity": "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.3.tgz", + "integrity": "sha512-5EMmLCV98Pi4o/f/3DP/v/tNqLHMIc9I8LKClNDWhZ9JTho89/kQcitCXQBMG7sAfVRK0Ie3T2EDOzp1YXYiVA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/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/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "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/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/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/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/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-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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.21.0.tgz", + "integrity": "sha512-reEZMXq8Qdd5jg5XYkQ5TR1fB/GiQ7ih4vcrthYDtgjSDwh0i6/YLiGjsWsIwgN49gpAnd4J2elSNzncMEEUUQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "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/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/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/nanoid": { + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.13.tgz", + "integrity": "sha512-sPdqC6ByMVVGvF1ynvvMo0/o+oD1VX7DaHhijt1bFgjvBkHBib4t49GoNDhf2NDta4oeUNlaGbSt5K7qjZ955Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.48", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz", + "integrity": "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "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": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "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/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000..09dc5c2 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,29 @@ +{ + "name": "ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "axios": "^1.18.0", + "lucide-react": "^1.21.0", + "react": "^19.2.6", + "react-dom": "^19.2.6" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.3.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "vite": "^8.0.12" + } +} diff --git a/ui/public/favicon.svg b/ui/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/ui/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/public/icons.svg b/ui/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/ui/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/src/App.css b/ui/src/App.css new file mode 100644 index 0000000..a6eec4e --- /dev/null +++ b/ui/src/App.css @@ -0,0 +1,297 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;800&display=swap'); + +* { + box-sizing: border-box; +} + +body { + margin: 0; + font-family: 'Inter', sans-serif; + background: radial-gradient(circle at bottom right, #111827, #0f172a, #000000); + color: #fff; + min-height: 100vh; +} + +.app-container { + max-width: 1000px; + margin: 0 auto; + padding: 40px 20px; +} + +header h1 { + font-size: 3rem; + background: linear-gradient(135deg, #3b82f6, #8b5cf6, #ec4899); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + margin-bottom: 5px; + line-height: 1.2; + padding-bottom: 5px; +} + +header p { + color: #94a3b8; + font-size: 1.2rem; + margin-top: 0; + margin-bottom: 40px; +} + +main { + display: flex; + gap: 40px; + align-items: flex-start; +} + +.pad-preview { + background: rgba(255, 255, 255, 0.05); + backdrop-filter: blur(20px); + padding: 40px; + border-radius: 20px; + border: 1px solid rgba(255,255,255,0.1); + box-shadow: 0 25px 50px -12px rgba(0,0,0,0.5); + flex: 1; +} + +.grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 15px; +} + +.key-btn { + background: rgba(0,0,0,0.3); + aspect-ratio: 1; + border-radius: 12px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + cursor: pointer; + border: 2px solid transparent; + transition: all 0.2s; + position: relative; + overflow: hidden; +} + +.key-btn::before { + content: ''; + position: absolute; + top: 0; left: 0; right: 0; bottom: 0; + background: linear-gradient(180deg, rgba(255,255,255,0.1), transparent); + pointer-events: none; +} + +.key-btn:hover { + transform: translateY(-2px); + background: rgba(255,255,255,0.1); +} + +.key-btn.selected { + transform: scale(1.05); + background: rgba(255,255,255,0.15); +} + +.key-btn.physically-pressed { + transform: scale(0.95); + background: rgba(255,255,255,0.3); +} + +.key-id { + font-size: 0.8rem; + color: rgba(255,255,255,0.3); + position: absolute; + top: 8px; + left: 8px; +} + +.key-action { + font-weight: 600; + font-size: 1rem; +} + +.save-btn { + margin-top: 30px; + width: 100%; + padding: 15px; + border-radius: 10px; + border: none; + background: linear-gradient(135deg, #3b82f6, #8b5cf6); + color: white; + font-weight: bold; + font-size: 1.1rem; + cursor: pointer; + box-shadow: 0 10px 20px rgba(139, 92, 246, 0.3); + transition: all 0.2s; +} + +.save-btn:hover { + transform: translateY(-2px); + box-shadow: 0 15px 25px rgba(139, 92, 246, 0.5); +} + +.editor-panel { + flex: 1; + background: rgba(15, 23, 42, 0.7); + backdrop-filter: blur(20px); + padding: 30px; + border-radius: 20px; + border: 1px solid rgba(255,255,255,0.05); +} + +.form-group { + margin-bottom: 25px; +} + +label { + display: block; + margin-bottom: 10px; + color: #94a3b8; + font-size: 0.9rem; + text-transform: uppercase; + letter-spacing: 1px; +} + +input, select { + width: 100%; + background: rgba(0,0,0,0.5); + border: 1px solid rgba(255,255,255,0.1); + padding: 12px; + border-radius: 8px; + color: white; + font-size: 1rem; + outline: none; + transition: all 0.2s; +} + +input:focus, select:focus { + border-color: #8b5cf6; +} + +/* Color Pickers Layout */ +.color-pickers { + display: flex; + gap: 20px; +} + +.color-picker-item { + flex: 1; +} + +.color-input-wrapper { + display: flex; + align-items: center; + gap: 12px; + background: rgba(0,0,0,0.4); + padding: 8px 12px; + border-radius: 8px; + border: 1px solid rgba(255,255,255,0.1); +} + +.color-input-wrapper input[type="color"] { + -webkit-appearance: none; + border: none; + width: 32px; + height: 32px; + border-radius: 50%; + cursor: pointer; + background: none; + padding: 0; +} + +.color-input-wrapper input[type="color"]::-webkit-color-swatch-wrapper { + padding: 0; +} + +.color-input-wrapper input[type="color"]::-webkit-color-swatch { + border: 2px solid rgba(255,255,255,0.2); + border-radius: 50%; + padding: 0; +} + +.hex-label { + font-family: monospace; + font-size: 0.95rem; + color: #e2e8f0; +} + +/* Key Recorder */ +.recorder-group { + display: flex; + gap: 10px; +} + +.record-btn { + background: linear-gradient(135deg, #4f46e5, #3b82f6); + color: white; + border: none; + padding: 0 20px; + border-radius: 8px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; + white-space: nowrap; +} + +.record-btn:hover { + filter: brightness(1.1); + transform: translateY(-1px); +} + +.record-btn.recording { + background: linear-gradient(135deg, #ef4444, #dc2626); + animation: pulse-red 1.5s infinite; +} + +.recorder-tip { + display: block; + font-size: 0.8rem; + color: #a855f7; + margin-top: 8px; +} + +@keyframes pulse-red { + 0% { + box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.7); + } + 70% { + box-shadow: 0 0 0 10px rgba(239, 68, 68, 0); + } + 100% { + box-shadow: 0 0 0 0 rgba(239, 68, 68, 0); + } +} + +/* Toast Notification */ +.toast-container { + position: fixed; + bottom: 30px; + right: 30px; + background: rgba(15, 23, 42, 0.9); + backdrop-filter: blur(10px); + border-left: 4px solid #10b981; + color: white; + padding: 15px 25px; + border-radius: 8px; + box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.5); + animation: slide-in 0.3s ease-out; + z-index: 1000; +} + +.toast-container.error { + border-left-color: #ef4444; +} + +.toast-message { + font-weight: 600; + font-size: 0.95rem; +} + +@keyframes slide-in { + from { + transform: translateY(20px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} diff --git a/ui/src/App.jsx b/ui/src/App.jsx new file mode 100644 index 0000000..fc6a385 --- /dev/null +++ b/ui/src/App.jsx @@ -0,0 +1,277 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import './App.css'; + +// Hex to RGB +const hexToRgb = (hex) => { + const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : { r: 0, g: 0, b: 0 }; +}; + +// RGB to Hex +const rgbToHex = (color) => { + if (!color) return "#000000"; + const { r, g, b } = color; + const toHex = (c) => { + const hex = Math.max(0, Math.min(255, c)).toString(16); + return hex.length === 1 ? "0" + hex : hex; + }; + return `#${toHex(r)}${toHex(g)}${toHex(b)}`; +}; + +function App() { + const [config, setConfig] = useState(null); + const [selectedBtn, setSelectedBtn] = useState(null); + const [pressedBtns, setPressedBtns] = useState(new Set()); + const [toast, setToast] = useState({ show: false, message: '', type: 'success' }); + const [isRecording, setIsRecording] = useState(false); + + useEffect(() => { + axios.get('/api/config').then(res => { + setConfig(res.data); + }).catch(err => { + console.error("Could not fetch config from server.", err); + showToast("Could not connect to Macropad server", "error"); + }); + + const evtSource = new EventSource('/api/events'); + evtSource.onmessage = (event) => { + const data = JSON.parse(event.data); + if (data.type === 'press') { + setPressedBtns(prev => new Set(prev).add(data.id.toString())); + } else if (data.type === 'release') { + setPressedBtns(prev => { + const next = new Set(prev); + next.delete(data.id.toString()); + return next; + }); + } + }; + + return () => evtSource.close(); + }, []); + + useEffect(() => { + if (!isRecording || !selectedBtn) return; + + const handleKeyDown = (e) => { + e.preventDefault(); + e.stopPropagation(); + + if (e.key === 'Escape') { + setIsRecording(false); + return; + } + + const activeKeys = []; + if (e.ctrlKey) activeKeys.push("LeftControl"); + if (e.shiftKey) activeKeys.push("LeftShift"); + if (e.altKey) activeKeys.push("LeftAlt"); + if (e.metaKey) activeKeys.push("LeftSuper"); + + let keyName = e.key; + if (keyName === 'Control' || keyName === 'Shift' || keyName === 'Alt' || keyName === 'Meta') { + // Only show modifiers so far + } else { + const keyMappings = { + ' ': 'Space', + 'ArrowUp': 'Up', + 'ArrowDown': 'Down', + 'ArrowLeft': 'Left', + 'ArrowRight': 'Right', + }; + if (keyMappings[keyName]) { + keyName = keyMappings[keyName]; + } else if (keyName.length === 1) { + keyName = keyName.toUpperCase(); + } + activeKeys.push(keyName); + } + + if (activeKeys.length > 0) { + const combo = activeKeys.join(' + '); + const newConfig = { ...config }; + newConfig.buttons[selectedBtn].key = combo; + setConfig(newConfig); + + if (e.key !== 'Control' && e.key !== 'Shift' && e.key !== 'Alt' && e.key !== 'Meta') { + setIsRecording(false); + } + } + }; + + window.addEventListener('keydown', handleKeyDown, true); + return () => window.removeEventListener('keydown', handleKeyDown, true); + }, [isRecording, selectedBtn, config]); + + const showToast = (msg, type = 'success') => { + setToast({ show: true, message: msg, type }); + setTimeout(() => setToast(prev => ({ ...prev, show: false })), 4000); + }; + + const handleSave = () => { + axios.post('/api/config', config) + .then(res => { + showToast("Configuration saved & applied successfully!"); + }) + .catch(err => { + showToast("Failed to save configuration.", "error"); + console.error(err); + }); + }; + + if (!config) return
Loading configuration...
; + + return ( +
+
+

Macropad Control Center

+

Your ultimate companion app for the Pico RGB Keypad

+
+ +
+
+
+ {Object.keys(config.buttons).map((id) => { + const btn = config.buttons[id]; + const isSelected = selectedBtn === id; + const isPressed = pressedBtns.has(id); + return ( +
{ + setSelectedBtn(id); + setIsRecording(false); + }} + > + {parseInt(id) + 1} + {btn.actionType === 'none' ? '' : (btn.actionType === 'key' ? btn.key : (btn.actionType === 'cpu_monitor' ? 'CPU' : 'CMD'))} +
+ ); + })} +
+ +
+ + {selectedBtn && ( +
+

Edit Button {parseInt(selectedBtn) + 1}

+ +
+ + +
+ + {config.buttons[selectedBtn].actionType === 'key' && ( +
+ +
+ { + const newConfig = {...config}; + newConfig.buttons[selectedBtn].key = e.target.value; + setConfig(newConfig); + }} + disabled={isRecording} + /> + +
+ {isRecording && Press keys on your keyboard. Press ESC to cancel.} +
+ )} + + {(config.buttons[selectedBtn].actionType === 'cmd' || config.buttons[selectedBtn].actionType === 'mute_app') && ( +
+ + { + const newConfig = {...config}; + newConfig.buttons[selectedBtn].cmd = e.target.value; + setConfig(newConfig); + }} + /> +
+ )} + +
+
+ +
+ { + const rgb = hexToRgb(e.target.value); + const newConfig = {...config}; + newConfig.buttons[selectedBtn].color = rgb; + setConfig(newConfig); + }} + /> + {rgbToHex(config.buttons[selectedBtn].color).toUpperCase()} +
+
+
+ +
+ { + const rgb = hexToRgb(e.target.value); + const newConfig = {...config}; + newConfig.buttons[selectedBtn].pressedColor = rgb; + setConfig(newConfig); + }} + /> + {rgbToHex(config.buttons[selectedBtn].pressedColor).toUpperCase()} +
+
+
+ +
+ )} +
+ + {toast.show && ( +
+
{toast.message}
+
+ )} +
+ ); +} + +export default App; diff --git a/ui/src/assets/hero.png b/ui/src/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..02251f4b956c55af2d76fd0788124d7eee2b45eb GIT binary patch literal 13057 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 P00000NkvXXu0mjft=yBf literal 0 HcmV?d00001 diff --git a/ui/src/assets/react.svg b/ui/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/ui/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/src/assets/vite.svg b/ui/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/ui/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/ui/src/index.css b/ui/src/index.css new file mode 100644 index 0000000..5d41a8a --- /dev/null +++ b/ui/src/index.css @@ -0,0 +1,105 @@ +:root { + --text: #6b6375; + --text-h: #08060d; + --bg: #fff; + --border: #e5e4e7; + --code-bg: #f4f3ec; + --accent: #aa3bff; + --accent-bg: rgba(170, 59, 255, 0.1); + --accent-border: rgba(170, 59, 255, 0.5); + --social-bg: rgba(244, 243, 236, 0.5); + --shadow: + rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; + + --sans: system-ui, 'Segoe UI', Roboto, sans-serif; + --heading: system-ui, 'Segoe UI', Roboto, sans-serif; + --mono: ui-monospace, Consolas, monospace; + + font: 18px/145% var(--sans); + letter-spacing: 0.18px; + color-scheme: light dark; + color: var(--text); + background: var(--bg); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + @media (max-width: 1024px) { + font-size: 16px; + } +} + +@media (prefers-color-scheme: dark) { + :root { + --text: #9ca3af; + --text-h: #f3f4f6; + --bg: #16171d; + --border: #2e303a; + --code-bg: #1f2028; + --accent: #c084fc; + --accent-bg: rgba(192, 132, 252, 0.15); + --accent-border: rgba(192, 132, 252, 0.5); + --social-bg: rgba(47, 48, 58, 0.5); + --shadow: + rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px; + } + + #social .button-icon { + filter: invert(1) brightness(2); + } +} + +body { + margin: 0; +} + +#root { + width: 100%; + margin: 0 auto; + box-sizing: border-box; +} + +h1, +h2 { + font-family: var(--heading); + font-weight: 500; + color: var(--text-h); +} + +h1 { + font-size: 56px; + letter-spacing: -1.68px; + margin: 32px 0; + @media (max-width: 1024px) { + font-size: 36px; + margin: 20px 0; + } +} +h2 { + font-size: 24px; + line-height: 118%; + letter-spacing: -0.24px; + margin: 0 0 8px; + @media (max-width: 1024px) { + font-size: 20px; + } +} +p { + margin: 0; +} + +code, +.counter { + font-family: var(--mono); + display: inline-flex; + border-radius: 4px; + color: var(--text-h); +} + +code { + font-size: 15px; + line-height: 135%; + padding: 4px 8px; + background: var(--code-bg); +} diff --git a/ui/src/main.jsx b/ui/src/main.jsx new file mode 100644 index 0000000..b9a1a6d --- /dev/null +++ b/ui/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/ui/vite.config.js b/ui/vite.config.js new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/ui/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +})