Merge branch 'develop' into client-refactor
authorAdam Dullage <redacted>
Fri, 17 May 2024 18:03:58 +0000 (19:03 +0100)
committerAdam Dullage <redacted>
Fri, 17 May 2024 18:03:58 +0000 (19:03 +0100)
# Conflicts:
# package-lock.json
# package.json
# server/notes/file_system/file_system.py

1  2 
package-lock.json
package.json
server/notes/file_system/file_system.py

index a1623291b5713e500dd60c878523b43002082a85,b8f8e019e7ec5a1801839eecfe4298b8c587c6c7..dc0b2e25d377b6dcabff4fa0a6eef3721a6eaa83
 -{
 -  "name": "flatnotes",
 -  "version": "4.0.5",
 -  "lockfileVersion": 3,
 -  "requires": true,
 -  "packages": {
 -    "": {
 -      "name": "flatnotes",
 -      "version": "4.0.5",
 -      "license": "MIT",
 -      "devDependencies": {
 -        "@toast-ui/editor-plugin-code-syntax-highlight": "3.1.0",
 -        "@toast-ui/vue-editor": "3.2.3",
 -        "@vitejs/plugin-vue2": "^2.3.1",
 -        "axios": "1.6.8",
 -        "bootstrap-vue": "2.23.1",
 -        "mousetrap": "1.6.5",
 -        "vite": "^5.2.9"
 -      }
 -    },
 -    "node_modules/@babel/parser": {
 -      "version": "7.20.15",
 -      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz",
 -      "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==",
 -      "dev": true,
 -      "peer": true,
 -      "bin": {
 -        "parser": "bin/babel-parser.js"
 -      },
 -      "engines": {
 -        "node": ">=6.0.0"
 -      }
 -    },
 -    "node_modules/@esbuild/aix-ppc64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
 -      "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
 -      "cpu": [
 -        "ppc64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "aix"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/android-arm": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
 -      "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
 -      "cpu": [
 -        "arm"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "android"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/android-arm64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
 -      "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
 -      "cpu": [
 -        "arm64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "android"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/android-x64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
 -      "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "android"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/darwin-arm64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
 -      "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
 -      "cpu": [
 -        "arm64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "darwin"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/darwin-x64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
 -      "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "darwin"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/freebsd-arm64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
 -      "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
 -      "cpu": [
 -        "arm64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "freebsd"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/freebsd-x64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
 -      "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "freebsd"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/linux-arm": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
 -      "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
 -      "cpu": [
 -        "arm"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/linux-arm64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
 -      "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
 -      "cpu": [
 -        "arm64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/linux-ia32": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
 -      "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
 -      "cpu": [
 -        "ia32"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/linux-loong64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
 -      "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
 -      "cpu": [
 -        "loong64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/linux-mips64el": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
 -      "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
 -      "cpu": [
 -        "mips64el"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/linux-ppc64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
 -      "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
 -      "cpu": [
 -        "ppc64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/linux-riscv64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
 -      "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
 -      "cpu": [
 -        "riscv64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/linux-s390x": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
 -      "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
 -      "cpu": [
 -        "s390x"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/linux-x64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
 -      "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/netbsd-x64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
 -      "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "netbsd"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/openbsd-x64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
 -      "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "openbsd"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/sunos-x64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
 -      "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "sunos"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/win32-arm64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
 -      "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
 -      "cpu": [
 -        "arm64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "win32"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/win32-ia32": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
 -      "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
 -      "cpu": [
 -        "ia32"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "win32"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@esbuild/win32-x64": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
 -      "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "win32"
 -      ],
 -      "engines": {
 -        "node": ">=12"
 -      }
 -    },
 -    "node_modules/@jridgewell/resolve-uri": {
 -      "version": "3.1.0",
 -      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
 -      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "engines": {
 -        "node": ">=6.0.0"
 -      }
 -    },
 -    "node_modules/@jridgewell/set-array": {
 -      "version": "1.2.1",
 -      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
 -      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "engines": {
 -        "node": ">=6.0.0"
 -      }
 -    },
 -    "node_modules/@jridgewell/source-map": {
 -      "version": "0.3.6",
 -      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
 -      "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "@jridgewell/gen-mapping": "^0.3.5",
 -        "@jridgewell/trace-mapping": "^0.3.25"
 -      }
 -    },
 -    "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": {
 -      "version": "0.3.5",
 -      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
 -      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "@jridgewell/set-array": "^1.2.1",
 -        "@jridgewell/sourcemap-codec": "^1.4.10",
 -        "@jridgewell/trace-mapping": "^0.3.24"
 -      },
 -      "engines": {
 -        "node": ">=6.0.0"
 -      }
 -    },
 -    "node_modules/@jridgewell/sourcemap-codec": {
 -      "version": "1.4.14",
 -      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
 -      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true
 -    },
 -    "node_modules/@jridgewell/trace-mapping": {
 -      "version": "0.3.25",
 -      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
 -      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "@jridgewell/resolve-uri": "^3.1.0",
 -        "@jridgewell/sourcemap-codec": "^1.4.14"
 -      }
 -    },
 -    "node_modules/@nuxt/opencollective": {
 -      "version": "0.3.3",
 -      "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.3.3.tgz",
 -      "integrity": "sha512-6IKCd+gP0HliixqZT/p8nW3tucD6Sv/u/eR2A9X4rxT/6hXlMzA4GZQzq4d2qnBAwSwGpmKyzkyTjNjrhaA25A==",
 -      "dev": true,
 -      "dependencies": {
 -        "chalk": "^4.1.0",
 -        "consola": "^2.15.0",
 -        "node-fetch": "^2.6.7"
 -      },
 -      "bin": {
 -        "opencollective": "bin/opencollective.js"
 -      },
 -      "engines": {
 -        "node": ">=8.0.0",
 -        "npm": ">=5.0.0"
 -      }
 -    },
 -    "node_modules/@rollup/rollup-android-arm-eabi": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz",
 -      "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==",
 -      "cpu": [
 -        "arm"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "android"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-android-arm64": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz",
 -      "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==",
 -      "cpu": [
 -        "arm64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "android"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-darwin-arm64": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz",
 -      "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==",
 -      "cpu": [
 -        "arm64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "darwin"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-darwin-x64": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz",
 -      "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "darwin"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz",
 -      "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==",
 -      "cpu": [
 -        "arm"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz",
 -      "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==",
 -      "cpu": [
 -        "arm"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-linux-arm64-gnu": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz",
 -      "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==",
 -      "cpu": [
 -        "arm64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-linux-arm64-musl": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz",
 -      "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==",
 -      "cpu": [
 -        "arm64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz",
 -      "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==",
 -      "cpu": [
 -        "ppc64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz",
 -      "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==",
 -      "cpu": [
 -        "riscv64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-linux-s390x-gnu": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz",
 -      "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==",
 -      "cpu": [
 -        "s390x"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-linux-x64-gnu": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz",
 -      "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-linux-x64-musl": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz",
 -      "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "linux"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-win32-arm64-msvc": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz",
 -      "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==",
 -      "cpu": [
 -        "arm64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "win32"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-win32-ia32-msvc": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz",
 -      "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==",
 -      "cpu": [
 -        "ia32"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "win32"
 -      ]
 -    },
 -    "node_modules/@rollup/rollup-win32-x64-msvc": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz",
 -      "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==",
 -      "cpu": [
 -        "x64"
 -      ],
 -      "dev": true,
 -      "optional": true,
 -      "os": [
 -        "win32"
 -      ]
 -    },
 -    "node_modules/@toast-ui/editor": {
 -      "version": "3.2.2",
 -      "resolved": "https://registry.npmjs.org/@toast-ui/editor/-/editor-3.2.2.tgz",
 -      "integrity": "sha512-ASX7LFjN2ZYQJrwmkUajPs7DRr9FsM1+RQ82CfTO0Y5ZXorBk1VZS4C2Dpxinx9kl55V4F8/A2h2QF4QMDtRbA==",
 -      "dev": true,
 -      "dependencies": {
 -        "dompurify": "^2.3.3",
 -        "prosemirror-commands": "^1.1.9",
 -        "prosemirror-history": "^1.1.3",
 -        "prosemirror-inputrules": "^1.1.3",
 -        "prosemirror-keymap": "^1.1.4",
 -        "prosemirror-model": "^1.14.1",
 -        "prosemirror-state": "^1.3.4",
 -        "prosemirror-view": "^1.18.7"
 -      }
 -    },
 -    "node_modules/@toast-ui/editor-plugin-code-syntax-highlight": {
 -      "version": "3.1.0",
 -      "resolved": "https://registry.npmjs.org/@toast-ui/editor-plugin-code-syntax-highlight/-/editor-plugin-code-syntax-highlight-3.1.0.tgz",
 -      "integrity": "sha512-OgX5pZiTnHREoTTXDAFu1k6RzEspGOxeJNRlt/Lnoi1GvLbIpUTTbBcls9becpXT/Qdls++8G3r5C60cVdellA==",
 -      "dev": true,
 -      "dependencies": {
 -        "prismjs": "^1.23.0"
 -      }
 -    },
 -    "node_modules/@toast-ui/vue-editor": {
 -      "version": "3.2.3",
 -      "resolved": "https://registry.npmjs.org/@toast-ui/vue-editor/-/vue-editor-3.2.3.tgz",
 -      "integrity": "sha512-IjoV5tBh/yesIuqRqmOQx1+F0oeeAbIeBA7edMTawIXHQXBeJ1qzGHLTY5NWrUQ6BBtV8CDBeedjnVsJ+mHjKQ==",
 -      "dev": true,
 -      "dependencies": {
 -        "@toast-ui/editor": "^3.2.2"
 -      },
 -      "peerDependencies": {
 -        "vue": "^2.5.0"
 -      }
 -    },
 -    "node_modules/@types/estree": {
 -      "version": "1.0.5",
 -      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
 -      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
 -      "dev": true
 -    },
 -    "node_modules/@vitejs/plugin-vue2": {
 -      "version": "2.3.1",
 -      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue2/-/plugin-vue2-2.3.1.tgz",
 -      "integrity": "sha512-/ksaaz2SRLN11JQhLdEUhDzOn909WEk99q9t9w+N12GjQCljzv7GyvAbD/p20aBUjHkvpGOoQ+FCOkG+mjDF4A==",
 -      "dev": true,
 -      "engines": {
 -        "node": "^14.18.0 || >= 16.0.0"
 -      },
 -      "peerDependencies": {
 -        "vite": "^3.0.0 || ^4.0.0 || ^5.0.0",
 -        "vue": "^2.7.0-0"
 -      }
 -    },
 -    "node_modules/@vue/compiler-sfc": {
 -      "version": "2.7.14",
 -      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz",
 -      "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==",
 -      "dev": true,
 -      "peer": true,
 -      "dependencies": {
 -        "@babel/parser": "^7.18.4",
 -        "postcss": "^8.4.14",
 -        "source-map": "^0.6.1"
 -      }
 -    },
 -    "node_modules/@vue/compiler-sfc/node_modules/picocolors": {
 -      "version": "1.0.0",
 -      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
 -      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
 -      "dev": true,
 -      "peer": true
 -    },
 -    "node_modules/@vue/compiler-sfc/node_modules/postcss": {
 -      "version": "8.4.21",
 -      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
 -      "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
 -      "dev": true,
 -      "funding": [
 -        {
 -          "type": "opencollective",
 -          "url": "https://opencollective.com/postcss/"
 -        },
 -        {
 -          "type": "tidelift",
 -          "url": "https://tidelift.com/funding/github/npm/postcss"
 -        }
 -      ],
 -      "peer": true,
 -      "dependencies": {
 -        "nanoid": "^3.3.4",
 -        "picocolors": "^1.0.0",
 -        "source-map-js": "^1.0.2"
 -      },
 -      "engines": {
 -        "node": "^10 || ^12 || >=14"
 -      }
 -    },
 -    "node_modules/ansi-styles": {
 -      "version": "4.3.0",
 -      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
 -      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
 -      "dev": true,
 -      "dependencies": {
 -        "color-convert": "^2.0.1"
 -      },
 -      "engines": {
 -        "node": ">=8"
 -      },
 -      "funding": {
 -        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
 -      }
 -    },
 -    "node_modules/asynckit": {
 -      "version": "0.4.0",
 -      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
 -      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
 -      "dev": true
 -    },
 -    "node_modules/axios": {
 -      "version": "1.6.8",
 -      "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
 -      "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
 -      "dev": true,
 -      "dependencies": {
 -        "follow-redirects": "^1.15.6",
 -        "form-data": "^4.0.0",
 -        "proxy-from-env": "^1.1.0"
 -      }
 -    },
 -    "node_modules/axios/node_modules/form-data": {
 -      "version": "4.0.0",
 -      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
 -      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
 -      "dev": true,
 -      "dependencies": {
 -        "asynckit": "^0.4.0",
 -        "combined-stream": "^1.0.8",
 -        "mime-types": "^2.1.12"
 -      },
 -      "engines": {
 -        "node": ">= 6"
 -      }
 -    },
 -    "node_modules/bootstrap": {
 -      "version": "4.6.2",
 -      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz",
 -      "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==",
 -      "dev": true,
 -      "funding": [
 -        {
 -          "type": "github",
 -          "url": "https://github.com/sponsors/twbs"
 -        },
 -        {
 -          "type": "opencollective",
 -          "url": "https://opencollective.com/bootstrap"
 -        }
 -      ],
 -      "peerDependencies": {
 -        "jquery": "1.9.1 - 3",
 -        "popper.js": "^1.16.1"
 -      }
 -    },
 -    "node_modules/bootstrap-vue": {
 -      "version": "2.23.1",
 -      "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.23.1.tgz",
 -      "integrity": "sha512-SEWkG4LzmMuWjQdSYmAQk1G/oOKm37dtNfjB5kxq0YafnL2W6qUAmeDTcIZVbPiQd2OQlIkWOMPBRGySk/zGsg==",
 -      "dev": true,
 -      "hasInstallScript": true,
 -      "dependencies": {
 -        "@nuxt/opencollective": "^0.3.2",
 -        "bootstrap": "^4.6.1",
 -        "popper.js": "^1.16.1",
 -        "portal-vue": "^2.1.7",
 -        "vue-functional-data-merge": "^3.1.0"
 -      }
 -    },
 -    "node_modules/buffer-from": {
 -      "version": "1.1.2",
 -      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
 -      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true
 -    },
 -    "node_modules/chalk": {
 -      "version": "4.1.2",
 -      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
 -      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
 -      "dev": true,
 -      "dependencies": {
 -        "ansi-styles": "^4.1.0",
 -        "supports-color": "^7.1.0"
 -      },
 -      "engines": {
 -        "node": ">=10"
 -      },
 -      "funding": {
 -        "url": "https://github.com/chalk/chalk?sponsor=1"
 -      }
 -    },
 -    "node_modules/color-convert": {
 -      "version": "2.0.1",
 -      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
 -      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
 -      "dev": true,
 -      "dependencies": {
 -        "color-name": "~1.1.4"
 -      },
 -      "engines": {
 -        "node": ">=7.0.0"
 -      }
 -    },
 -    "node_modules/color-name": {
 -      "version": "1.1.4",
 -      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
 -      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
 -      "dev": true
 -    },
 -    "node_modules/combined-stream": {
 -      "version": "1.0.8",
 -      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 -      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
 -      "dev": true,
 -      "dependencies": {
 -        "delayed-stream": "~1.0.0"
 -      },
 -      "engines": {
 -        "node": ">= 0.8"
 -      }
 -    },
 -    "node_modules/commander": {
 -      "version": "2.20.3",
 -      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
 -      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true
 -    },
 -    "node_modules/consola": {
 -      "version": "2.15.3",
 -      "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
 -      "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==",
 -      "dev": true
 -    },
 -    "node_modules/csstype": {
 -      "version": "3.1.1",
 -      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
 -      "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==",
 -      "dev": true,
 -      "peer": true
 -    },
 -    "node_modules/delayed-stream": {
 -      "version": "1.0.0",
 -      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
 -      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
 -      "dev": true,
 -      "engines": {
 -        "node": ">=0.4.0"
 -      }
 -    },
 -    "node_modules/dompurify": {
 -      "version": "2.5.0",
 -      "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.0.tgz",
 -      "integrity": "sha512-5RXhAXSCrKTqt9pSbobT9PVRX+oPpENplTZqCiK1l0ya+ZOzwo9kqsGLbYRsAhzIiLCwKEy99XKSSrqnRTLVcw==",
 -      "dev": true
 -    },
 -    "node_modules/esbuild": {
 -      "version": "0.20.2",
 -      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
 -      "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
 -      "dev": true,
 -      "hasInstallScript": true,
 -      "bin": {
 -        "esbuild": "bin/esbuild"
 -      },
 -      "engines": {
 -        "node": ">=12"
 -      },
 -      "optionalDependencies": {
 -        "@esbuild/aix-ppc64": "0.20.2",
 -        "@esbuild/android-arm": "0.20.2",
 -        "@esbuild/android-arm64": "0.20.2",
 -        "@esbuild/android-x64": "0.20.2",
 -        "@esbuild/darwin-arm64": "0.20.2",
 -        "@esbuild/darwin-x64": "0.20.2",
 -        "@esbuild/freebsd-arm64": "0.20.2",
 -        "@esbuild/freebsd-x64": "0.20.2",
 -        "@esbuild/linux-arm": "0.20.2",
 -        "@esbuild/linux-arm64": "0.20.2",
 -        "@esbuild/linux-ia32": "0.20.2",
 -        "@esbuild/linux-loong64": "0.20.2",
 -        "@esbuild/linux-mips64el": "0.20.2",
 -        "@esbuild/linux-ppc64": "0.20.2",
 -        "@esbuild/linux-riscv64": "0.20.2",
 -        "@esbuild/linux-s390x": "0.20.2",
 -        "@esbuild/linux-x64": "0.20.2",
 -        "@esbuild/netbsd-x64": "0.20.2",
 -        "@esbuild/openbsd-x64": "0.20.2",
 -        "@esbuild/sunos-x64": "0.20.2",
 -        "@esbuild/win32-arm64": "0.20.2",
 -        "@esbuild/win32-ia32": "0.20.2",
 -        "@esbuild/win32-x64": "0.20.2"
 -      }
 -    },
 -    "node_modules/follow-redirects": {
 -      "version": "1.15.6",
 -      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
 -      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
 -      "dev": true,
 -      "funding": [
 -        {
 -          "type": "individual",
 -          "url": "https://github.com/sponsors/RubenVerborgh"
 -        }
 -      ],
 -      "engines": {
 -        "node": ">=4.0"
 -      },
 -      "peerDependenciesMeta": {
 -        "debug": {
 -          "optional": true
 -        }
 -      }
 -    },
 -    "node_modules/fsevents": {
 -      "version": "2.3.3",
 -      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
 -      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
 -      "dev": true,
 -      "hasInstallScript": true,
 -      "optional": true,
 -      "os": [
 -        "darwin"
 -      ],
 -      "engines": {
 -        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
 -      }
 -    },
 -    "node_modules/has-flag": {
 -      "version": "4.0.0",
 -      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
 -      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
 -      "dev": true,
 -      "engines": {
 -        "node": ">=8"
 -      }
 -    },
 -    "node_modules/immutable": {
 -      "version": "4.2.4",
 -      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz",
 -      "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true
 -    },
 -    "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,
 -      "optional": true,
 -      "peer": true,
 -      "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,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "is-extglob": "^2.1.1"
 -      },
 -      "engines": {
 -        "node": ">=0.10.0"
 -      }
 -    },
 -    "node_modules/jquery": {
 -      "version": "3.6.3",
 -      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz",
 -      "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==",
 -      "dev": true,
 -      "peer": true
 -    },
 -    "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==",
 -      "dev": true,
 -      "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==",
 -      "dev": true,
 -      "dependencies": {
 -        "mime-db": "1.52.0"
 -      },
 -      "engines": {
 -        "node": ">= 0.6"
 -      }
 -    },
 -    "node_modules/mousetrap": {
 -      "version": "1.6.5",
 -      "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz",
 -      "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==",
 -      "dev": true
 -    },
 -    "node_modules/nanoid": {
 -      "version": "3.3.7",
 -      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
 -      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
 -      "dev": true,
 -      "funding": [
 -        {
 -          "type": "github",
 -          "url": "https://github.com/sponsors/ai"
 -        }
 -      ],
 -      "bin": {
 -        "nanoid": "bin/nanoid.cjs"
 -      },
 -      "engines": {
 -        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
 -      }
 -    },
 -    "node_modules/node-fetch": {
 -      "version": "2.6.9",
 -      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
 -      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
 -      "dev": true,
 -      "dependencies": {
 -        "whatwg-url": "^5.0.0"
 -      },
 -      "engines": {
 -        "node": "4.x || >=6.0.0"
 -      },
 -      "peerDependencies": {
 -        "encoding": "^0.1.0"
 -      },
 -      "peerDependenciesMeta": {
 -        "encoding": {
 -          "optional": true
 -        }
 -      }
 -    },
 -    "node_modules/normalize-path": {
 -      "version": "3.0.0",
 -      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
 -      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "engines": {
 -        "node": ">=0.10.0"
 -      }
 -    },
 -    "node_modules/orderedmap": {
 -      "version": "2.1.1",
 -      "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz",
 -      "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==",
 -      "dev": true
 -    },
 -    "node_modules/picomatch": {
 -      "version": "2.3.1",
 -      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
 -      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "engines": {
 -        "node": ">=8.6"
 -      },
 -      "funding": {
 -        "url": "https://github.com/sponsors/jonschlinkert"
 -      }
 -    },
 -    "node_modules/popper.js": {
 -      "version": "1.16.1",
 -      "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
 -      "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
 -      "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
 -      "dev": true,
 -      "funding": {
 -        "type": "opencollective",
 -        "url": "https://opencollective.com/popperjs"
 -      }
 -    },
 -    "node_modules/portal-vue": {
 -      "version": "2.1.7",
 -      "resolved": "https://registry.npmjs.org/portal-vue/-/portal-vue-2.1.7.tgz",
 -      "integrity": "sha512-+yCno2oB3xA7irTt0EU5Ezw22L2J51uKAacE/6hMPMoO/mx3h4rXFkkBkT4GFsMDv/vEe8TNKC3ujJJ0PTwb6g==",
 -      "dev": true,
 -      "peerDependencies": {
 -        "vue": "^2.5.18"
 -      }
 -    },
 -    "node_modules/prismjs": {
 -      "version": "1.29.0",
 -      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
 -      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
 -      "dev": true,
 -      "engines": {
 -        "node": ">=6"
 -      }
 -    },
 -    "node_modules/prosemirror-commands": {
 -      "version": "1.5.2",
 -      "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz",
 -      "integrity": "sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==",
 -      "dev": true,
 -      "dependencies": {
 -        "prosemirror-model": "^1.0.0",
 -        "prosemirror-state": "^1.0.0",
 -        "prosemirror-transform": "^1.0.0"
 -      }
 -    },
 -    "node_modules/prosemirror-history": {
 -      "version": "1.4.0",
 -      "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.0.tgz",
 -      "integrity": "sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ==",
 -      "dev": true,
 -      "dependencies": {
 -        "prosemirror-state": "^1.2.2",
 -        "prosemirror-transform": "^1.0.0",
 -        "prosemirror-view": "^1.31.0",
 -        "rope-sequence": "^1.3.0"
 -      }
 -    },
 -    "node_modules/prosemirror-inputrules": {
 -      "version": "1.4.0",
 -      "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz",
 -      "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==",
 -      "dev": true,
 -      "dependencies": {
 -        "prosemirror-state": "^1.0.0",
 -        "prosemirror-transform": "^1.0.0"
 -      }
 -    },
 -    "node_modules/prosemirror-keymap": {
 -      "version": "1.2.2",
 -      "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz",
 -      "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==",
 -      "dev": true,
 -      "dependencies": {
 -        "prosemirror-state": "^1.0.0",
 -        "w3c-keyname": "^2.2.0"
 -      }
 -    },
 -    "node_modules/prosemirror-model": {
 -      "version": "1.20.0",
 -      "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.20.0.tgz",
 -      "integrity": "sha512-q7AY7vMjKYqDCeoedgUiAgrLabliXxndJuuFmcmc2+YU1SblvnOiG2WEACF2lwAZsMlfLpiAilA3L+TWlDqIsQ==",
 -      "dev": true,
 -      "dependencies": {
 -        "orderedmap": "^2.0.0"
 -      }
 -    },
 -    "node_modules/prosemirror-state": {
 -      "version": "1.4.3",
 -      "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz",
 -      "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==",
 -      "dev": true,
 -      "dependencies": {
 -        "prosemirror-model": "^1.0.0",
 -        "prosemirror-transform": "^1.0.0",
 -        "prosemirror-view": "^1.27.0"
 -      }
 -    },
 -    "node_modules/prosemirror-transform": {
 -      "version": "1.8.0",
 -      "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.8.0.tgz",
 -      "integrity": "sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==",
 -      "dev": true,
 -      "dependencies": {
 -        "prosemirror-model": "^1.0.0"
 -      }
 -    },
 -    "node_modules/prosemirror-view": {
 -      "version": "1.33.4",
 -      "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.4.tgz",
 -      "integrity": "sha512-xQqAhH8/HGleVpKDhQsrd+oqdyeKMxFtdCWDxWMmP+n0k27fBpyUqa8pA+RB5cFY8rqDDc1hll69aRZQa7UaAw==",
 -      "dev": true,
 -      "dependencies": {
 -        "prosemirror-model": "^1.20.0",
 -        "prosemirror-state": "^1.0.0",
 -        "prosemirror-transform": "^1.1.0"
 -      }
 -    },
 -    "node_modules/proxy-from-env": {
 -      "version": "1.1.0",
 -      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
 -      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
 -      "dev": true
 -    },
 -    "node_modules/rollup": {
 -      "version": "4.14.3",
 -      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz",
 -      "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==",
 -      "dev": true,
 -      "dependencies": {
 -        "@types/estree": "1.0.5"
 -      },
 -      "bin": {
 -        "rollup": "dist/bin/rollup"
 -      },
 -      "engines": {
 -        "node": ">=18.0.0",
 -        "npm": ">=8.0.0"
 -      },
 -      "optionalDependencies": {
 -        "@rollup/rollup-android-arm-eabi": "4.14.3",
 -        "@rollup/rollup-android-arm64": "4.14.3",
 -        "@rollup/rollup-darwin-arm64": "4.14.3",
 -        "@rollup/rollup-darwin-x64": "4.14.3",
 -        "@rollup/rollup-linux-arm-gnueabihf": "4.14.3",
 -        "@rollup/rollup-linux-arm-musleabihf": "4.14.3",
 -        "@rollup/rollup-linux-arm64-gnu": "4.14.3",
 -        "@rollup/rollup-linux-arm64-musl": "4.14.3",
 -        "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3",
 -        "@rollup/rollup-linux-riscv64-gnu": "4.14.3",
 -        "@rollup/rollup-linux-s390x-gnu": "4.14.3",
 -        "@rollup/rollup-linux-x64-gnu": "4.14.3",
 -        "@rollup/rollup-linux-x64-musl": "4.14.3",
 -        "@rollup/rollup-win32-arm64-msvc": "4.14.3",
 -        "@rollup/rollup-win32-ia32-msvc": "4.14.3",
 -        "@rollup/rollup-win32-x64-msvc": "4.14.3",
 -        "fsevents": "~2.3.2"
 -      }
 -    },
 -    "node_modules/rope-sequence": {
 -      "version": "1.3.4",
 -      "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz",
 -      "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==",
 -      "dev": true
 -    },
 -    "node_modules/sass": {
 -      "version": "1.74.1",
 -      "resolved": "https://registry.npmjs.org/sass/-/sass-1.74.1.tgz",
 -      "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "chokidar": ">=3.0.0 <4.0.0",
 -        "immutable": "^4.0.0",
 -        "source-map-js": ">=0.6.2 <2.0.0"
 -      },
 -      "bin": {
 -        "sass": "sass.js"
 -      },
 -      "engines": {
 -        "node": ">=14.0.0"
 -      }
 -    },
 -    "node_modules/sass/node_modules/anymatch": {
 -      "version": "3.1.3",
 -      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
 -      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "normalize-path": "^3.0.0",
 -        "picomatch": "^2.0.4"
 -      },
 -      "engines": {
 -        "node": ">= 8"
 -      }
 -    },
 -    "node_modules/sass/node_modules/binary-extensions": {
 -      "version": "2.2.0",
 -      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
 -      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "engines": {
 -        "node": ">=8"
 -      }
 -    },
 -    "node_modules/sass/node_modules/braces": {
 -      "version": "3.0.2",
 -      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
 -      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "fill-range": "^7.0.1"
 -      },
 -      "engines": {
 -        "node": ">=8"
 -      }
 -    },
 -    "node_modules/sass/node_modules/chokidar": {
 -      "version": "3.5.3",
 -      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
 -      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
 -      "dev": true,
 -      "funding": [
 -        {
 -          "type": "individual",
 -          "url": "https://paulmillr.com/funding/"
 -        }
 -      ],
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "anymatch": "~3.1.2",
 -        "braces": "~3.0.2",
 -        "glob-parent": "~5.1.2",
 -        "is-binary-path": "~2.1.0",
 -        "is-glob": "~4.0.1",
 -        "normalize-path": "~3.0.0",
 -        "readdirp": "~3.6.0"
 -      },
 -      "engines": {
 -        "node": ">= 8.10.0"
 -      },
 -      "optionalDependencies": {
 -        "fsevents": "~2.3.2"
 -      }
 -    },
 -    "node_modules/sass/node_modules/fill-range": {
 -      "version": "7.0.1",
 -      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
 -      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "to-regex-range": "^5.0.1"
 -      },
 -      "engines": {
 -        "node": ">=8"
 -      }
 -    },
 -    "node_modules/sass/node_modules/glob-parent": {
 -      "version": "5.1.2",
 -      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
 -      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "is-glob": "^4.0.1"
 -      },
 -      "engines": {
 -        "node": ">= 6"
 -      }
 -    },
 -    "node_modules/sass/node_modules/is-binary-path": {
 -      "version": "2.1.0",
 -      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
 -      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "binary-extensions": "^2.0.0"
 -      },
 -      "engines": {
 -        "node": ">=8"
 -      }
 -    },
 -    "node_modules/sass/node_modules/is-number": {
 -      "version": "7.0.0",
 -      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
 -      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "engines": {
 -        "node": ">=0.12.0"
 -      }
 -    },
 -    "node_modules/sass/node_modules/readdirp": {
 -      "version": "3.6.0",
 -      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
 -      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "picomatch": "^2.2.1"
 -      },
 -      "engines": {
 -        "node": ">=8.10.0"
 -      }
 -    },
 -    "node_modules/sass/node_modules/to-regex-range": {
 -      "version": "5.0.1",
 -      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
 -      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "is-number": "^7.0.0"
 -      },
 -      "engines": {
 -        "node": ">=8.0"
 -      }
 -    },
 -    "node_modules/source-map": {
 -      "version": "0.6.1",
 -      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 -      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 -      "dev": true,
 -      "peer": true,
 -      "engines": {
 -        "node": ">=0.10.0"
 -      }
 -    },
 -    "node_modules/source-map-js": {
 -      "version": "1.2.0",
 -      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
 -      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
 -      "dev": true,
 -      "engines": {
 -        "node": ">=0.10.0"
 -      }
 -    },
 -    "node_modules/source-map-support": {
 -      "version": "0.5.21",
 -      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
 -      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "buffer-from": "^1.0.0",
 -        "source-map": "^0.6.0"
 -      }
 -    },
 -    "node_modules/supports-color": {
 -      "version": "7.2.0",
 -      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
 -      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
 -      "dev": true,
 -      "dependencies": {
 -        "has-flag": "^4.0.0"
 -      },
 -      "engines": {
 -        "node": ">=8"
 -      }
 -    },
 -    "node_modules/terser": {
 -      "version": "5.30.3",
 -      "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz",
 -      "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "dependencies": {
 -        "@jridgewell/source-map": "^0.3.3",
 -        "acorn": "^8.8.2",
 -        "commander": "^2.20.0",
 -        "source-map-support": "~0.5.20"
 -      },
 -      "bin": {
 -        "terser": "bin/terser"
 -      },
 -      "engines": {
 -        "node": ">=10"
 -      }
 -    },
 -    "node_modules/terser/node_modules/acorn": {
 -      "version": "8.11.3",
 -      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
 -      "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
 -      "dev": true,
 -      "optional": true,
 -      "peer": true,
 -      "bin": {
 -        "acorn": "bin/acorn"
 -      },
 -      "engines": {
 -        "node": ">=0.4.0"
 -      }
 -    },
 -    "node_modules/tr46": {
 -      "version": "0.0.3",
 -      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
 -      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
 -      "dev": true
 -    },
 -    "node_modules/vite": {
 -      "version": "5.2.9",
 -      "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz",
 -      "integrity": "sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==",
 -      "dev": true,
 -      "dependencies": {
 -        "esbuild": "^0.20.1",
 -        "postcss": "^8.4.38",
 -        "rollup": "^4.13.0"
 -      },
 -      "bin": {
 -        "vite": "bin/vite.js"
 -      },
 -      "engines": {
 -        "node": "^18.0.0 || >=20.0.0"
 -      },
 -      "funding": {
 -        "url": "https://github.com/vitejs/vite?sponsor=1"
 -      },
 -      "optionalDependencies": {
 -        "fsevents": "~2.3.3"
 -      },
 -      "peerDependencies": {
 -        "@types/node": "^18.0.0 || >=20.0.0",
 -        "less": "*",
 -        "lightningcss": "^1.21.0",
 -        "sass": "*",
 -        "stylus": "*",
 -        "sugarss": "*",
 -        "terser": "^5.4.0"
 -      },
 -      "peerDependenciesMeta": {
 -        "@types/node": {
 -          "optional": true
 -        },
 -        "less": {
 -          "optional": true
 -        },
 -        "lightningcss": {
 -          "optional": true
 -        },
 -        "sass": {
 -          "optional": true
 -        },
 -        "stylus": {
 -          "optional": true
 -        },
 -        "sugarss": {
 -          "optional": true
 -        },
 -        "terser": {
 -          "optional": true
 -        }
 -      }
 -    },
 -    "node_modules/vite/node_modules/picocolors": {
 -      "version": "1.0.0",
 -      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
 -      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
 -      "dev": true
 -    },
 -    "node_modules/vite/node_modules/postcss": {
 -      "version": "8.4.38",
 -      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
 -      "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
 -      "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"
 -        }
 -      ],
 -      "dependencies": {
 -        "nanoid": "^3.3.7",
 -        "picocolors": "^1.0.0",
 -        "source-map-js": "^1.2.0"
 -      },
 -      "engines": {
 -        "node": "^10 || ^12 || >=14"
 -      }
 -    },
 -    "node_modules/vue": {
 -      "version": "2.7.14",
 -      "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz",
 -      "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==",
 -      "dev": true,
 -      "peer": true,
 -      "dependencies": {
 -        "@vue/compiler-sfc": "2.7.14",
 -        "csstype": "^3.1.0"
 -      }
 -    },
 -    "node_modules/vue-functional-data-merge": {
 -      "version": "3.1.0",
 -      "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz",
 -      "integrity": "sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==",
 -      "dev": true
 -    },
 -    "node_modules/w3c-keyname": {
 -      "version": "2.2.8",
 -      "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
 -      "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
 -      "dev": true
 -    },
 -    "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==",
 -      "dev": true,
 -      "dependencies": {
 -        "tr46": "~0.0.3",
 -        "webidl-conversions": "^3.0.0"
 -      }
 -    },
 -    "node_modules/whatwg-url/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==",
 -      "dev": true
 -    }
 -  }
 -}
 +{\r
 +  "name": "flatnotes",\r
-   "version": "4.0.4",\r
++  "version": "4.0.5",\r
 +  "lockfileVersion": 3,\r
 +  "requires": true,\r
 +  "packages": {\r
 +    "": {\r
 +      "name": "flatnotes",\r
-       "version": "4.0.4",\r
++      "version": "4.0.5",\r
 +      "license": "MIT",\r
 +      "dependencies": {\r
 +        "@jamescoyle/vue-icon": "0.1.2",\r
 +        "@mdi/js": "7.4.47",\r
 +        "@mdi/light-js": "0.2.63",\r
 +        "@toast-ui/editor": "3.2.2",\r
 +        "@toast-ui/editor-plugin-code-syntax-highlight": "3.1.0",\r
 +        "axios": "1.6.8",\r
 +        "mousetrap": "1.6.5",\r
 +        "pinia": "2.1.7",\r
 +        "primevue": "3.52.0",\r
 +        "vue": "3.4.27",\r
 +        "vue-router": "4.3.2"\r
 +      },\r
 +      "devDependencies": {\r
 +        "@vitejs/plugin-vue": "5.0.4",\r
 +        "autoprefixer": "10.4.19",\r
 +        "postcss": "8.4.38",\r
 +        "prettier": "3.2.5",\r
 +        "prettier-plugin-tailwindcss": "0.5.14",\r
 +        "tailwindcss": "3.4.3",\r
 +        "vite": "5.2.11"\r
 +      }\r
 +    },\r
 +    "node_modules/@alloc/quick-lru": {\r
 +      "version": "5.2.0",\r
 +      "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",\r
 +      "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=10"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/sindresorhus"\r
 +      }\r
 +    },\r
 +    "node_modules/@babel/parser": {\r
 +      "version": "7.24.5",\r
 +      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz",\r
 +      "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==",\r
 +      "bin": {\r
 +        "parser": "bin/babel-parser.js"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=6.0.0"\r
 +      }\r
 +    },\r
-     "node_modules/@esbuild/aix-ppc64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",\r
-       "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",\r
-       "cpu": [\r
-         "ppc64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "aix"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/android-arm": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",\r
-       "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",\r
-       "cpu": [\r
-         "arm"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "android"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/android-arm64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",\r
-       "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",\r
-       "cpu": [\r
-         "arm64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "android"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/android-x64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",\r
-       "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",\r
-       "cpu": [\r
-         "x64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "android"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/darwin-arm64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",\r
-       "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",\r
-       "cpu": [\r
-         "arm64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "darwin"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/darwin-x64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",\r
-       "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",\r
-       "cpu": [\r
-         "x64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "darwin"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/freebsd-arm64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",\r
-       "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",\r
-       "cpu": [\r
-         "arm64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "freebsd"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/freebsd-x64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",\r
-       "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",\r
-       "cpu": [\r
-         "x64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "freebsd"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/linux-arm": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",\r
-       "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",\r
-       "cpu": [\r
-         "arm"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/linux-arm64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",\r
-       "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",\r
-       "cpu": [\r
-         "arm64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/linux-ia32": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",\r
-       "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",\r
-       "cpu": [\r
-         "ia32"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/linux-loong64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",\r
-       "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",\r
-       "cpu": [\r
-         "loong64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/linux-mips64el": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",\r
-       "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",\r
-       "cpu": [\r
-         "mips64el"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/linux-ppc64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",\r
-       "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",\r
-       "cpu": [\r
-         "ppc64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/linux-riscv64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",\r
-       "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",\r
-       "cpu": [\r
-         "riscv64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/linux-s390x": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",\r
-       "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",\r
-       "cpu": [\r
-         "s390x"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
 +    "node_modules/@esbuild/linux-x64": {\r
 +      "version": "0.20.2",\r
 +      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",\r
 +      "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",\r
 +      "cpu": [\r
 +        "x64"\r
 +      ],\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "os": [\r
 +        "linux"\r
 +      ],\r
 +      "engines": {\r
 +        "node": ">=12"\r
 +      }\r
 +    },\r
-     "node_modules/@esbuild/netbsd-x64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",\r
-       "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",\r
-       "cpu": [\r
-         "x64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "netbsd"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/openbsd-x64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",\r
-       "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",\r
-       "cpu": [\r
-         "x64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "openbsd"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/sunos-x64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",\r
-       "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",\r
-       "cpu": [\r
-         "x64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "sunos"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/win32-arm64": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",\r
-       "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",\r
-       "cpu": [\r
-         "arm64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "win32"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
-     "node_modules/@esbuild/win32-ia32": {\r
-       "version": "0.20.2",\r
-       "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",\r
-       "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",\r
-       "cpu": [\r
-         "ia32"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "win32"\r
-       ],\r
-       "engines": {\r
-         "node": ">=12"\r
-       }\r
-     },\r
 +    "node_modules/@esbuild/win32-x64": {\r
 +      "version": "0.20.2",\r
 +      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",\r
 +      "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",\r
 +      "cpu": [\r
 +        "x64"\r
 +      ],\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "os": [\r
 +        "win32"\r
 +      ],\r
 +      "engines": {\r
 +        "node": ">=12"\r
 +      }\r
 +    },\r
 +    "node_modules/@isaacs/cliui": {\r
 +      "version": "8.0.2",\r
 +      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",\r
 +      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "string-width": "^5.1.2",\r
 +        "string-width-cjs": "npm:string-width@^4.2.0",\r
 +        "strip-ansi": "^7.0.1",\r
 +        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",\r
 +        "wrap-ansi": "^8.1.0",\r
 +        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=12"\r
 +      }\r
 +    },\r
 +    "node_modules/@jamescoyle/vue-icon": {\r
 +      "version": "0.1.2",\r
 +      "resolved": "https://registry.npmjs.org/@jamescoyle/vue-icon/-/vue-icon-0.1.2.tgz",\r
 +      "integrity": "sha512-KFrImXx5TKIi6iQXlnyLEBl4rNosNKbTeRnr70ucTdUaciVmd9qK9d/pZAaKt1Ob/8xNnX2GMp8LisyHdKtEgw=="\r
 +    },\r
 +    "node_modules/@jridgewell/gen-mapping": {\r
 +      "version": "0.3.5",\r
 +      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",\r
 +      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "@jridgewell/set-array": "^1.2.1",\r
 +        "@jridgewell/sourcemap-codec": "^1.4.10",\r
 +        "@jridgewell/trace-mapping": "^0.3.24"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=6.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/@jridgewell/resolve-uri": {\r
 +      "version": "3.1.0",\r
 +      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",\r
 +      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=6.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/@jridgewell/set-array": {\r
 +      "version": "1.2.1",\r
 +      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",\r
 +      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=6.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/@jridgewell/source-map": {\r
 +      "version": "0.3.6",\r
 +      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",\r
 +      "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "peer": true,\r
 +      "dependencies": {\r
 +        "@jridgewell/gen-mapping": "^0.3.5",\r
 +        "@jridgewell/trace-mapping": "^0.3.25"\r
 +      }\r
 +    },\r
 +    "node_modules/@jridgewell/sourcemap-codec": {\r
 +      "version": "1.4.15",\r
 +      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",\r
 +      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="\r
 +    },\r
 +    "node_modules/@jridgewell/trace-mapping": {\r
 +      "version": "0.3.25",\r
 +      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",\r
 +      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "@jridgewell/resolve-uri": "^3.1.0",\r
 +        "@jridgewell/sourcemap-codec": "^1.4.14"\r
 +      }\r
 +    },\r
 +    "node_modules/@mdi/js": {\r
 +      "version": "7.4.47",\r
 +      "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.4.47.tgz",\r
 +      "integrity": "sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ=="\r
 +    },\r
 +    "node_modules/@mdi/light-js": {\r
 +      "version": "0.2.63",\r
 +      "resolved": "https://registry.npmjs.org/@mdi/light-js/-/light-js-0.2.63.tgz",\r
 +      "integrity": "sha512-+SUtJIOxvEy6DiVq0wTRPIzVuoPB5fhnubmzaN7e2ew0v3/nvnpC4mqbGCjiTK0diVd3+zvhEQHZzPDErGb1fg=="\r
 +    },\r
 +    "node_modules/@nodelib/fs.scandir": {\r
 +      "version": "2.1.5",\r
 +      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",\r
 +      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "@nodelib/fs.stat": "2.0.5",\r
 +        "run-parallel": "^1.1.9"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 8"\r
 +      }\r
 +    },\r
 +    "node_modules/@nodelib/fs.stat": {\r
 +      "version": "2.0.5",\r
 +      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",\r
 +      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">= 8"\r
 +      }\r
 +    },\r
 +    "node_modules/@nodelib/fs.walk": {\r
 +      "version": "1.2.8",\r
 +      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",\r
 +      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "@nodelib/fs.scandir": "2.1.5",\r
 +        "fastq": "^1.6.0"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 8"\r
 +      }\r
 +    },\r
 +    "node_modules/@pkgjs/parseargs": {\r
 +      "version": "0.11.0",\r
 +      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",\r
 +      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "engines": {\r
 +        "node": ">=14"\r
 +      }\r
 +    },\r
-     "node_modules/@rollup/rollup-android-arm-eabi": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz",\r
-       "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==",\r
-       "cpu": [\r
-         "arm"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "android"\r
-       ]\r
-     },\r
-     "node_modules/@rollup/rollup-android-arm64": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz",\r
-       "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==",\r
-       "cpu": [\r
-         "arm64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "android"\r
-       ]\r
-     },\r
-     "node_modules/@rollup/rollup-darwin-arm64": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz",\r
-       "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==",\r
-       "cpu": [\r
-         "arm64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "darwin"\r
-       ]\r
-     },\r
-     "node_modules/@rollup/rollup-darwin-x64": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz",\r
-       "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==",\r
-       "cpu": [\r
-         "x64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "darwin"\r
-       ]\r
-     },\r
-     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz",\r
-       "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==",\r
-       "cpu": [\r
-         "arm"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ]\r
-     },\r
-     "node_modules/@rollup/rollup-linux-arm-musleabihf": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz",\r
-       "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==",\r
-       "cpu": [\r
-         "arm"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ]\r
-     },\r
-     "node_modules/@rollup/rollup-linux-arm64-gnu": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz",\r
-       "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==",\r
-       "cpu": [\r
-         "arm64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ]\r
-     },\r
-     "node_modules/@rollup/rollup-linux-arm64-musl": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz",\r
-       "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==",\r
-       "cpu": [\r
-         "arm64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ]\r
-     },\r
-     "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz",\r
-       "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==",\r
-       "cpu": [\r
-         "ppc64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ]\r
-     },\r
-     "node_modules/@rollup/rollup-linux-riscv64-gnu": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz",\r
-       "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==",\r
-       "cpu": [\r
-         "riscv64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ]\r
-     },\r
-     "node_modules/@rollup/rollup-linux-s390x-gnu": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz",\r
-       "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==",\r
-       "cpu": [\r
-         "s390x"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "linux"\r
-       ]\r
-     },\r
 +    "node_modules/@rollup/rollup-linux-x64-gnu": {\r
 +      "version": "4.14.3",\r
 +      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz",\r
 +      "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==",\r
 +      "cpu": [\r
 +        "x64"\r
 +      ],\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "os": [\r
 +        "linux"\r
 +      ]\r
 +    },\r
 +    "node_modules/@rollup/rollup-linux-x64-musl": {\r
 +      "version": "4.14.3",\r
 +      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz",\r
 +      "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==",\r
 +      "cpu": [\r
 +        "x64"\r
 +      ],\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "os": [\r
 +        "linux"\r
 +      ]\r
 +    },\r
-     "node_modules/@rollup/rollup-win32-arm64-msvc": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz",\r
-       "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==",\r
-       "cpu": [\r
-         "arm64"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "win32"\r
-       ]\r
-     },\r
-     "node_modules/@rollup/rollup-win32-ia32-msvc": {\r
-       "version": "4.14.3",\r
-       "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz",\r
-       "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==",\r
-       "cpu": [\r
-         "ia32"\r
-       ],\r
-       "dev": true,\r
-       "optional": true,\r
-       "os": [\r
-         "win32"\r
-       ]\r
-     },\r
 +    "node_modules/@rollup/rollup-win32-x64-msvc": {\r
 +      "version": "4.14.3",\r
 +      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz",\r
 +      "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==",\r
 +      "cpu": [\r
 +        "x64"\r
 +      ],\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "os": [\r
 +        "win32"\r
 +      ]\r
 +    },\r
 +    "node_modules/@toast-ui/editor": {\r
 +      "version": "3.2.2",\r
 +      "resolved": "https://registry.npmjs.org/@toast-ui/editor/-/editor-3.2.2.tgz",\r
 +      "integrity": "sha512-ASX7LFjN2ZYQJrwmkUajPs7DRr9FsM1+RQ82CfTO0Y5ZXorBk1VZS4C2Dpxinx9kl55V4F8/A2h2QF4QMDtRbA==",\r
 +      "dependencies": {\r
 +        "dompurify": "^2.3.3",\r
 +        "prosemirror-commands": "^1.1.9",\r
 +        "prosemirror-history": "^1.1.3",\r
 +        "prosemirror-inputrules": "^1.1.3",\r
 +        "prosemirror-keymap": "^1.1.4",\r
 +        "prosemirror-model": "^1.14.1",\r
 +        "prosemirror-state": "^1.3.4",\r
 +        "prosemirror-view": "^1.18.7"\r
 +      }\r
 +    },\r
 +    "node_modules/@toast-ui/editor-plugin-code-syntax-highlight": {\r
 +      "version": "3.1.0",\r
 +      "resolved": "https://registry.npmjs.org/@toast-ui/editor-plugin-code-syntax-highlight/-/editor-plugin-code-syntax-highlight-3.1.0.tgz",\r
 +      "integrity": "sha512-OgX5pZiTnHREoTTXDAFu1k6RzEspGOxeJNRlt/Lnoi1GvLbIpUTTbBcls9becpXT/Qdls++8G3r5C60cVdellA==",\r
 +      "dependencies": {\r
 +        "prismjs": "^1.23.0"\r
 +      }\r
 +    },\r
 +    "node_modules/@types/estree": {\r
 +      "version": "1.0.5",\r
 +      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",\r
 +      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/@vitejs/plugin-vue": {\r
 +      "version": "5.0.4",\r
 +      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz",\r
 +      "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": "^18.0.0 || >=20.0.0"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "vite": "^5.0.0",\r
 +        "vue": "^3.2.25"\r
 +      }\r
 +    },\r
 +    "node_modules/@vue/compiler-core": {\r
 +      "version": "3.4.27",\r
 +      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz",\r
 +      "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==",\r
 +      "dependencies": {\r
 +        "@babel/parser": "^7.24.4",\r
 +        "@vue/shared": "3.4.27",\r
 +        "entities": "^4.5.0",\r
 +        "estree-walker": "^2.0.2",\r
 +        "source-map-js": "^1.2.0"\r
 +      }\r
 +    },\r
 +    "node_modules/@vue/compiler-dom": {\r
 +      "version": "3.4.27",\r
 +      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz",\r
 +      "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==",\r
 +      "dependencies": {\r
 +        "@vue/compiler-core": "3.4.27",\r
 +        "@vue/shared": "3.4.27"\r
 +      }\r
 +    },\r
 +    "node_modules/@vue/compiler-sfc": {\r
 +      "version": "3.4.27",\r
 +      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz",\r
 +      "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==",\r
 +      "dependencies": {\r
 +        "@babel/parser": "^7.24.4",\r
 +        "@vue/compiler-core": "3.4.27",\r
 +        "@vue/compiler-dom": "3.4.27",\r
 +        "@vue/compiler-ssr": "3.4.27",\r
 +        "@vue/shared": "3.4.27",\r
 +        "estree-walker": "^2.0.2",\r
 +        "magic-string": "^0.30.10",\r
 +        "postcss": "^8.4.38",\r
 +        "source-map-js": "^1.2.0"\r
 +      }\r
 +    },\r
 +    "node_modules/@vue/compiler-ssr": {\r
 +      "version": "3.4.27",\r
 +      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz",\r
 +      "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==",\r
 +      "dependencies": {\r
 +        "@vue/compiler-dom": "3.4.27",\r
 +        "@vue/shared": "3.4.27"\r
 +      }\r
 +    },\r
 +    "node_modules/@vue/devtools-api": {\r
 +      "version": "6.6.1",\r
 +      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz",\r
 +      "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA=="\r
 +    },\r
 +    "node_modules/@vue/reactivity": {\r
 +      "version": "3.4.27",\r
 +      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz",\r
 +      "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==",\r
 +      "dependencies": {\r
 +        "@vue/shared": "3.4.27"\r
 +      }\r
 +    },\r
 +    "node_modules/@vue/runtime-core": {\r
 +      "version": "3.4.27",\r
 +      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz",\r
 +      "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==",\r
 +      "dependencies": {\r
 +        "@vue/reactivity": "3.4.27",\r
 +        "@vue/shared": "3.4.27"\r
 +      }\r
 +    },\r
 +    "node_modules/@vue/runtime-dom": {\r
 +      "version": "3.4.27",\r
 +      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz",\r
 +      "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==",\r
 +      "dependencies": {\r
 +        "@vue/runtime-core": "3.4.27",\r
 +        "@vue/shared": "3.4.27",\r
 +        "csstype": "^3.1.3"\r
 +      }\r
 +    },\r
 +    "node_modules/@vue/server-renderer": {\r
 +      "version": "3.4.27",\r
 +      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz",\r
 +      "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==",\r
 +      "dependencies": {\r
 +        "@vue/compiler-ssr": "3.4.27",\r
 +        "@vue/shared": "3.4.27"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "vue": "3.4.27"\r
 +      }\r
 +    },\r
 +    "node_modules/@vue/shared": {\r
 +      "version": "3.4.27",\r
 +      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz",\r
 +      "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA=="\r
 +    },\r
 +    "node_modules/ansi-regex": {\r
 +      "version": "6.0.1",\r
 +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",\r
 +      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=12"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/chalk/ansi-regex?sponsor=1"\r
 +      }\r
 +    },\r
 +    "node_modules/ansi-styles": {\r
 +      "version": "6.2.1",\r
 +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",\r
 +      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=12"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/chalk/ansi-styles?sponsor=1"\r
 +      }\r
 +    },\r
 +    "node_modules/any-promise": {\r
 +      "version": "1.3.0",\r
 +      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",\r
 +      "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/anymatch": {\r
 +      "version": "3.1.3",\r
 +      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",\r
 +      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "normalize-path": "^3.0.0",\r
 +        "picomatch": "^2.0.4"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 8"\r
 +      }\r
 +    },\r
 +    "node_modules/arg": {\r
 +      "version": "5.0.2",\r
 +      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",\r
 +      "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/asynckit": {\r
 +      "version": "0.4.0",\r
 +      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",\r
 +      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="\r
 +    },\r
 +    "node_modules/autoprefixer": {\r
 +      "version": "10.4.19",\r
 +      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz",\r
 +      "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==",\r
 +      "dev": true,\r
 +      "funding": [\r
 +        {\r
 +          "type": "opencollective",\r
 +          "url": "https://opencollective.com/postcss/"\r
 +        },\r
 +        {\r
 +          "type": "tidelift",\r
 +          "url": "https://tidelift.com/funding/github/npm/autoprefixer"\r
 +        },\r
 +        {\r
 +          "type": "github",\r
 +          "url": "https://github.com/sponsors/ai"\r
 +        }\r
 +      ],\r
 +      "dependencies": {\r
 +        "browserslist": "^4.23.0",\r
 +        "caniuse-lite": "^1.0.30001599",\r
 +        "fraction.js": "^4.3.7",\r
 +        "normalize-range": "^0.1.2",\r
 +        "picocolors": "^1.0.0",\r
 +        "postcss-value-parser": "^4.2.0"\r
 +      },\r
 +      "bin": {\r
 +        "autoprefixer": "bin/autoprefixer"\r
 +      },\r
 +      "engines": {\r
 +        "node": "^10 || ^12 || >=14"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "postcss": "^8.1.0"\r
 +      }\r
 +    },\r
 +    "node_modules/axios": {\r
 +      "version": "1.6.8",\r
 +      "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",\r
 +      "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",\r
 +      "dependencies": {\r
 +        "follow-redirects": "^1.15.6",\r
 +        "form-data": "^4.0.0",\r
 +        "proxy-from-env": "^1.1.0"\r
 +      }\r
 +    },\r
 +    "node_modules/axios/node_modules/form-data": {\r
 +      "version": "4.0.0",\r
 +      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",\r
 +      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",\r
 +      "dependencies": {\r
 +        "asynckit": "^0.4.0",\r
 +        "combined-stream": "^1.0.8",\r
 +        "mime-types": "^2.1.12"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 6"\r
 +      }\r
 +    },\r
 +    "node_modules/balanced-match": {\r
 +      "version": "1.0.2",\r
 +      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",\r
 +      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/binary-extensions": {\r
 +      "version": "2.3.0",\r
 +      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",\r
 +      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/sindresorhus"\r
 +      }\r
 +    },\r
 +    "node_modules/brace-expansion": {\r
 +      "version": "2.0.1",\r
 +      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",\r
 +      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "balanced-match": "^1.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/braces": {\r
 +      "version": "3.0.2",\r
 +      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",\r
 +      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "fill-range": "^7.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/browserslist": {\r
 +      "version": "4.23.0",\r
 +      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",\r
 +      "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",\r
 +      "dev": true,\r
 +      "funding": [\r
 +        {\r
 +          "type": "opencollective",\r
 +          "url": "https://opencollective.com/browserslist"\r
 +        },\r
 +        {\r
 +          "type": "tidelift",\r
 +          "url": "https://tidelift.com/funding/github/npm/browserslist"\r
 +        },\r
 +        {\r
 +          "type": "github",\r
 +          "url": "https://github.com/sponsors/ai"\r
 +        }\r
 +      ],\r
 +      "dependencies": {\r
 +        "caniuse-lite": "^1.0.30001587",\r
 +        "electron-to-chromium": "^1.4.668",\r
 +        "node-releases": "^2.0.14",\r
 +        "update-browserslist-db": "^1.0.13"\r
 +      },\r
 +      "bin": {\r
 +        "browserslist": "cli.js"\r
 +      },\r
 +      "engines": {\r
 +        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"\r
 +      }\r
 +    },\r
 +    "node_modules/buffer-from": {\r
 +      "version": "1.1.2",\r
 +      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",\r
 +      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "peer": true\r
 +    },\r
 +    "node_modules/camelcase-css": {\r
 +      "version": "2.0.1",\r
 +      "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",\r
 +      "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">= 6"\r
 +      }\r
 +    },\r
 +    "node_modules/caniuse-lite": {\r
 +      "version": "1.0.30001612",\r
 +      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz",\r
 +      "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==",\r
 +      "dev": true,\r
 +      "funding": [\r
 +        {\r
 +          "type": "opencollective",\r
 +          "url": "https://opencollective.com/browserslist"\r
 +        },\r
 +        {\r
 +          "type": "tidelift",\r
 +          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"\r
 +        },\r
 +        {\r
 +          "type": "github",\r
 +          "url": "https://github.com/sponsors/ai"\r
 +        }\r
 +      ]\r
 +    },\r
 +    "node_modules/chokidar": {\r
 +      "version": "3.6.0",\r
 +      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",\r
 +      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "anymatch": "~3.1.2",\r
 +        "braces": "~3.0.2",\r
 +        "glob-parent": "~5.1.2",\r
 +        "is-binary-path": "~2.1.0",\r
 +        "is-glob": "~4.0.1",\r
 +        "normalize-path": "~3.0.0",\r
 +        "readdirp": "~3.6.0"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 8.10.0"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://paulmillr.com/funding/"\r
 +      },\r
 +      "optionalDependencies": {\r
 +        "fsevents": "~2.3.2"\r
 +      }\r
 +    },\r
 +    "node_modules/chokidar/node_modules/glob-parent": {\r
 +      "version": "5.1.2",\r
 +      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",\r
 +      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "is-glob": "^4.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 6"\r
 +      }\r
 +    },\r
 +    "node_modules/color-convert": {\r
 +      "version": "2.0.1",\r
 +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",\r
 +      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "color-name": "~1.1.4"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=7.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/color-name": {\r
 +      "version": "1.1.4",\r
 +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",\r
 +      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/combined-stream": {\r
 +      "version": "1.0.8",\r
 +      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",\r
 +      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",\r
 +      "dependencies": {\r
 +        "delayed-stream": "~1.0.0"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 0.8"\r
 +      }\r
 +    },\r
 +    "node_modules/commander": {\r
 +      "version": "2.20.3",\r
 +      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",\r
 +      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "peer": true\r
 +    },\r
 +    "node_modules/cross-spawn": {\r
 +      "version": "7.0.3",\r
 +      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",\r
 +      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "path-key": "^3.1.0",\r
 +        "shebang-command": "^2.0.0",\r
 +        "which": "^2.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 8"\r
 +      }\r
 +    },\r
 +    "node_modules/cssesc": {\r
 +      "version": "3.0.0",\r
 +      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",\r
 +      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",\r
 +      "dev": true,\r
 +      "bin": {\r
 +        "cssesc": "bin/cssesc"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=4"\r
 +      }\r
 +    },\r
 +    "node_modules/csstype": {\r
 +      "version": "3.1.3",\r
 +      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",\r
 +      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="\r
 +    },\r
 +    "node_modules/delayed-stream": {\r
 +      "version": "1.0.0",\r
 +      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",\r
 +      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",\r
 +      "engines": {\r
 +        "node": ">=0.4.0"\r
 +      }\r
 +    },\r
 +    "node_modules/didyoumean": {\r
 +      "version": "1.2.2",\r
 +      "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",\r
 +      "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/dlv": {\r
 +      "version": "1.1.3",\r
 +      "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",\r
 +      "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/dompurify": {\r
 +      "version": "2.5.2",\r
 +      "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.2.tgz",\r
 +      "integrity": "sha512-5vSyvxRAb45EoWwAktUT3AYqAwXK4FL7si22Cgj46U6ICsj/YJczCN+Bk7WNABIQmpWRymGfslMhrRUZkQNnqA=="\r
 +    },\r
 +    "node_modules/eastasianwidth": {\r
 +      "version": "0.2.0",\r
 +      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",\r
 +      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/electron-to-chromium": {\r
 +      "version": "1.4.746",\r
 +      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.746.tgz",\r
 +      "integrity": "sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/emoji-regex": {\r
 +      "version": "9.2.2",\r
 +      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",\r
 +      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/entities": {\r
 +      "version": "4.5.0",\r
 +      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",\r
 +      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",\r
 +      "engines": {\r
 +        "node": ">=0.12"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/fb55/entities?sponsor=1"\r
 +      }\r
 +    },\r
 +    "node_modules/esbuild": {\r
 +      "version": "0.20.2",\r
 +      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",\r
 +      "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",\r
 +      "dev": true,\r
 +      "hasInstallScript": true,\r
 +      "bin": {\r
 +        "esbuild": "bin/esbuild"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=12"\r
 +      },\r
 +      "optionalDependencies": {\r
 +        "@esbuild/aix-ppc64": "0.20.2",\r
 +        "@esbuild/android-arm": "0.20.2",\r
 +        "@esbuild/android-arm64": "0.20.2",\r
 +        "@esbuild/android-x64": "0.20.2",\r
 +        "@esbuild/darwin-arm64": "0.20.2",\r
 +        "@esbuild/darwin-x64": "0.20.2",\r
 +        "@esbuild/freebsd-arm64": "0.20.2",\r
 +        "@esbuild/freebsd-x64": "0.20.2",\r
 +        "@esbuild/linux-arm": "0.20.2",\r
 +        "@esbuild/linux-arm64": "0.20.2",\r
 +        "@esbuild/linux-ia32": "0.20.2",\r
 +        "@esbuild/linux-loong64": "0.20.2",\r
 +        "@esbuild/linux-mips64el": "0.20.2",\r
 +        "@esbuild/linux-ppc64": "0.20.2",\r
 +        "@esbuild/linux-riscv64": "0.20.2",\r
 +        "@esbuild/linux-s390x": "0.20.2",\r
 +        "@esbuild/linux-x64": "0.20.2",\r
 +        "@esbuild/netbsd-x64": "0.20.2",\r
 +        "@esbuild/openbsd-x64": "0.20.2",\r
 +        "@esbuild/sunos-x64": "0.20.2",\r
 +        "@esbuild/win32-arm64": "0.20.2",\r
 +        "@esbuild/win32-ia32": "0.20.2",\r
 +        "@esbuild/win32-x64": "0.20.2"\r
 +      }\r
 +    },\r
 +    "node_modules/escalade": {\r
 +      "version": "3.1.2",\r
 +      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",\r
 +      "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=6"\r
 +      }\r
 +    },\r
 +    "node_modules/estree-walker": {\r
 +      "version": "2.0.2",\r
 +      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",\r
 +      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="\r
 +    },\r
 +    "node_modules/fast-glob": {\r
 +      "version": "3.3.2",\r
 +      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",\r
 +      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "@nodelib/fs.stat": "^2.0.2",\r
 +        "@nodelib/fs.walk": "^1.2.3",\r
 +        "glob-parent": "^5.1.2",\r
 +        "merge2": "^1.3.0",\r
 +        "micromatch": "^4.0.4"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8.6.0"\r
 +      }\r
 +    },\r
 +    "node_modules/fast-glob/node_modules/glob-parent": {\r
 +      "version": "5.1.2",\r
 +      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",\r
 +      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "is-glob": "^4.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 6"\r
 +      }\r
 +    },\r
 +    "node_modules/fastq": {\r
 +      "version": "1.17.1",\r
 +      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",\r
 +      "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "reusify": "^1.0.4"\r
 +      }\r
 +    },\r
 +    "node_modules/fill-range": {\r
 +      "version": "7.0.1",\r
 +      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",\r
 +      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "to-regex-range": "^5.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/follow-redirects": {\r
 +      "version": "1.15.6",\r
 +      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",\r
 +      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",\r
 +      "funding": [\r
 +        {\r
 +          "type": "individual",\r
 +          "url": "https://github.com/sponsors/RubenVerborgh"\r
 +        }\r
 +      ],\r
 +      "engines": {\r
 +        "node": ">=4.0"\r
 +      },\r
 +      "peerDependenciesMeta": {\r
 +        "debug": {\r
 +          "optional": true\r
 +        }\r
 +      }\r
 +    },\r
 +    "node_modules/foreground-child": {\r
 +      "version": "3.1.1",\r
 +      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",\r
 +      "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "cross-spawn": "^7.0.0",\r
 +        "signal-exit": "^4.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=14"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/isaacs"\r
 +      }\r
 +    },\r
 +    "node_modules/fraction.js": {\r
 +      "version": "4.3.7",\r
 +      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",\r
 +      "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": "*"\r
 +      },\r
 +      "funding": {\r
 +        "type": "patreon",\r
 +        "url": "https://github.com/sponsors/rawify"\r
 +      }\r
 +    },\r
-     "node_modules/fsevents": {\r
-       "version": "2.3.3",\r
-       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",\r
-       "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",\r
-       "dev": true,\r
-       "hasInstallScript": true,\r
-       "optional": true,\r
-       "os": [\r
-         "darwin"\r
-       ],\r
-       "engines": {\r
-         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"\r
-       }\r
-     },\r
 +    "node_modules/function-bind": {\r
 +      "version": "1.1.2",\r
 +      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",\r
 +      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",\r
 +      "dev": true,\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/ljharb"\r
 +      }\r
 +    },\r
 +    "node_modules/glob": {\r
 +      "version": "10.3.12",\r
 +      "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz",\r
 +      "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "foreground-child": "^3.1.0",\r
 +        "jackspeak": "^2.3.6",\r
 +        "minimatch": "^9.0.1",\r
 +        "minipass": "^7.0.4",\r
 +        "path-scurry": "^1.10.2"\r
 +      },\r
 +      "bin": {\r
 +        "glob": "dist/esm/bin.mjs"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=16 || 14 >=14.17"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/isaacs"\r
 +      }\r
 +    },\r
 +    "node_modules/glob-parent": {\r
 +      "version": "6.0.2",\r
 +      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",\r
 +      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "is-glob": "^4.0.3"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=10.13.0"\r
 +      }\r
 +    },\r
 +    "node_modules/hasown": {\r
 +      "version": "2.0.2",\r
 +      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",\r
 +      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "function-bind": "^1.1.2"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 0.4"\r
 +      }\r
 +    },\r
 +    "node_modules/immutable": {\r
 +      "version": "4.2.4",\r
 +      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz",\r
 +      "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==",\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "peer": true\r
 +    },\r
 +    "node_modules/is-binary-path": {\r
 +      "version": "2.1.0",\r
 +      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",\r
 +      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "binary-extensions": "^2.0.0"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/is-core-module": {\r
 +      "version": "2.13.1",\r
 +      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",\r
 +      "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "hasown": "^2.0.0"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/ljharb"\r
 +      }\r
 +    },\r
 +    "node_modules/is-extglob": {\r
 +      "version": "2.1.1",\r
 +      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",\r
 +      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=0.10.0"\r
 +      }\r
 +    },\r
 +    "node_modules/is-fullwidth-code-point": {\r
 +      "version": "3.0.0",\r
 +      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",\r
 +      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/is-glob": {\r
 +      "version": "4.0.3",\r
 +      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",\r
 +      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "is-extglob": "^2.1.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=0.10.0"\r
 +      }\r
 +    },\r
 +    "node_modules/is-number": {\r
 +      "version": "7.0.0",\r
 +      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",\r
 +      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=0.12.0"\r
 +      }\r
 +    },\r
 +    "node_modules/isexe": {\r
 +      "version": "2.0.0",\r
 +      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",\r
 +      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/jackspeak": {\r
 +      "version": "2.3.6",\r
 +      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",\r
 +      "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "@isaacs/cliui": "^8.0.2"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=14"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/isaacs"\r
 +      },\r
 +      "optionalDependencies": {\r
 +        "@pkgjs/parseargs": "^0.11.0"\r
 +      }\r
 +    },\r
 +    "node_modules/jiti": {\r
 +      "version": "1.21.0",\r
 +      "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",\r
 +      "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",\r
 +      "dev": true,\r
 +      "bin": {\r
 +        "jiti": "bin/jiti.js"\r
 +      }\r
 +    },\r
 +    "node_modules/lilconfig": {\r
 +      "version": "2.1.0",\r
 +      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",\r
 +      "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=10"\r
 +      }\r
 +    },\r
 +    "node_modules/lines-and-columns": {\r
 +      "version": "1.2.4",\r
 +      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",\r
 +      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/lru-cache": {\r
 +      "version": "10.2.0",\r
 +      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",\r
 +      "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": "14 || >=16.14"\r
 +      }\r
 +    },\r
 +    "node_modules/magic-string": {\r
 +      "version": "0.30.10",\r
 +      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",\r
 +      "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",\r
 +      "dependencies": {\r
 +        "@jridgewell/sourcemap-codec": "^1.4.15"\r
 +      }\r
 +    },\r
 +    "node_modules/merge2": {\r
 +      "version": "1.4.1",\r
 +      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",\r
 +      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">= 8"\r
 +      }\r
 +    },\r
 +    "node_modules/micromatch": {\r
 +      "version": "4.0.5",\r
 +      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",\r
 +      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "braces": "^3.0.2",\r
 +        "picomatch": "^2.3.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8.6"\r
 +      }\r
 +    },\r
 +    "node_modules/mime-db": {\r
 +      "version": "1.52.0",\r
 +      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",\r
 +      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",\r
 +      "engines": {\r
 +        "node": ">= 0.6"\r
 +      }\r
 +    },\r
 +    "node_modules/mime-types": {\r
 +      "version": "2.1.35",\r
 +      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",\r
 +      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",\r
 +      "dependencies": {\r
 +        "mime-db": "1.52.0"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 0.6"\r
 +      }\r
 +    },\r
 +    "node_modules/minimatch": {\r
 +      "version": "9.0.4",\r
 +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",\r
 +      "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "brace-expansion": "^2.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=16 || 14 >=14.17"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/isaacs"\r
 +      }\r
 +    },\r
 +    "node_modules/minipass": {\r
 +      "version": "7.0.4",\r
 +      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",\r
 +      "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=16 || 14 >=14.17"\r
 +      }\r
 +    },\r
 +    "node_modules/mousetrap": {\r
 +      "version": "1.6.5",\r
 +      "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz",\r
 +      "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA=="\r
 +    },\r
 +    "node_modules/mz": {\r
 +      "version": "2.7.0",\r
 +      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",\r
 +      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "any-promise": "^1.0.0",\r
 +        "object-assign": "^4.0.1",\r
 +        "thenify-all": "^1.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/nanoid": {\r
 +      "version": "3.3.7",\r
 +      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",\r
 +      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",\r
 +      "funding": [\r
 +        {\r
 +          "type": "github",\r
 +          "url": "https://github.com/sponsors/ai"\r
 +        }\r
 +      ],\r
 +      "bin": {\r
 +        "nanoid": "bin/nanoid.cjs"\r
 +      },\r
 +      "engines": {\r
 +        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"\r
 +      }\r
 +    },\r
 +    "node_modules/node-releases": {\r
 +      "version": "2.0.14",\r
 +      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",\r
 +      "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/normalize-path": {\r
 +      "version": "3.0.0",\r
 +      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",\r
 +      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=0.10.0"\r
 +      }\r
 +    },\r
 +    "node_modules/normalize-range": {\r
 +      "version": "0.1.2",\r
 +      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",\r
 +      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=0.10.0"\r
 +      }\r
 +    },\r
 +    "node_modules/object-assign": {\r
 +      "version": "4.1.1",\r
 +      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",\r
 +      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=0.10.0"\r
 +      }\r
 +    },\r
 +    "node_modules/object-hash": {\r
 +      "version": "3.0.0",\r
 +      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",\r
 +      "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">= 6"\r
 +      }\r
 +    },\r
 +    "node_modules/orderedmap": {\r
 +      "version": "2.1.1",\r
 +      "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz",\r
 +      "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g=="\r
 +    },\r
 +    "node_modules/path-key": {\r
 +      "version": "3.1.1",\r
 +      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",\r
 +      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/path-parse": {\r
 +      "version": "1.0.7",\r
 +      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",\r
 +      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/path-scurry": {\r
 +      "version": "1.10.2",\r
 +      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz",\r
 +      "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "lru-cache": "^10.2.0",\r
 +        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=16 || 14 >=14.17"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/isaacs"\r
 +      }\r
 +    },\r
 +    "node_modules/picocolors": {\r
 +      "version": "1.0.0",\r
 +      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",\r
 +      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="\r
 +    },\r
 +    "node_modules/picomatch": {\r
 +      "version": "2.3.1",\r
 +      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",\r
 +      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=8.6"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/jonschlinkert"\r
 +      }\r
 +    },\r
 +    "node_modules/pify": {\r
 +      "version": "2.3.0",\r
 +      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",\r
 +      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=0.10.0"\r
 +      }\r
 +    },\r
 +    "node_modules/pinia": {\r
 +      "version": "2.1.7",\r
 +      "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz",\r
 +      "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==",\r
 +      "dependencies": {\r
 +        "@vue/devtools-api": "^6.5.0",\r
 +        "vue-demi": ">=0.14.5"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/posva"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "@vue/composition-api": "^1.4.0",\r
 +        "typescript": ">=4.4.4",\r
 +        "vue": "^2.6.14 || ^3.3.0"\r
 +      },\r
 +      "peerDependenciesMeta": {\r
 +        "@vue/composition-api": {\r
 +          "optional": true\r
 +        },\r
 +        "typescript": {\r
 +          "optional": true\r
 +        }\r
 +      }\r
 +    },\r
 +    "node_modules/pinia/node_modules/vue-demi": {\r
 +      "version": "0.14.7",\r
 +      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",\r
 +      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",\r
 +      "hasInstallScript": true,\r
 +      "bin": {\r
 +        "vue-demi-fix": "bin/vue-demi-fix.js",\r
 +        "vue-demi-switch": "bin/vue-demi-switch.js"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=12"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/antfu"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "@vue/composition-api": "^1.0.0-rc.1",\r
 +        "vue": "^3.0.0-0 || ^2.6.0"\r
 +      },\r
 +      "peerDependenciesMeta": {\r
 +        "@vue/composition-api": {\r
 +          "optional": true\r
 +        }\r
 +      }\r
 +    },\r
 +    "node_modules/pirates": {\r
 +      "version": "4.0.6",\r
 +      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",\r
 +      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">= 6"\r
 +      }\r
 +    },\r
 +    "node_modules/postcss": {\r
 +      "version": "8.4.38",\r
 +      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",\r
 +      "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",\r
 +      "funding": [\r
 +        {\r
 +          "type": "opencollective",\r
 +          "url": "https://opencollective.com/postcss/"\r
 +        },\r
 +        {\r
 +          "type": "tidelift",\r
 +          "url": "https://tidelift.com/funding/github/npm/postcss"\r
 +        },\r
 +        {\r
 +          "type": "github",\r
 +          "url": "https://github.com/sponsors/ai"\r
 +        }\r
 +      ],\r
 +      "dependencies": {\r
 +        "nanoid": "^3.3.7",\r
 +        "picocolors": "^1.0.0",\r
 +        "source-map-js": "^1.2.0"\r
 +      },\r
 +      "engines": {\r
 +        "node": "^10 || ^12 || >=14"\r
 +      }\r
 +    },\r
 +    "node_modules/postcss-import": {\r
 +      "version": "15.1.0",\r
 +      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",\r
 +      "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "postcss-value-parser": "^4.0.0",\r
 +        "read-cache": "^1.0.0",\r
 +        "resolve": "^1.1.7"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=14.0.0"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "postcss": "^8.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/postcss-js": {\r
 +      "version": "4.0.1",\r
 +      "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",\r
 +      "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "camelcase-css": "^2.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": "^12 || ^14 || >= 16"\r
 +      },\r
 +      "funding": {\r
 +        "type": "opencollective",\r
 +        "url": "https://opencollective.com/postcss/"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "postcss": "^8.4.21"\r
 +      }\r
 +    },\r
 +    "node_modules/postcss-load-config": {\r
 +      "version": "4.0.2",\r
 +      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",\r
 +      "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",\r
 +      "dev": true,\r
 +      "funding": [\r
 +        {\r
 +          "type": "opencollective",\r
 +          "url": "https://opencollective.com/postcss/"\r
 +        },\r
 +        {\r
 +          "type": "github",\r
 +          "url": "https://github.com/sponsors/ai"\r
 +        }\r
 +      ],\r
 +      "dependencies": {\r
 +        "lilconfig": "^3.0.0",\r
 +        "yaml": "^2.3.4"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 14"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "postcss": ">=8.0.9",\r
 +        "ts-node": ">=9.0.0"\r
 +      },\r
 +      "peerDependenciesMeta": {\r
 +        "postcss": {\r
 +          "optional": true\r
 +        },\r
 +        "ts-node": {\r
 +          "optional": true\r
 +        }\r
 +      }\r
 +    },\r
 +    "node_modules/postcss-load-config/node_modules/lilconfig": {\r
 +      "version": "3.1.1",\r
 +      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",\r
 +      "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=14"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/antonk52"\r
 +      }\r
 +    },\r
 +    "node_modules/postcss-nested": {\r
 +      "version": "6.0.1",\r
 +      "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",\r
 +      "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "postcss-selector-parser": "^6.0.11"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=12.0"\r
 +      },\r
 +      "funding": {\r
 +        "type": "opencollective",\r
 +        "url": "https://opencollective.com/postcss/"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "postcss": "^8.2.14"\r
 +      }\r
 +    },\r
 +    "node_modules/postcss-selector-parser": {\r
 +      "version": "6.0.16",\r
 +      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",\r
 +      "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "cssesc": "^3.0.0",\r
 +        "util-deprecate": "^1.0.2"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=4"\r
 +      }\r
 +    },\r
 +    "node_modules/postcss-value-parser": {\r
 +      "version": "4.2.0",\r
 +      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",\r
 +      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/prettier": {\r
 +      "version": "3.2.5",\r
 +      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",\r
 +      "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",\r
 +      "dev": true,\r
 +      "bin": {\r
 +        "prettier": "bin/prettier.cjs"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=14"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/prettier/prettier?sponsor=1"\r
 +      }\r
 +    },\r
 +    "node_modules/prettier-plugin-tailwindcss": {\r
 +      "version": "0.5.14",\r
 +      "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.14.tgz",\r
 +      "integrity": "sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=14.21.3"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "@ianvs/prettier-plugin-sort-imports": "*",\r
 +        "@prettier/plugin-pug": "*",\r
 +        "@shopify/prettier-plugin-liquid": "*",\r
 +        "@trivago/prettier-plugin-sort-imports": "*",\r
 +        "@zackad/prettier-plugin-twig-melody": "*",\r
 +        "prettier": "^3.0",\r
 +        "prettier-plugin-astro": "*",\r
 +        "prettier-plugin-css-order": "*",\r
 +        "prettier-plugin-import-sort": "*",\r
 +        "prettier-plugin-jsdoc": "*",\r
 +        "prettier-plugin-marko": "*",\r
 +        "prettier-plugin-organize-attributes": "*",\r
 +        "prettier-plugin-organize-imports": "*",\r
 +        "prettier-plugin-sort-imports": "*",\r
 +        "prettier-plugin-style-order": "*",\r
 +        "prettier-plugin-svelte": "*"\r
 +      },\r
 +      "peerDependenciesMeta": {\r
 +        "@ianvs/prettier-plugin-sort-imports": {\r
 +          "optional": true\r
 +        },\r
 +        "@prettier/plugin-pug": {\r
 +          "optional": true\r
 +        },\r
 +        "@shopify/prettier-plugin-liquid": {\r
 +          "optional": true\r
 +        },\r
 +        "@trivago/prettier-plugin-sort-imports": {\r
 +          "optional": true\r
 +        },\r
 +        "@zackad/prettier-plugin-twig-melody": {\r
 +          "optional": true\r
 +        },\r
 +        "prettier-plugin-astro": {\r
 +          "optional": true\r
 +        },\r
 +        "prettier-plugin-css-order": {\r
 +          "optional": true\r
 +        },\r
 +        "prettier-plugin-import-sort": {\r
 +          "optional": true\r
 +        },\r
 +        "prettier-plugin-jsdoc": {\r
 +          "optional": true\r
 +        },\r
 +        "prettier-plugin-marko": {\r
 +          "optional": true\r
 +        },\r
 +        "prettier-plugin-organize-attributes": {\r
 +          "optional": true\r
 +        },\r
 +        "prettier-plugin-organize-imports": {\r
 +          "optional": true\r
 +        },\r
 +        "prettier-plugin-sort-imports": {\r
 +          "optional": true\r
 +        },\r
 +        "prettier-plugin-style-order": {\r
 +          "optional": true\r
 +        },\r
 +        "prettier-plugin-svelte": {\r
 +          "optional": true\r
 +        }\r
 +      }\r
 +    },\r
 +    "node_modules/primevue": {\r
 +      "version": "3.52.0",\r
 +      "resolved": "https://registry.npmjs.org/primevue/-/primevue-3.52.0.tgz",\r
 +      "integrity": "sha512-HLOVP5YI0ArFKUhIyfZsWmTNMaBYNCBWC/3DYvdd/Po4LY5/WXf7yIYvArE2q/3OuwSXJXvjlR8UNQeJYRSQog==",\r
 +      "peerDependencies": {\r
 +        "vue": "^3.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/prismjs": {\r
 +      "version": "1.29.0",\r
 +      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",\r
 +      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",\r
 +      "engines": {\r
 +        "node": ">=6"\r
 +      }\r
 +    },\r
 +    "node_modules/prosemirror-commands": {\r
 +      "version": "1.5.2",\r
 +      "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz",\r
 +      "integrity": "sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==",\r
 +      "dependencies": {\r
 +        "prosemirror-model": "^1.0.0",\r
 +        "prosemirror-state": "^1.0.0",\r
 +        "prosemirror-transform": "^1.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/prosemirror-history": {\r
 +      "version": "1.4.0",\r
 +      "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.0.tgz",\r
 +      "integrity": "sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ==",\r
 +      "dependencies": {\r
 +        "prosemirror-state": "^1.2.2",\r
 +        "prosemirror-transform": "^1.0.0",\r
 +        "prosemirror-view": "^1.31.0",\r
 +        "rope-sequence": "^1.3.0"\r
 +      }\r
 +    },\r
 +    "node_modules/prosemirror-inputrules": {\r
 +      "version": "1.4.0",\r
 +      "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz",\r
 +      "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==",\r
 +      "dependencies": {\r
 +        "prosemirror-state": "^1.0.0",\r
 +        "prosemirror-transform": "^1.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/prosemirror-keymap": {\r
 +      "version": "1.2.2",\r
 +      "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz",\r
 +      "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==",\r
 +      "dependencies": {\r
 +        "prosemirror-state": "^1.0.0",\r
 +        "w3c-keyname": "^2.2.0"\r
 +      }\r
 +    },\r
 +    "node_modules/prosemirror-model": {\r
 +      "version": "1.20.0",\r
 +      "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.20.0.tgz",\r
 +      "integrity": "sha512-q7AY7vMjKYqDCeoedgUiAgrLabliXxndJuuFmcmc2+YU1SblvnOiG2WEACF2lwAZsMlfLpiAilA3L+TWlDqIsQ==",\r
 +      "dependencies": {\r
 +        "orderedmap": "^2.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/prosemirror-state": {\r
 +      "version": "1.4.3",\r
 +      "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz",\r
 +      "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==",\r
 +      "dependencies": {\r
 +        "prosemirror-model": "^1.0.0",\r
 +        "prosemirror-transform": "^1.0.0",\r
 +        "prosemirror-view": "^1.27.0"\r
 +      }\r
 +    },\r
 +    "node_modules/prosemirror-transform": {\r
 +      "version": "1.8.0",\r
 +      "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.8.0.tgz",\r
 +      "integrity": "sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==",\r
 +      "dependencies": {\r
 +        "prosemirror-model": "^1.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/prosemirror-view": {\r
 +      "version": "1.33.6",\r
 +      "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.6.tgz",\r
 +      "integrity": "sha512-zRLUNgLIQfd8IfGprsXxWTjdA8xEAFJe8cDNrOptj6Mop9sj+BMeVbJvceyAYCm5G2dOdT2prctH7K9dfnpIMw==",\r
 +      "dependencies": {\r
 +        "prosemirror-model": "^1.20.0",\r
 +        "prosemirror-state": "^1.0.0",\r
 +        "prosemirror-transform": "^1.1.0"\r
 +      }\r
 +    },\r
 +    "node_modules/proxy-from-env": {\r
 +      "version": "1.1.0",\r
 +      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",\r
 +      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="\r
 +    },\r
 +    "node_modules/queue-microtask": {\r
 +      "version": "1.2.3",\r
 +      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",\r
 +      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",\r
 +      "dev": true,\r
 +      "funding": [\r
 +        {\r
 +          "type": "github",\r
 +          "url": "https://github.com/sponsors/feross"\r
 +        },\r
 +        {\r
 +          "type": "patreon",\r
 +          "url": "https://www.patreon.com/feross"\r
 +        },\r
 +        {\r
 +          "type": "consulting",\r
 +          "url": "https://feross.org/support"\r
 +        }\r
 +      ]\r
 +    },\r
 +    "node_modules/read-cache": {\r
 +      "version": "1.0.0",\r
 +      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",\r
 +      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "pify": "^2.3.0"\r
 +      }\r
 +    },\r
 +    "node_modules/readdirp": {\r
 +      "version": "3.6.0",\r
 +      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",\r
 +      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "picomatch": "^2.2.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8.10.0"\r
 +      }\r
 +    },\r
 +    "node_modules/resolve": {\r
 +      "version": "1.22.8",\r
 +      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",\r
 +      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "is-core-module": "^2.13.0",\r
 +        "path-parse": "^1.0.7",\r
 +        "supports-preserve-symlinks-flag": "^1.0.0"\r
 +      },\r
 +      "bin": {\r
 +        "resolve": "bin/resolve"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/ljharb"\r
 +      }\r
 +    },\r
 +    "node_modules/reusify": {\r
 +      "version": "1.0.4",\r
 +      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",\r
 +      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "iojs": ">=1.0.0",\r
 +        "node": ">=0.10.0"\r
 +      }\r
 +    },\r
 +    "node_modules/rollup": {\r
 +      "version": "4.14.3",\r
 +      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz",\r
 +      "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "@types/estree": "1.0.5"\r
 +      },\r
 +      "bin": {\r
 +        "rollup": "dist/bin/rollup"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=18.0.0",\r
 +        "npm": ">=8.0.0"\r
 +      },\r
 +      "optionalDependencies": {\r
 +        "@rollup/rollup-android-arm-eabi": "4.14.3",\r
 +        "@rollup/rollup-android-arm64": "4.14.3",\r
 +        "@rollup/rollup-darwin-arm64": "4.14.3",\r
 +        "@rollup/rollup-darwin-x64": "4.14.3",\r
 +        "@rollup/rollup-linux-arm-gnueabihf": "4.14.3",\r
 +        "@rollup/rollup-linux-arm-musleabihf": "4.14.3",\r
 +        "@rollup/rollup-linux-arm64-gnu": "4.14.3",\r
 +        "@rollup/rollup-linux-arm64-musl": "4.14.3",\r
 +        "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3",\r
 +        "@rollup/rollup-linux-riscv64-gnu": "4.14.3",\r
 +        "@rollup/rollup-linux-s390x-gnu": "4.14.3",\r
 +        "@rollup/rollup-linux-x64-gnu": "4.14.3",\r
 +        "@rollup/rollup-linux-x64-musl": "4.14.3",\r
 +        "@rollup/rollup-win32-arm64-msvc": "4.14.3",\r
 +        "@rollup/rollup-win32-ia32-msvc": "4.14.3",\r
 +        "@rollup/rollup-win32-x64-msvc": "4.14.3",\r
 +        "fsevents": "~2.3.2"\r
 +      }\r
 +    },\r
 +    "node_modules/rope-sequence": {\r
 +      "version": "1.3.4",\r
 +      "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz",\r
 +      "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ=="\r
 +    },\r
 +    "node_modules/run-parallel": {\r
 +      "version": "1.2.0",\r
 +      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",\r
 +      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",\r
 +      "dev": true,\r
 +      "funding": [\r
 +        {\r
 +          "type": "github",\r
 +          "url": "https://github.com/sponsors/feross"\r
 +        },\r
 +        {\r
 +          "type": "patreon",\r
 +          "url": "https://www.patreon.com/feross"\r
 +        },\r
 +        {\r
 +          "type": "consulting",\r
 +          "url": "https://feross.org/support"\r
 +        }\r
 +      ],\r
 +      "dependencies": {\r
 +        "queue-microtask": "^1.2.2"\r
 +      }\r
 +    },\r
 +    "node_modules/sass": {\r
 +      "version": "1.74.1",\r
 +      "resolved": "https://registry.npmjs.org/sass/-/sass-1.74.1.tgz",\r
 +      "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==",\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "peer": true,\r
 +      "dependencies": {\r
 +        "chokidar": ">=3.0.0 <4.0.0",\r
 +        "immutable": "^4.0.0",\r
 +        "source-map-js": ">=0.6.2 <2.0.0"\r
 +      },\r
 +      "bin": {\r
 +        "sass": "sass.js"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=14.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/shebang-command": {\r
 +      "version": "2.0.0",\r
 +      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",\r
 +      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "shebang-regex": "^3.0.0"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/shebang-regex": {\r
 +      "version": "3.0.0",\r
 +      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",\r
 +      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/signal-exit": {\r
 +      "version": "4.1.0",\r
 +      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",\r
 +      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=14"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/isaacs"\r
 +      }\r
 +    },\r
 +    "node_modules/source-map": {\r
 +      "version": "0.6.1",\r
 +      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",\r
 +      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "peer": true,\r
 +      "engines": {\r
 +        "node": ">=0.10.0"\r
 +      }\r
 +    },\r
 +    "node_modules/source-map-js": {\r
 +      "version": "1.2.0",\r
 +      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",\r
 +      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",\r
 +      "engines": {\r
 +        "node": ">=0.10.0"\r
 +      }\r
 +    },\r
 +    "node_modules/source-map-support": {\r
 +      "version": "0.5.21",\r
 +      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",\r
 +      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "peer": true,\r
 +      "dependencies": {\r
 +        "buffer-from": "^1.0.0",\r
 +        "source-map": "^0.6.0"\r
 +      }\r
 +    },\r
 +    "node_modules/string-width": {\r
 +      "version": "5.1.2",\r
 +      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",\r
 +      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "eastasianwidth": "^0.2.0",\r
 +        "emoji-regex": "^9.2.2",\r
 +        "strip-ansi": "^7.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=12"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/sindresorhus"\r
 +      }\r
 +    },\r
 +    "node_modules/string-width-cjs": {\r
 +      "name": "string-width",\r
 +      "version": "4.2.3",\r
 +      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",\r
 +      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "emoji-regex": "^8.0.0",\r
 +        "is-fullwidth-code-point": "^3.0.0",\r
 +        "strip-ansi": "^6.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/string-width-cjs/node_modules/ansi-regex": {\r
 +      "version": "5.0.1",\r
 +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",\r
 +      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/string-width-cjs/node_modules/emoji-regex": {\r
 +      "version": "8.0.0",\r
 +      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",\r
 +      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/string-width-cjs/node_modules/strip-ansi": {\r
 +      "version": "6.0.1",\r
 +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",\r
 +      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "ansi-regex": "^5.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/strip-ansi": {\r
 +      "version": "7.1.0",\r
 +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",\r
 +      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "ansi-regex": "^6.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=12"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/chalk/strip-ansi?sponsor=1"\r
 +      }\r
 +    },\r
 +    "node_modules/strip-ansi-cjs": {\r
 +      "name": "strip-ansi",\r
 +      "version": "6.0.1",\r
 +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",\r
 +      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "ansi-regex": "^5.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {\r
 +      "version": "5.0.1",\r
 +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",\r
 +      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/sucrase": {\r
 +      "version": "3.35.0",\r
 +      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",\r
 +      "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "@jridgewell/gen-mapping": "^0.3.2",\r
 +        "commander": "^4.0.0",\r
 +        "glob": "^10.3.10",\r
 +        "lines-and-columns": "^1.1.6",\r
 +        "mz": "^2.7.0",\r
 +        "pirates": "^4.0.1",\r
 +        "ts-interface-checker": "^0.1.9"\r
 +      },\r
 +      "bin": {\r
 +        "sucrase": "bin/sucrase",\r
 +        "sucrase-node": "bin/sucrase-node"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=16 || 14 >=14.17"\r
 +      }\r
 +    },\r
 +    "node_modules/sucrase/node_modules/commander": {\r
 +      "version": "4.1.1",\r
 +      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",\r
 +      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">= 6"\r
 +      }\r
 +    },\r
 +    "node_modules/supports-preserve-symlinks-flag": {\r
 +      "version": "1.0.0",\r
 +      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",\r
 +      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">= 0.4"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/ljharb"\r
 +      }\r
 +    },\r
 +    "node_modules/tailwindcss": {\r
 +      "version": "3.4.3",\r
 +      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz",\r
 +      "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "@alloc/quick-lru": "^5.2.0",\r
 +        "arg": "^5.0.2",\r
 +        "chokidar": "^3.5.3",\r
 +        "didyoumean": "^1.2.2",\r
 +        "dlv": "^1.1.3",\r
 +        "fast-glob": "^3.3.0",\r
 +        "glob-parent": "^6.0.2",\r
 +        "is-glob": "^4.0.3",\r
 +        "jiti": "^1.21.0",\r
 +        "lilconfig": "^2.1.0",\r
 +        "micromatch": "^4.0.5",\r
 +        "normalize-path": "^3.0.0",\r
 +        "object-hash": "^3.0.0",\r
 +        "picocolors": "^1.0.0",\r
 +        "postcss": "^8.4.23",\r
 +        "postcss-import": "^15.1.0",\r
 +        "postcss-js": "^4.0.1",\r
 +        "postcss-load-config": "^4.0.1",\r
 +        "postcss-nested": "^6.0.1",\r
 +        "postcss-selector-parser": "^6.0.11",\r
 +        "resolve": "^1.22.2",\r
 +        "sucrase": "^3.32.0"\r
 +      },\r
 +      "bin": {\r
 +        "tailwind": "lib/cli.js",\r
 +        "tailwindcss": "lib/cli.js"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=14.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/terser": {\r
 +      "version": "5.30.3",\r
 +      "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz",\r
 +      "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==",\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "peer": true,\r
 +      "dependencies": {\r
 +        "@jridgewell/source-map": "^0.3.3",\r
 +        "acorn": "^8.8.2",\r
 +        "commander": "^2.20.0",\r
 +        "source-map-support": "~0.5.20"\r
 +      },\r
 +      "bin": {\r
 +        "terser": "bin/terser"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=10"\r
 +      }\r
 +    },\r
 +    "node_modules/terser/node_modules/acorn": {\r
 +      "version": "8.11.3",\r
 +      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",\r
 +      "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",\r
 +      "dev": true,\r
 +      "optional": true,\r
 +      "peer": true,\r
 +      "bin": {\r
 +        "acorn": "bin/acorn"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=0.4.0"\r
 +      }\r
 +    },\r
 +    "node_modules/thenify": {\r
 +      "version": "3.3.1",\r
 +      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",\r
 +      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "any-promise": "^1.0.0"\r
 +      }\r
 +    },\r
 +    "node_modules/thenify-all": {\r
 +      "version": "1.6.0",\r
 +      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",\r
 +      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "thenify": ">= 3.1.0 < 4"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=0.8"\r
 +      }\r
 +    },\r
 +    "node_modules/to-regex-range": {\r
 +      "version": "5.0.1",\r
 +      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",\r
 +      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "is-number": "^7.0.0"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8.0"\r
 +      }\r
 +    },\r
 +    "node_modules/ts-interface-checker": {\r
 +      "version": "0.1.13",\r
 +      "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",\r
 +      "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/update-browserslist-db": {\r
 +      "version": "1.0.13",\r
 +      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",\r
 +      "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",\r
 +      "dev": true,\r
 +      "funding": [\r
 +        {\r
 +          "type": "opencollective",\r
 +          "url": "https://opencollective.com/browserslist"\r
 +        },\r
 +        {\r
 +          "type": "tidelift",\r
 +          "url": "https://tidelift.com/funding/github/npm/browserslist"\r
 +        },\r
 +        {\r
 +          "type": "github",\r
 +          "url": "https://github.com/sponsors/ai"\r
 +        }\r
 +      ],\r
 +      "dependencies": {\r
 +        "escalade": "^3.1.1",\r
 +        "picocolors": "^1.0.0"\r
 +      },\r
 +      "bin": {\r
 +        "update-browserslist-db": "cli.js"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "browserslist": ">= 4.21.0"\r
 +      }\r
 +    },\r
 +    "node_modules/util-deprecate": {\r
 +      "version": "1.0.2",\r
 +      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",\r
 +      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/vite": {\r
 +      "version": "5.2.11",\r
 +      "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz",\r
 +      "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "esbuild": "^0.20.1",\r
 +        "postcss": "^8.4.38",\r
 +        "rollup": "^4.13.0"\r
 +      },\r
 +      "bin": {\r
 +        "vite": "bin/vite.js"\r
 +      },\r
 +      "engines": {\r
 +        "node": "^18.0.0 || >=20.0.0"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/vitejs/vite?sponsor=1"\r
 +      },\r
 +      "optionalDependencies": {\r
 +        "fsevents": "~2.3.3"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "@types/node": "^18.0.0 || >=20.0.0",\r
 +        "less": "*",\r
 +        "lightningcss": "^1.21.0",\r
 +        "sass": "*",\r
 +        "stylus": "*",\r
 +        "sugarss": "*",\r
 +        "terser": "^5.4.0"\r
 +      },\r
 +      "peerDependenciesMeta": {\r
 +        "@types/node": {\r
 +          "optional": true\r
 +        },\r
 +        "less": {\r
 +          "optional": true\r
 +        },\r
 +        "lightningcss": {\r
 +          "optional": true\r
 +        },\r
 +        "sass": {\r
 +          "optional": true\r
 +        },\r
 +        "stylus": {\r
 +          "optional": true\r
 +        },\r
 +        "sugarss": {\r
 +          "optional": true\r
 +        },\r
 +        "terser": {\r
 +          "optional": true\r
 +        }\r
 +      }\r
 +    },\r
 +    "node_modules/vue": {\r
 +      "version": "3.4.27",\r
 +      "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz",\r
 +      "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==",\r
 +      "dependencies": {\r
 +        "@vue/compiler-dom": "3.4.27",\r
 +        "@vue/compiler-sfc": "3.4.27",\r
 +        "@vue/runtime-dom": "3.4.27",\r
 +        "@vue/server-renderer": "3.4.27",\r
 +        "@vue/shared": "3.4.27"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "typescript": "*"\r
 +      },\r
 +      "peerDependenciesMeta": {\r
 +        "typescript": {\r
 +          "optional": true\r
 +        }\r
 +      }\r
 +    },\r
 +    "node_modules/vue-router": {\r
 +      "version": "4.3.2",\r
 +      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.2.tgz",\r
 +      "integrity": "sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==",\r
 +      "dependencies": {\r
 +        "@vue/devtools-api": "^6.5.1"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/sponsors/posva"\r
 +      },\r
 +      "peerDependencies": {\r
 +        "vue": "^3.2.0"\r
 +      }\r
 +    },\r
 +    "node_modules/w3c-keyname": {\r
 +      "version": "2.2.8",\r
 +      "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",\r
 +      "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="\r
 +    },\r
 +    "node_modules/which": {\r
 +      "version": "2.0.2",\r
 +      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",\r
 +      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "isexe": "^2.0.0"\r
 +      },\r
 +      "bin": {\r
 +        "node-which": "bin/node-which"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 8"\r
 +      }\r
 +    },\r
 +    "node_modules/wrap-ansi": {\r
 +      "version": "8.1.0",\r
 +      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",\r
 +      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "ansi-styles": "^6.1.0",\r
 +        "string-width": "^5.0.1",\r
 +        "strip-ansi": "^7.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=12"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"\r
 +      }\r
 +    },\r
 +    "node_modules/wrap-ansi-cjs": {\r
 +      "name": "wrap-ansi",\r
 +      "version": "7.0.0",\r
 +      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",\r
 +      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "ansi-styles": "^4.0.0",\r
 +        "string-width": "^4.1.0",\r
 +        "strip-ansi": "^6.0.0"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=10"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"\r
 +      }\r
 +    },\r
 +    "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {\r
 +      "version": "5.0.1",\r
 +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",\r
 +      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",\r
 +      "dev": true,\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {\r
 +      "version": "4.3.0",\r
 +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",\r
 +      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "color-convert": "^2.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      },\r
 +      "funding": {\r
 +        "url": "https://github.com/chalk/ansi-styles?sponsor=1"\r
 +      }\r
 +    },\r
 +    "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {\r
 +      "version": "8.0.0",\r
 +      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",\r
 +      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",\r
 +      "dev": true\r
 +    },\r
 +    "node_modules/wrap-ansi-cjs/node_modules/string-width": {\r
 +      "version": "4.2.3",\r
 +      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",\r
 +      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "emoji-regex": "^8.0.0",\r
 +        "is-fullwidth-code-point": "^3.0.0",\r
 +        "strip-ansi": "^6.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {\r
 +      "version": "6.0.1",\r
 +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",\r
 +      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",\r
 +      "dev": true,\r
 +      "dependencies": {\r
 +        "ansi-regex": "^5.0.1"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">=8"\r
 +      }\r
 +    },\r
 +    "node_modules/yaml": {\r
 +      "version": "2.4.1",\r
 +      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",\r
 +      "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",\r
 +      "dev": true,\r
 +      "bin": {\r
 +        "yaml": "bin.mjs"\r
 +      },\r
 +      "engines": {\r
 +        "node": ">= 14"\r
 +      }\r
 +    }\r
 +  }\r
 +}\r
diff --cc package.json
index 462ae9e4d8deb2df533d3bfbf36e96ccf355d2a5,b3b5feb46ecce05b51948eebc1f1b87f8f655a4b..fb96af923deae61c15c17e181c8b5197e8662fd6
@@@ -1,36 -1,22 +1,36 @@@
 -{
 -  "name": "flatnotes",
 -  "version": "4.0.5",
 -  "description": "A database-less note taking web app that utilises a flat folder of markdown files for storage.",
 -  "main": "client/index.html",
 -  "scripts": {
 -    "test": "echo \"Error: no test specified\" && exit 1",
 -    "build": "vite build",
 -    "watch": "vite build --watch"
 -  },
 -  "author": "Adam Dullage",
 -  "license": "MIT",
 -  "devDependencies": {
 -    "@toast-ui/editor-plugin-code-syntax-highlight": "3.1.0",
 -    "@toast-ui/vue-editor": "3.2.3",
 -    "@vitejs/plugin-vue2": "^2.3.1",
 -    "axios": "1.6.8",
 -    "bootstrap-vue": "2.23.1",
 -    "mousetrap": "1.6.5",
 -    "vite": "^5.2.9"
 -  }
 -}
 +{\r
 +  "name": "flatnotes",\r
-   "version": "4.0.4",\r
++  "version": "4.0.5",\r
 +  "description": "A database-less note taking web app that utilises a flat folder of markdown files for storage.",\r
 +  "main": "client/index.html",\r
 +  "scripts": {\r
 +    "test": "echo \"Error: no test specified\" && exit 1",\r
 +    "build": "vite build",\r
 +    "watch": "vite build --watch",\r
 +    "dev": "vite"\r
 +  },\r
 +  "author": "Adam Dullage",\r
 +  "license": "MIT",\r
 +  "dependencies": {\r
 +    "@jamescoyle/vue-icon": "0.1.2",\r
 +    "@mdi/js": "7.4.47",\r
 +    "@mdi/light-js": "0.2.63",\r
 +    "@toast-ui/editor": "3.2.2",\r
 +    "@toast-ui/editor-plugin-code-syntax-highlight": "3.1.0",\r
 +    "axios": "1.6.8",\r
 +    "mousetrap": "1.6.5",\r
 +    "pinia": "2.1.7",\r
 +    "primevue": "3.52.0",\r
 +    "vue": "3.4.27",\r
 +    "vue-router": "4.3.2"\r
 +  },\r
 +  "devDependencies": {\r
 +    "@vitejs/plugin-vue": "5.0.4",\r
 +    "autoprefixer": "10.4.19",\r
 +    "postcss": "8.4.38",\r
 +    "prettier": "3.2.5",\r
 +    "prettier-plugin-tailwindcss": "0.5.14",\r
 +    "tailwindcss": "3.4.3",\r
 +    "vite": "5.2.11"\r
 +  }\r
 +}\r
index 532d636ce1d0744272210f9e446757415170c76b,386e0fc842577898b3c28882186b9ce05a020d12..a463b41236b72123457fcc604c5b7f8a68f540ea
 -import glob
 -import os
 -import re
 -import shutil
 -from datetime import datetime
 -from typing import List, Literal, Set, Tuple
 -
 -import whoosh
 -from whoosh import writing
 -from whoosh.analysis import CharsetFilter, StemmingAnalyzer
 -from whoosh.fields import DATETIME, ID, KEYWORD, TEXT, SchemaClass
 -from whoosh.highlight import ContextFragmenter, WholeFragmenter
 -from whoosh.index import Index
 -from whoosh.qparser import MultifieldParser
 -from whoosh.qparser.dateparse import DateParserPlugin
 -from whoosh.query import Every
 -from whoosh.searching import Hit
 -from whoosh.support.charset import accent_map
 -
 -from helpers import get_env, is_valid_filename
 -from logger import logger
 -
 -from ..base import BaseNotes
 -from ..models import Note, NoteCreate, NoteUpdate, SearchResult
 -
 -MARKDOWN_EXT = ".md"
 -INDEX_SCHEMA_VERSION = "4"
 -
 -StemmingFoldingAnalyzer = StemmingAnalyzer() | CharsetFilter(accent_map)
 -
 -
 -class IndexSchema(SchemaClass):
 -    filename = ID(unique=True, stored=True)
 -    last_modified = DATETIME(stored=True, sortable=True)
 -    title = TEXT(
 -        field_boost=2.0, analyzer=StemmingFoldingAnalyzer, sortable=True
 -    )
 -    content = TEXT(analyzer=StemmingFoldingAnalyzer)
 -    tags = KEYWORD(lowercase=True, field_boost=2.0)
 -
 -
 -class FileSystemNotes(BaseNotes):
 -    TAGS_RE = re.compile(r"(?:(?<=^#)|(?<=\s#))\w+(?=\s|$)")
 -    CODEBLOCK_RE = re.compile(r"`{1,3}.*?`{1,3}", re.DOTALL)
 -    TAGS_WITH_HASH_RE = re.compile(r"(?:(?<=^)|(?<=\s))#\w+(?=\s|$)")
 -
 -    def __init__(self):
 -        self.storage_path = get_env("FLATNOTES_PATH", mandatory=True)
 -        if not os.path.exists(self.storage_path):
 -            raise NotADirectoryError(
 -                f"'{self.storage_path}' is not a valid directory."
 -            )
 -        self.index = self._load_index()
 -        self._sync_index()
 -
 -    def create(self, data: NoteCreate) -> Note:
 -        """Create a new note."""
 -        filepath = self._path_from_title(data.title)
 -        self._write_file(filepath, data.content)
 -        return Note(
 -            title=data.title,
 -            content=data.content,
 -            last_modified=os.path.getmtime(filepath),
 -        )
 -
 -    def get(self, title: str) -> Note:
 -        """Get a specific note."""
 -        is_valid_filename(title)
 -        filepath = self._path_from_title(title)
 -        content = self._read_file(filepath)
 -        return Note(
 -            title=title,
 -            content=content,
 -            last_modified=os.path.getmtime(filepath),
 -        )
 -
 -    def update(self, title: str, data: NoteUpdate) -> Note:
 -        """Update a specific note."""
 -        is_valid_filename(title)
 -        filepath = self._path_from_title(title)
 -        if data.new_title is not None:
 -            new_filepath = self._path_from_title(data.new_title)
 -            if filepath != new_filepath and os.path.isfile(new_filepath):
 -                raise FileExistsError(
 -                    f"Failed to rename. '{data.new_title}' already exists."
 -                )
 -            os.rename(filepath, new_filepath)
 -            title = data.new_title
 -            filepath = new_filepath
 -        if data.new_content is not None:
 -            self._write_file(filepath, data.new_content, overwrite=True)
 -            content = data.new_content
 -        else:
 -            content = self._read_file(filepath)
 -        return Note(
 -            title=title,
 -            content=content,
 -            last_modified=os.path.getmtime(filepath),
 -        )
 -
 -    def delete(self, title: str) -> None:
 -        """Delete a specific note."""
 -        is_valid_filename(title)
 -        filepath = self._path_from_title(title)
 -        os.remove(filepath)
 -
 -    def search(
 -        self,
 -        term: str,
 -        sort: Literal["score", "title", "last_modified"] = "score",
 -        order: Literal["asc", "desc"] = "desc",
 -        limit: int = None,
 -    ) -> Tuple[SearchResult, ...]:
 -        """Search the index for the given term."""
 -        self._sync_index()
 -        term = self._pre_process_search_term(term)
 -        with self.index.searcher() as searcher:
 -            # Parse Query
 -            if term == "*":
 -                query = Every()
 -            else:
 -                parser = MultifieldParser(
 -                    self._fieldnames_for_term(term), self.index.schema
 -                )
 -                parser.add_plugin(DateParserPlugin())
 -                query = parser.parse(term)
 -
 -            # Determine Sort By
 -            # Note: For the 'sort' option, "score" is converted to None as
 -            # that is the default for searches anyway and it's quicker for
 -            # Whoosh if you specify None.
 -            sort = sort if sort in ["title", "last_modified"] else None
 -
 -            # Determine Sort Direction
 -            # Note: Confusingly, when sorting by 'score', reverse = True means
 -            # asc so we have to flip the logic for that case!
 -            reverse = order == "desc"
 -            if sort is None:
 -                reverse = not reverse
 -
 -            # Run Search
 -            results = searcher.search(
 -                query,
 -                sortedby=sort,
 -                reverse=reverse,
 -                limit=limit,
 -                terms=True,
 -            )
 -            return tuple(self._search_result_from_hit(hit) for hit in results)
 -
 -    def get_tags(self) -> list[str]:
 -        """Return a list of all indexed tags."""
 -        self._sync_index()
 -        with self.index.reader() as reader:
 -            tags = reader.field_terms("tags")
 -            return [tag for tag in tags]
 -
 -    @property
 -    def _index_path(self):
 -        return os.path.join(self.storage_path, ".flatnotes")
 -
 -    def _path_from_title(self, title: str) -> str:
 -        return os.path.join(self.storage_path, title + MARKDOWN_EXT)
 -
 -    def _get_by_filename(self, filename: str) -> Note:
 -        """Get a note by its filename."""
 -        return self.get(self._strip_ext(filename))
 -
 -    def _load_index(self) -> Index:
 -        """Load the note index or create new if not exists."""
 -        index_dir_exists = os.path.exists(self._index_path)
 -        if index_dir_exists and whoosh.index.exists_in(
 -            self._index_path, indexname=INDEX_SCHEMA_VERSION
 -        ):
 -            logger.info("Loading existing index")
 -            return whoosh.index.open_dir(
 -                self._index_path, indexname=INDEX_SCHEMA_VERSION
 -            )
 -        else:
 -            if index_dir_exists:
 -                logger.info("Deleting outdated index")
 -                self._clear_dir(self._index_path)
 -            else:
 -                os.mkdir(self._index_path)
 -            logger.info("Creating new index")
 -            return whoosh.index.create_in(
 -                self._index_path, IndexSchema, indexname=INDEX_SCHEMA_VERSION
 -            )
 -
 -    @classmethod
 -    def _extract_tags(cls, content) -> Tuple[str, Set[str]]:
 -        """Strip tags from the given content and return a tuple consisting of:
 -
 -        - The content without the tags.
 -        - A set of tags converted to lowercase."""
 -        content_ex_codeblock = re.sub(cls.CODEBLOCK_RE, "", content)
 -        _, tags = cls._re_extract(cls.TAGS_RE, content_ex_codeblock)
 -        content_ex_tags, _ = cls._re_extract(cls.TAGS_RE, content)
 -        try:
 -            tags = [tag.lower() for tag in tags]
 -            return (content_ex_tags, set(tags))
 -        except IndexError:
 -            return (content, set())
 -
 -    def _add_note_to_index(
 -        self, writer: writing.IndexWriter, note: Note
 -    ) -> None:
 -        """Add a Note object to the index using the given writer. If the
 -        filename already exists in the index an update will be performed
 -        instead."""
 -        content_ex_tags, tag_set = self._extract_tags(note.content)
 -        tag_string = " ".join(tag_set)
 -        writer.update_document(
 -            filename=note.title + MARKDOWN_EXT,
 -            last_modified=datetime.fromtimestamp(note.last_modified),
 -            title=note.title,
 -            content=content_ex_tags,
 -            tags=tag_string,
 -        )
 -
 -    def _list_all_note_filenames(self) -> List[str]:
 -        """Return a list of all note filenames."""
 -        return [
 -            os.path.split(filepath)[1]
 -            for filepath in glob.glob(
 -                os.path.join(self.storage_path, "*" + MARKDOWN_EXT)
 -            )
 -        ]
 -
 -    def _sync_index(self, clean: bool = False) -> None:
 -        """Synchronize the index with the notes directory.
 -        Specify clean=True to completely rebuild the index"""
 -        indexed = set()
 -        writer = self.index.writer()
 -        if clean:
 -            writer.mergetype = writing.CLEAR  # Clear the index
 -        with self.index.searcher() as searcher:
 -            for idx_note in searcher.all_stored_fields():
 -                idx_filename = idx_note["filename"]
 -                idx_filepath = os.path.join(self.storage_path, idx_filename)
 -                # Delete missing
 -                if not os.path.exists(idx_filepath):
 -                    writer.delete_by_term("filename", idx_filename)
 -                    logger.info(f"'{idx_filename}' removed from index")
 -                # Update modified
 -                elif (
 -                    datetime.fromtimestamp(os.path.getmtime(idx_filepath))
 -                    != idx_note["last_modified"]
 -                ):
 -                    logger.info(f"'{idx_filename}' updated")
 -                    self._add_note_to_index(
 -                        writer, self._get_by_filename(idx_filename)
 -                    )
 -                    indexed.add(idx_filename)
 -                # Ignore already indexed
 -                else:
 -                    indexed.add(idx_filename)
 -        # Add new
 -        for filename in self._list_all_note_filenames():
 -            if filename not in indexed:
 -                self._add_note_to_index(
 -                    writer, self._get_by_filename(filename)
 -                )
 -                logger.info(f"'{filename}' added to index")
 -        writer.commit()
 -
 -    @classmethod
 -    def _pre_process_search_term(cls, term):
 -        term = term.strip()
 -        # Replace "#tagname" with "tags:tagname"
 -        term = re.sub(
 -            cls.TAGS_WITH_HASH_RE,
 -            lambda tag: "tags:" + tag.group(0)[1:],
 -            term,
 -        )
 -        return term
 -
 -    @staticmethod
 -    def _re_extract(pattern, string) -> Tuple[str, List[str]]:
 -        """Similar to re.sub but returns a tuple of:
 -
 -        - `string` with matches removed
 -        - list of matches"""
 -        matches = []
 -        text = re.sub(pattern, lambda tag: matches.append(tag.group()), string)
 -        return (text, matches)
 -
 -    @staticmethod
 -    def _strip_ext(filename):
 -        """Return the given filename without the extension."""
 -        return os.path.splitext(filename)[0]
 -
 -    @staticmethod
 -    def _clear_dir(path):
 -        """Delete all contents of the given directory."""
 -        for item in os.listdir(path):
 -            item_path = os.path.join(path, item)
 -            if os.path.isfile(item_path):
 -                os.remove(item_path)
 -            elif os.path.isdir(item_path):
 -                shutil.rmtree(item_path)
 -
 -    def _search_result_from_hit(self, hit: Hit):
 -        matched_fields = self._get_matched_fields(hit.matched_terms())
 -
 -        title = self._strip_ext(hit["filename"])
 -        last_modified = hit["last_modified"].timestamp()
 -
 -        # If the search was ordered using a text field then hit.score is the
 -        # value of that field. This isn't useful so only set self._score if it
 -        # is a float.
 -        score = hit.score if type(hit.score) is float else None
 -
 -        if "title" in matched_fields:
 -            hit.results.fragmenter = WholeFragmenter()
 -            title_highlights = hit.highlights("title", text=title)
 -        else:
 -            title_highlights = None
 -
 -        if "content" in matched_fields:
 -            hit.results.fragmenter = ContextFragmenter()
 -            content = self._read_file(self._path_from_title(title))
 -            content_ex_tags, _ = FileSystemNotes._extract_tags(content)
 -            content_highlights = hit.highlights(
 -                "content",
 -                text=content_ex_tags,
 -            )
 -        else:
 -            content_highlights = None
 -
 -        tag_matches = (
 -            [field[1] for field in hit.matched_terms() if field[0] == "tags"]
 -            if "tags" in matched_fields
 -            else None
 -        )
 -
 -        return SearchResult(
 -            title=title,
 -            last_modified=last_modified,
 -            score=score,
 -            title_highlights=title_highlights,
 -            content_highlights=content_highlights,
 -            tag_matches=tag_matches,
 -        )
 -
 -    def _fieldnames_for_term(self, term: str) -> List[str]:
 -        """Return a list of field names to search based on the given term. If
 -        the term includes a phrase then only search title and content. If the
 -        term does not include a phrase then also search tags."""
 -        fields = ["title", "content"]
 -        if '"' not in term:
 -            # If the term does not include a phrase then also search tags
 -            fields.append("tags")
 -        return fields
 -
 -    @staticmethod
 -    def _get_matched_fields(matched_terms):
 -        """Return a set of matched fields from a set of ('field', 'term') "
 -        "tuples generated by whoosh.searching.Hit.matched_terms()."""
 -        return set([matched_term[0] for matched_term in matched_terms])
 -
 -    @staticmethod
 -    def _read_file(filepath: str):
 -        logger.debug(f"Reading from '{filepath}'")
 -        with open(filepath, "r") as f:
 -            content = f.read()
 -        return content
 -
 -    @staticmethod
 -    def _write_file(filepath: str, content: str, overwrite: bool = False):
 -        logger.debug(f"Writing to '{filepath}'")
 -        with open(filepath, "w" if overwrite else "x") as f:
 -            f.write(content)
 +import glob\r
 +import os\r
 +import re\r
 +import shutil\r
 +import time\r
 +from datetime import datetime\r
 +from typing import List, Literal, Set, Tuple\r
 +\r
 +import whoosh\r
 +from whoosh import writing\r
 +from whoosh.analysis import CharsetFilter, StemmingAnalyzer\r
 +from whoosh.fields import DATETIME, ID, KEYWORD, TEXT, SchemaClass\r
 +from whoosh.highlight import ContextFragmenter, WholeFragmenter\r
 +from whoosh.index import Index, LockError\r
 +from whoosh.qparser import MultifieldParser\r
 +from whoosh.qparser.dateparse import DateParserPlugin\r
 +from whoosh.query import Every\r
 +from whoosh.searching import Hit\r
 +from whoosh.support.charset import accent_map\r
 +\r
 +from helpers import get_env, is_valid_filename\r
 +from logger import logger\r
 +\r
 +from ..base import BaseNotes\r
 +from ..models import Note, NoteCreate, NoteUpdate, SearchResult\r
 +\r
 +MARKDOWN_EXT = ".md"\r
 +INDEX_SCHEMA_VERSION = "4"\r
 +\r
 +StemmingFoldingAnalyzer = StemmingAnalyzer() | CharsetFilter(accent_map)\r
 +\r
 +\r
 +class IndexSchema(SchemaClass):\r
 +    filename = ID(unique=True, stored=True)\r
 +    last_modified = DATETIME(stored=True, sortable=True)\r
 +    title = TEXT(\r
 +        field_boost=2.0, analyzer=StemmingFoldingAnalyzer, sortable=True\r
 +    )\r
 +    content = TEXT(analyzer=StemmingFoldingAnalyzer)\r
 +    tags = KEYWORD(lowercase=True, field_boost=2.0)\r
 +\r
 +\r
 +class FileSystemNotes(BaseNotes):\r
 +    TAGS_RE = re.compile(r"(?:(?<=^#)|(?<=\s#))\w+(?=\s|$)")\r
 +    CODEBLOCK_RE = re.compile(r"`{1,3}.*?`{1,3}", re.DOTALL)\r
 +    TAGS_WITH_HASH_RE = re.compile(r"(?:(?<=^)|(?<=\s))#\w+(?=\s|$)")\r
 +\r
 +    def __init__(self):\r
 +        self.storage_path = get_env("FLATNOTES_PATH", mandatory=True)\r
 +        if not os.path.exists(self.storage_path):\r
 +            raise NotADirectoryError(\r
 +                f"'{self.storage_path}' is not a valid directory."\r
 +            )\r
 +        self.index = self._load_index()\r
 +        self._sync_index_with_retry(optimize=True)\r
 +\r
 +    def create(self, data: NoteCreate) -> Note:\r
 +        """Create a new note."""\r
 +        filepath = self._path_from_title(data.title)\r
 +        self._write_file(filepath, data.content)\r
 +        return Note(\r
 +            title=data.title,\r
 +            content=data.content,\r
 +            last_modified=os.path.getmtime(filepath),\r
 +        )\r
 +\r
 +    def get(self, title: str) -> Note:\r
 +        """Get a specific note."""\r
 +        is_valid_filename(title)\r
 +        filepath = self._path_from_title(title)\r
 +        content = self._read_file(filepath)\r
 +        return Note(\r
 +            title=title,\r
 +            content=content,\r
 +            last_modified=os.path.getmtime(filepath),\r
 +        )\r
 +\r
 +    def update(self, title: str, data: NoteUpdate) -> Note:\r
 +        """Update a specific note."""\r
 +        is_valid_filename(title)\r
 +        filepath = self._path_from_title(title)\r
 +        if data.new_title is not None:\r
 +            new_filepath = self._path_from_title(data.new_title)\r
++            if filepath != new_filepath and os.path.isfile(new_filepath):\r
++                raise FileExistsError(\r
++                    f"Failed to rename. '{data.new_title}' already exists."\r
++                )\r
 +            os.rename(filepath, new_filepath)\r
 +            title = data.new_title\r
 +            filepath = new_filepath\r
 +        if data.new_content is not None:\r
 +            self._write_file(filepath, data.new_content, overwrite=True)\r
 +            content = data.new_content\r
 +        else:\r
 +            content = self._read_file(filepath)\r
 +        return Note(\r
 +            title=title,\r
 +            content=content,\r
 +            last_modified=os.path.getmtime(filepath),\r
 +        )\r
 +\r
 +    def delete(self, title: str) -> None:\r
 +        """Delete a specific note."""\r
 +        is_valid_filename(title)\r
 +        filepath = self._path_from_title(title)\r
 +        os.remove(filepath)\r
 +\r
 +    def search(\r
 +        self,\r
 +        term: str,\r
 +        sort: Literal["score", "title", "last_modified"] = "score",\r
 +        order: Literal["asc", "desc"] = "desc",\r
 +        limit: int = None,\r
 +    ) -> Tuple[SearchResult, ...]:\r
 +        """Search the index for the given term."""\r
 +        self._sync_index_with_retry()\r
 +        term = self._pre_process_search_term(term)\r
 +        with self.index.searcher() as searcher:\r
 +            # Parse Query\r
 +            if term == "*":\r
 +                query = Every()\r
 +            else:\r
 +                parser = MultifieldParser(\r
 +                    self._fieldnames_for_term(term), self.index.schema\r
 +                )\r
 +                parser.add_plugin(DateParserPlugin())\r
 +                query = parser.parse(term)\r
 +\r
 +            # Determine Sort By\r
 +            # Note: For the 'sort' option, "score" is converted to None as\r
 +            # that is the default for searches anyway and it's quicker for\r
 +            # Whoosh if you specify None.\r
 +            sort = sort if sort in ["title", "last_modified"] else None\r
 +\r
 +            # Determine Sort Direction\r
 +            # Note: Confusingly, when sorting by 'score', reverse = True means\r
 +            # asc so we have to flip the logic for that case!\r
 +            reverse = order == "desc"\r
 +            if sort is None:\r
 +                reverse = not reverse\r
 +\r
 +            # Run Search\r
 +            results = searcher.search(\r
 +                query,\r
 +                sortedby=sort,\r
 +                reverse=reverse,\r
 +                limit=limit,\r
 +                terms=True,\r
 +            )\r
 +            return tuple(self._search_result_from_hit(hit) for hit in results)\r
 +\r
 +    def get_tags(self) -> list[str]:\r
 +        """Return a list of all indexed tags. Note: Tags no longer in use will\r
 +        only be cleared when the index is next optimized."""\r
 +        self._sync_index_with_retry()\r
 +        with self.index.reader() as reader:\r
 +            tags = reader.field_terms("tags")\r
 +            return [tag for tag in tags]\r
 +\r
 +    @property\r
 +    def _index_path(self):\r
 +        return os.path.join(self.storage_path, ".flatnotes")\r
 +\r
 +    def _path_from_title(self, title: str) -> str:\r
 +        return os.path.join(self.storage_path, title + MARKDOWN_EXT)\r
 +\r
 +    def _get_by_filename(self, filename: str) -> Note:\r
 +        """Get a note by its filename."""\r
 +        return self.get(self._strip_ext(filename))\r
 +\r
 +    def _load_index(self) -> Index:\r
 +        """Load the note index or create new if not exists."""\r
 +        index_dir_exists = os.path.exists(self._index_path)\r
 +        if index_dir_exists and whoosh.index.exists_in(\r
 +            self._index_path, indexname=INDEX_SCHEMA_VERSION\r
 +        ):\r
 +            logger.info("Loading existing index")\r
 +            return whoosh.index.open_dir(\r
 +                self._index_path, indexname=INDEX_SCHEMA_VERSION\r
 +            )\r
 +        else:\r
 +            if index_dir_exists:\r
 +                logger.info("Deleting outdated index")\r
 +                self._clear_dir(self._index_path)\r
 +            else:\r
 +                os.mkdir(self._index_path)\r
 +            logger.info("Creating new index")\r
 +            return whoosh.index.create_in(\r
 +                self._index_path, IndexSchema, indexname=INDEX_SCHEMA_VERSION\r
 +            )\r
 +\r
 +    @classmethod\r
 +    def _extract_tags(cls, content) -> Tuple[str, Set[str]]:\r
 +        """Strip tags from the given content and return a tuple consisting of:\r
 +\r
 +        - The content without the tags.\r
 +        - A set of tags converted to lowercase."""\r
 +        content_ex_codeblock = re.sub(cls.CODEBLOCK_RE, "", content)\r
 +        _, tags = cls._re_extract(cls.TAGS_RE, content_ex_codeblock)\r
 +        content_ex_tags, _ = cls._re_extract(cls.TAGS_RE, content)\r
 +        try:\r
 +            tags = [tag.lower() for tag in tags]\r
 +            return (content_ex_tags, set(tags))\r
 +        except IndexError:\r
 +            return (content, set())\r
 +\r
 +    def _add_note_to_index(\r
 +        self, writer: writing.IndexWriter, note: Note\r
 +    ) -> None:\r
 +        """Add a Note object to the index using the given writer. If the\r
 +        filename already exists in the index an update will be performed\r
 +        instead."""\r
 +        content_ex_tags, tag_set = self._extract_tags(note.content)\r
 +        tag_string = " ".join(tag_set)\r
 +        writer.update_document(\r
 +            filename=note.title + MARKDOWN_EXT,\r
 +            last_modified=datetime.fromtimestamp(note.last_modified),\r
 +            title=note.title,\r
 +            content=content_ex_tags,\r
 +            tags=tag_string,\r
 +        )\r
 +\r
 +    def _list_all_note_filenames(self) -> List[str]:\r
 +        """Return a list of all note filenames."""\r
 +        return [\r
 +            os.path.split(filepath)[1]\r
 +            for filepath in glob.glob(\r
 +                os.path.join(self.storage_path, "*" + MARKDOWN_EXT)\r
 +            )\r
 +        ]\r
 +\r
 +    def _sync_index(self, optimize: bool = False, clean: bool = False) -> None:\r
 +        """Synchronize the index with the notes directory.\r
 +        Specify clean=True to completely rebuild the index"""\r
 +        indexed = set()\r
 +        writer = self.index.writer()\r
 +        if clean:\r
 +            writer.mergetype = writing.CLEAR  # Clear the index\r
 +        with self.index.searcher() as searcher:\r
 +            for idx_note in searcher.all_stored_fields():\r
 +                idx_filename = idx_note["filename"]\r
 +                idx_filepath = os.path.join(self.storage_path, idx_filename)\r
 +                # Delete missing\r
 +                if not os.path.exists(idx_filepath):\r
 +                    writer.delete_by_term("filename", idx_filename)\r
 +                    logger.info(f"'{idx_filename}' removed from index")\r
 +                # Update modified\r
 +                elif (\r
 +                    datetime.fromtimestamp(os.path.getmtime(idx_filepath))\r
 +                    != idx_note["last_modified"]\r
 +                ):\r
 +                    logger.info(f"'{idx_filename}' updated")\r
 +                    self._add_note_to_index(\r
 +                        writer, self._get_by_filename(idx_filename)\r
 +                    )\r
 +                    indexed.add(idx_filename)\r
 +                # Ignore already indexed\r
 +                else:\r
 +                    indexed.add(idx_filename)\r
 +        # Add new\r
 +        for filename in self._list_all_note_filenames():\r
 +            if filename not in indexed:\r
 +                self._add_note_to_index(\r
 +                    writer, self._get_by_filename(filename)\r
 +                )\r
 +                logger.info(f"'{filename}' added to index")\r
 +        writer.commit(optimize=optimize)\r
 +        logger.info("Index synchronized")\r
 +\r
 +    def _sync_index_with_retry(\r
 +        self,\r
 +        optimize: bool = False,\r
 +        clean: bool = False,\r
 +        max_retries: int = 8,\r
 +        retry_delay: float = 0.25,\r
 +    ) -> None:\r
 +        for _ in range(max_retries):\r
 +            try:\r
 +                self._sync_index(optimize=optimize, clean=clean)\r
 +                return\r
 +            except LockError:\r
 +                logger.warning(f"Index locked, retrying in {retry_delay}s")\r
 +                time.sleep(retry_delay)\r
 +        logger.error(f"Failed to sync index after {max_retries} retries")\r
 +\r
 +    @classmethod\r
 +    def _pre_process_search_term(cls, term):\r
 +        term = term.strip()\r
 +        # Replace "#tagname" with "tags:tagname"\r
 +        term = re.sub(\r
 +            cls.TAGS_WITH_HASH_RE,\r
 +            lambda tag: "tags:" + tag.group(0)[1:],\r
 +            term,\r
 +        )\r
 +        return term\r
 +\r
 +    @staticmethod\r
 +    def _re_extract(pattern, string) -> Tuple[str, List[str]]:\r
 +        """Similar to re.sub but returns a tuple of:\r
 +\r
 +        - `string` with matches removed\r
 +        - list of matches"""\r
 +        matches = []\r
 +        text = re.sub(pattern, lambda tag: matches.append(tag.group()), string)\r
 +        return (text, matches)\r
 +\r
 +    @staticmethod\r
 +    def _strip_ext(filename):\r
 +        """Return the given filename without the extension."""\r
 +        return os.path.splitext(filename)[0]\r
 +\r
 +    @staticmethod\r
 +    def _clear_dir(path):\r
 +        """Delete all contents of the given directory."""\r
 +        for item in os.listdir(path):\r
 +            item_path = os.path.join(path, item)\r
 +            if os.path.isfile(item_path):\r
 +                os.remove(item_path)\r
 +            elif os.path.isdir(item_path):\r
 +                shutil.rmtree(item_path)\r
 +\r
 +    def _search_result_from_hit(self, hit: Hit):\r
 +        matched_fields = self._get_matched_fields(hit.matched_terms())\r
 +\r
 +        title = self._strip_ext(hit["filename"])\r
 +        last_modified = hit["last_modified"].timestamp()\r
 +\r
 +        # If the search was ordered using a text field then hit.score is the\r
 +        # value of that field. This isn't useful so only set self._score if it\r
 +        # is a float.\r
 +        score = hit.score if type(hit.score) is float else None\r
 +\r
 +        if "title" in matched_fields:\r
 +            hit.results.fragmenter = WholeFragmenter()\r
 +            title_highlights = hit.highlights("title", text=title)\r
 +        else:\r
 +            title_highlights = None\r
 +\r
 +        if "content" in matched_fields:\r
 +            hit.results.fragmenter = ContextFragmenter()\r
 +            content = self._read_file(self._path_from_title(title))\r
 +            content_ex_tags, _ = FileSystemNotes._extract_tags(content)\r
 +            content_highlights = hit.highlights(\r
 +                "content",\r
 +                text=content_ex_tags,\r
 +            )\r
 +        else:\r
 +            content_highlights = None\r
 +\r
 +        tag_matches = (\r
 +            [field[1] for field in hit.matched_terms() if field[0] == "tags"]\r
 +            if "tags" in matched_fields\r
 +            else None\r
 +        )\r
 +\r
 +        return SearchResult(\r
 +            title=title,\r
 +            last_modified=last_modified,\r
 +            score=score,\r
 +            title_highlights=title_highlights,\r
 +            content_highlights=content_highlights,\r
 +            tag_matches=tag_matches,\r
 +        )\r
 +\r
 +    def _fieldnames_for_term(self, term: str) -> List[str]:\r
 +        """Return a list of field names to search based on the given term. If\r
 +        the term includes a phrase then only search title and content. If the\r
 +        term does not include a phrase then also search tags."""\r
 +        fields = ["title", "content"]\r
 +        if '"' not in term:\r
 +            # If the term does not include a phrase then also search tags\r
 +            fields.append("tags")\r
 +        return fields\r
 +\r
 +    @staticmethod\r
 +    def _get_matched_fields(matched_terms):\r
 +        """Return a set of matched fields from a set of ('field', 'term') "\r
 +        "tuples generated by whoosh.searching.Hit.matched_terms()."""\r
 +        return set([matched_term[0] for matched_term in matched_terms])\r
 +\r
 +    @staticmethod\r
 +    def _read_file(filepath: str):\r
 +        logger.debug(f"Reading from '{filepath}'")\r
 +        with open(filepath, "r") as f:\r
 +            content = f.read()\r
 +        return content\r
 +\r
 +    @staticmethod\r
 +    def _write_file(filepath: str, content: str, overwrite: bool = False):\r
 +        logger.debug(f"Writing to '{filepath}'")\r
 +        with open(filepath, "w" if overwrite else "x") as f:\r
 +            f.write(content)\r
git clone https://git.99rst.org/PROJECT