diff --git a/.dvmrc b/.dvmrc index aedc15b..da6b0a8 100644 --- a/.dvmrc +++ b/.dvmrc @@ -1 +1 @@ -2.5.3 +2.5.6 diff --git a/Dockerfile b/Dockerfile index 1bfc027..ce471d6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM denoland/deno:ubuntu-2.5.3 +FROM denoland/deno:ubuntu-2.5.6 EXPOSE 8000 diff --git a/bewcloud.config.sample.ts b/bewcloud.config.sample.ts index a22412e..6918864 100644 --- a/bewcloud.config.sample.ts +++ b/bewcloud.config.sample.ts @@ -21,7 +21,7 @@ const config: PartialDeep = { // allowDirectoryDownloads: false, // If true, directories can be downloaded as zip files // }, // core: { - // enabledApps: ['news', 'notes', 'photos', 'expenses', 'contacts', 'calendar'], // dashboard and files cannot be disabled + // enabledApps: ['dashboard', 'files', 'news', 'notes', 'photos', 'expenses', 'contacts', 'calendar'], // The apps to show, in order of appearance in the header. The first app will be the default one shown after logging in. At least one is required. // }, // visuals: { // title: 'My own cloud', diff --git a/components/Header.tsx b/components/Header.tsx index 53bb605..df146d8 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -1,6 +1,7 @@ import { Head } from 'fresh/runtime.ts'; import { OptionalApp, User } from '/lib/types.ts'; +import { capitalizeWord } from '/lib/utils/misc.ts'; interface Data { route: string; @@ -23,52 +24,10 @@ export default function Header({ route, user, enabledApps }: Data) { const iconWidthAndHeightInPixels = 20; - const potentialMenuItems: (MenuItem | null)[] = [ - { - url: '/dashboard', - label: 'Dashboard', - }, - enabledApps.includes('news') - ? { - url: '/news', - label: 'News', - } - : null, - { - url: '/files', - label: 'Files', - }, - enabledApps.includes('notes') - ? { - url: '/notes', - label: 'Notes', - } - : null, - enabledApps.includes('photos') - ? { - url: '/photos', - label: 'Photos', - } - : null, - enabledApps.includes('expenses') - ? { - url: '/expenses', - label: 'Expenses', - } - : null, - enabledApps.includes('contacts') - ? { - url: '/contacts', - label: 'Contacts', - } - : null, - enabledApps.includes('calendar') - ? { - url: '/calendar', - label: 'Calendar', - } - : null, - ]; + const potentialMenuItems: (MenuItem | null)[] = enabledApps.map((app) => ({ + url: `/${app}`, + label: capitalizeWord(app), + })); const menuItems = potentialMenuItems.filter(Boolean) as MenuItem[]; diff --git a/deno.json b/deno.json index 17157e2..a2c5594 100644 --- a/deno.json +++ b/deno.json @@ -1,5 +1,5 @@ { - "lock": false, + "lock": true, "tasks": { "check": "deno fmt --check && deno lint && deno check .", "cli": "echo \"import '\\$fresh/src/dev/cli.ts'\" | deno run --unstable -A -", @@ -33,6 +33,7 @@ "fresh/": "https://deno.land/x/fresh@1.7.3/", "$fresh/": "https://deno.land/x/fresh@1.7.3/", + "@libs/xml": "https://deno.land/x/xml@2.1.3/mod.ts", "postgres": "jsr:@db/postgres@0.19.5", "@b-fuze/deno-dom": "jsr:@b-fuze/deno-dom@0.1.56", @@ -40,7 +41,6 @@ "@hexagon/croner": "jsr:@hexagon/croner@9.1.0", "@mikaelporttila/rss": "jsr:@mikaelporttila/rss@1.1.3", "@libs/qrcode": "jsr:@libs/qrcode@3.0.0", - "@libs/xml": "jsr:@libs/xml@7.0.2", "@simplewebauthn/server": "jsr:@simplewebauthn/server@13.2.1", "@simplewebauthn/browser": "jsr:@simplewebauthn/browser@13.2.0", "@std/assert": "jsr:@std/assert@1.0.14", diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..da5b29a --- /dev/null +++ b/deno.lock @@ -0,0 +1,2871 @@ +{ + "version": "5", + "specifiers": { + "jsr:@b-fuze/deno-dom@0.1.56": "0.1.56", + "jsr:@db/postgres@0.19.5": "0.19.5", + "jsr:@deno/esbuild-plugin@^1.2.0": "1.2.0", + "jsr:@deno/loader@~0.3.2": "0.3.8", + "jsr:@deno/loader@~0.3.3": "0.3.8", + "jsr:@denosaurs/plug@1.1.0": "1.1.0", + "jsr:@fresh/build-id@1": "1.0.1", + "jsr:@fresh/core@2": "2.1.3", + "jsr:@fresh/core@^2.1.1": "2.1.3", + "jsr:@fresh/plugin-vite@1.0.4": "1.0.4", + "jsr:@hexagon/croner@9.1.0": "9.1.0", + "jsr:@libs/qrcode@3.0.0": "3.0.0", + "jsr:@luca/esbuild-deno-loader@0.11.0": "0.11.0", + "jsr:@maxim-mazurok/sax-ts@1.2.13": "1.2.13", + "jsr:@mikaelporttila/rss@1.1.3": "1.1.3", + "jsr:@simplewebauthn/browser@13.2.0": "13.2.0", + "jsr:@simplewebauthn/server@13.2.1": "13.2.1", + "jsr:@std/assert@1.0.14": "1.0.14", + "jsr:@std/bytes@^1.0.2": "1.0.6", + "jsr:@std/bytes@^1.0.5": "1.0.6", + "jsr:@std/bytes@^1.0.6": "1.0.6", + "jsr:@std/cli@^1.0.21": "1.0.23", + "jsr:@std/crypto@^1.0.4": "1.0.5", + "jsr:@std/dotenv@0.225.5": "0.225.5", + "jsr:@std/dotenv@~0.225.5": "0.225.5", + "jsr:@std/encoding@1": "1.0.10", + "jsr:@std/encoding@1.0.10": "1.0.10", + "jsr:@std/encoding@^1.0.10": "1.0.10", + "jsr:@std/encoding@^1.0.5": "1.0.10", + "jsr:@std/encoding@^1.0.9": "1.0.10", + "jsr:@std/fmt@1": "1.0.8", + "jsr:@std/fmt@^1.0.6": "1.0.8", + "jsr:@std/fmt@^1.0.7": "1.0.8", + "jsr:@std/fmt@^1.0.8": "1.0.8", + "jsr:@std/fs@1": "1.0.19", + "jsr:@std/fs@^1.0.19": "1.0.19", + "jsr:@std/html@1": "1.0.5", + "jsr:@std/html@^1.0.4": "1.0.5", + "jsr:@std/http@1.0.20": "1.0.20", + "jsr:@std/http@^1.0.15": "1.0.20", + "jsr:@std/internal@^1.0.10": "1.0.12", + "jsr:@std/internal@^1.0.9": "1.0.12", + "jsr:@std/json@^1.0.2": "1.0.2", + "jsr:@std/jsonc@1": "1.0.2", + "jsr:@std/media-types@1": "1.1.0", + "jsr:@std/media-types@^1.1.0": "1.1.0", + "jsr:@std/net@^1.0.4": "1.0.6", + "jsr:@std/path@1": "1.1.2", + "jsr:@std/path@1.1.2": "1.1.2", + "jsr:@std/path@^1.0.6": "1.1.2", + "jsr:@std/path@^1.0.8": "1.1.2", + "jsr:@std/path@^1.1.1": "1.1.2", + "jsr:@std/semver@1": "1.0.6", + "jsr:@std/streams@^1.0.10": "1.0.13", + "jsr:@std/uuid@^1.0.7": "1.0.9", + "npm:@babel/core@^7.28.0": "7.28.5", + "npm:@babel/preset-react@^7.27.1": "7.28.5_@babel+core@7.28.5", + "npm:@hexagon/base64@^1.1.27": "1.1.28", + "npm:@levischuck/tiny-cbor@~0.2.2": "0.2.11", + "npm:@mjackson/node-fetch-server@0.7": "0.7.0", + "npm:@opentelemetry/api@^1.9.0": "1.9.0", + "npm:@peculiar/asn1-android@^2.3.10": "2.5.0", + "npm:@peculiar/asn1-ecc@^2.3.8": "2.5.0", + "npm:@peculiar/asn1-rsa@^2.3.8": "2.5.0", + "npm:@peculiar/asn1-schema@^2.3.8": "2.5.0", + "npm:@peculiar/asn1-x509@^2.3.8": "2.5.0", + "npm:@peculiar/x509@^1.13.0": "1.14.0", + "npm:@preact/signals@2.3.1": "2.3.1_preact@10.27.2", + "npm:@preact/signals@^2.2.1": "2.3.1_preact@10.27.2", + "npm:@prefresh/vite@^2.4.8": "2.4.11_preact@10.27.2_vite@7.1.7__picomatch@4.0.3", + "npm:autoprefixer@10.4.17": "10.4.17_postcss@8.4.35", + "npm:chart.js@4.5.0": "4.5.0", + "npm:cssnano@6.0.3": "6.0.3_postcss@8.4.35", + "npm:esbuild-wasm@0.25.7": "0.25.7", + "npm:esbuild@0.25.7": "0.25.7", + "npm:esbuild@~0.25.5": "0.25.11", + "npm:mrmime@2.0.1": "2.0.1", + "npm:nodemailer@7.0.6": "7.0.6", + "npm:openid-client@6.8.0": "6.8.0", + "npm:otpauth@9.4.1": "9.4.1", + "npm:postcss@8.4.35": "8.4.35", + "npm:preact-render-to-string@^6.5.11": "6.6.3_preact@10.27.2", + "npm:preact@10.27.2": "10.27.2", + "npm:preact@^10.27.0": "10.27.2", + "npm:rollup@^4.50.0": "4.52.5", + "npm:sharp@0.34.4": "0.34.4", + "npm:tailwindcss@3.4.17": "3.4.17_postcss@8.5.6", + "npm:vite@7.1.7": "7.1.7_picomatch@4.0.3", + "npm:vite@^7.1.4": "7.1.7_picomatch@4.0.3" + }, + "jsr": { + "@b-fuze/deno-dom@0.1.56": { + "integrity": "8030e2dc1d8750f1682b53462ab893d9c3470f2287feecbe22f44a88c54ab148", + "dependencies": [ + "jsr:@denosaurs/plug" + ] + }, + "@db/postgres@0.19.5": { + "integrity": "afdbe608bd066cda2ee5dba37c416d332098b9238c51aec223331108e281954c", + "dependencies": [ + "jsr:@std/bytes@^1.0.5", + "jsr:@std/crypto", + "jsr:@std/encoding@^1.0.9", + "jsr:@std/fmt@^1.0.6", + "jsr:@std/path@^1.0.8" + ] + }, + "@deno/esbuild-plugin@1.2.0": { + "integrity": "04ddd0fca9416d8a2866263928a53b9d5ed08dfca064d64504a0aaf9800c709e", + "dependencies": [ + "jsr:@deno/loader@~0.3.3", + "jsr:@std/path@^1.1.1", + "npm:esbuild@~0.25.5" + ] + }, + "@deno/loader@0.3.8": { + "integrity": "4a8611c3f6ee32e2e969ec1deb18aa0576d4b7c16b65b50d97a64f03e592fb0a" + }, + "@denosaurs/plug@1.1.0": { + "integrity": "eb2f0b7546c7bca2000d8b0282c54d50d91cf6d75cb26a80df25a6de8c4bc044", + "dependencies": [ + "jsr:@std/encoding@1", + "jsr:@std/fmt@1", + "jsr:@std/fs@1", + "jsr:@std/path@1" + ] + }, + "@fresh/build-id@1.0.1": { + "integrity": "12a2ec25fd52ae9ec68c26848a5696cd1c9b537f7c983c7e56e4fb1e7e816c20", + "dependencies": [ + "jsr:@std/encoding@^1.0.10" + ] + }, + "@fresh/core@2.1.3": { + "integrity": "5656afa01607af5ca4693abdec3da9cfb41618f52daac11c00846de0994fd7e7", + "dependencies": [ + "jsr:@deno/esbuild-plugin", + "jsr:@fresh/build-id", + "jsr:@std/encoding@1", + "jsr:@std/fmt@^1.0.8", + "jsr:@std/fs@1", + "jsr:@std/html@1", + "jsr:@std/http@^1.0.15", + "jsr:@std/jsonc", + "jsr:@std/media-types@1", + "jsr:@std/path@1", + "jsr:@std/semver", + "jsr:@std/uuid", + "npm:@opentelemetry/api", + "npm:@preact/signals@^2.2.1", + "npm:esbuild-wasm", + "npm:esbuild@0.25.7", + "npm:preact-render-to-string", + "npm:preact@^10.27.0" + ] + }, + "@fresh/plugin-vite@1.0.4": { + "integrity": "9b9f5f645667e6f9aeb059d6dd7023cda84b8445304fcae2436a83aa0b5962fa", + "dependencies": [ + "jsr:@deno/loader@~0.3.2", + "jsr:@fresh/core@2", + "jsr:@fresh/core@^2.1.1", + "jsr:@std/dotenv@~0.225.5", + "jsr:@std/fmt@^1.0.7", + "jsr:@std/path@1", + "npm:@babel/core", + "npm:@babel/preset-react", + "npm:@mjackson/node-fetch-server", + "npm:@prefresh/vite", + "npm:rollup", + "npm:vite@^7.1.4" + ] + }, + "@hexagon/croner@9.1.0": { + "integrity": "defde0fcee33c7c7901d5d6be230a30fb326e5d31773bc991a2976468f61f9eb" + }, + "@libs/qrcode@3.0.0": { + "integrity": "f19ae517f67c33cd1c0ed3a54a46540980de45cb3327d09b21479a75d7222953" + }, + "@luca/esbuild-deno-loader@0.11.0": { + "integrity": "c05a989aa7c4ee6992a27be5f15cfc5be12834cab7ff84cabb47313737c51a2c", + "dependencies": [ + "jsr:@std/bytes@^1.0.2", + "jsr:@std/encoding@^1.0.5", + "jsr:@std/path@^1.0.6" + ] + }, + "@maxim-mazurok/sax-ts@1.2.13": { + "integrity": "9f2f9a3ac1b142400940a4c9e916656fe63d4710a78102aeb8e08e863de2c76d" + }, + "@mikaelporttila/rss@1.1.3": { + "integrity": "2d6f09935489233fba13228c9e1670ef02aaeebffc9b1e63432eee3b34d12533", + "dependencies": [ + "jsr:@maxim-mazurok/sax-ts" + ] + }, + "@simplewebauthn/browser@13.2.0": { + "integrity": "181274e4e57506e8356d1b96db2410dfe006168d25c9c1b1fb27ad9a76ad35d8" + }, + "@simplewebauthn/server@13.2.1": { + "integrity": "9d01977bbfac70c2ca75388726161329b5a0fa7e555ddaddf4ba4bf7fdcc7adc", + "dependencies": [ + "npm:@hexagon/base64", + "npm:@levischuck/tiny-cbor", + "npm:@peculiar/asn1-android", + "npm:@peculiar/asn1-ecc", + "npm:@peculiar/asn1-rsa", + "npm:@peculiar/asn1-schema", + "npm:@peculiar/asn1-x509", + "npm:@peculiar/x509" + ] + }, + "@std/assert@1.0.14": { + "integrity": "68d0d4a43b365abc927f45a9b85c639ea18a9fab96ad92281e493e4ed84abaa4", + "dependencies": [ + "jsr:@std/internal@^1.0.10" + ] + }, + "@std/bytes@1.0.6": { + "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" + }, + "@std/cli@1.0.23": { + "integrity": "bf95b7a9425ba2af1ae5a6359daf58c508f2decf711a76ed2993cd352498ccca" + }, + "@std/crypto@1.0.5": { + "integrity": "0dcfbb319fe0bba1bd3af904ceb4f948cde1b92979ec1614528380ed308a3b40" + }, + "@std/dotenv@0.225.5": { + "integrity": "9ce6f9d0ec3311f74a32535aa1b8c62ed88b1ab91b7f0815797d77a6f60c922f" + }, + "@std/encoding@1.0.10": { + "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" + }, + "@std/fmt@1.0.8": { + "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" + }, + "@std/fs@1.0.19": { + "integrity": "051968c2b1eae4d2ea9f79a08a3845740ef6af10356aff43d3e2ef11ed09fb06", + "dependencies": [ + "jsr:@std/internal@^1.0.9", + "jsr:@std/path@^1.1.1" + ] + }, + "@std/html@1.0.5": { + "integrity": "4e2d693f474cae8c16a920fa5e15a3b72267b94b84667f11a50c6dd1cb18d35e" + }, + "@std/http@1.0.20": { + "integrity": "b5cc33fc001bccce65ed4c51815668c9891c69ccd908295997e983d8f56070a1", + "dependencies": [ + "jsr:@std/cli", + "jsr:@std/encoding@^1.0.10", + "jsr:@std/fmt@^1.0.8", + "jsr:@std/fs@^1.0.19", + "jsr:@std/html@^1.0.4", + "jsr:@std/media-types@^1.1.0", + "jsr:@std/net", + "jsr:@std/path@^1.1.1", + "jsr:@std/streams" + ] + }, + "@std/internal@1.0.12": { + "integrity": "972a634fd5bc34b242024402972cd5143eac68d8dffaca5eaa4dba30ce17b027" + }, + "@std/json@1.0.2": { + "integrity": "d9e5497801c15fb679f55a2c01c7794ad7a5dfda4dd1bebab5e409cb5e0d34d4" + }, + "@std/jsonc@1.0.2": { + "integrity": "909605dae3af22bd75b1cbda8d64a32cf1fd2cf6efa3f9e224aba6d22c0f44c7", + "dependencies": [ + "jsr:@std/json" + ] + }, + "@std/media-types@1.1.0": { + "integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4" + }, + "@std/net@1.0.6": { + "integrity": "110735f93e95bb9feb95790a8b1d1bf69ec0dc74f3f97a00a76ea5efea25500c" + }, + "@std/path@1.1.2": { + "integrity": "c0b13b97dfe06546d5e16bf3966b1cadf92e1cc83e56ba5476ad8b498d9e3038", + "dependencies": [ + "jsr:@std/internal@^1.0.10" + ] + }, + "@std/semver@1.0.6": { + "integrity": "b7c98ae2843547cf3f7ac37f3995889e6e4cee0a97b57b57f17f62722843303c" + }, + "@std/streams@1.0.13": { + "integrity": "772d208cd0d3e5dac7c1d9e6cdb25842846d136eea4a41a62e44ed4ab0c8dd9e" + }, + "@std/uuid@1.0.9": { + "integrity": "44b627bf2d372fe1bd099e2ad41b2be41a777fc94e62a3151006895a037f1642", + "dependencies": [ + "jsr:@std/bytes@^1.0.6" + ] + } + }, + "npm": { + "@alloc/quick-lru@5.2.0": { + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, + "@babel/code-frame@7.27.1": { + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": [ + "@babel/helper-validator-identifier", + "js-tokens", + "picocolors" + ] + }, + "@babel/compat-data@7.28.5": { + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==" + }, + "@babel/core@7.28.5": { + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dependencies": [ + "@babel/code-frame", + "@babel/generator", + "@babel/helper-compilation-targets", + "@babel/helper-module-transforms", + "@babel/helpers", + "@babel/parser", + "@babel/template", + "@babel/traverse", + "@babel/types", + "@jridgewell/remapping", + "convert-source-map", + "debug", + "gensync", + "json5", + "semver@6.3.1" + ] + }, + "@babel/generator@7.28.5": { + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dependencies": [ + "@babel/parser", + "@babel/types", + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping", + "jsesc" + ] + }, + "@babel/helper-annotate-as-pure@7.27.3": { + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dependencies": [ + "@babel/types" + ] + }, + "@babel/helper-compilation-targets@7.27.2": { + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dependencies": [ + "@babel/compat-data", + "@babel/helper-validator-option", + "browserslist", + "lru-cache@5.1.1", + "semver@6.3.1" + ] + }, + "@babel/helper-globals@7.28.0": { + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" + }, + "@babel/helper-module-imports@7.27.1": { + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-module-transforms@7.28.3_@babel+core@7.28.5": { + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-imports", + "@babel/helper-validator-identifier", + "@babel/traverse" + ] + }, + "@babel/helper-plugin-utils@7.27.1": { + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" + }, + "@babel/helper-string-parser@7.27.1": { + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" + }, + "@babel/helper-validator-identifier@7.28.5": { + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" + }, + "@babel/helper-validator-option@7.27.1": { + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" + }, + "@babel/helpers@7.28.4": { + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dependencies": [ + "@babel/template", + "@babel/types" + ] + }, + "@babel/parser@7.28.5": { + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dependencies": [ + "@babel/types" + ], + "bin": true + }, + "@babel/plugin-syntax-jsx@7.27.1_@babel+core@7.28.5": { + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-react-display-name@7.28.0_@babel+core@7.28.5": { + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-react-jsx-development@7.27.1_@babel+core@7.28.5": { + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "dependencies": [ + "@babel/core", + "@babel/plugin-transform-react-jsx" + ] + }, + "@babel/plugin-transform-react-jsx@7.27.1_@babel+core@7.28.5": { + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-module-imports", + "@babel/helper-plugin-utils", + "@babel/plugin-syntax-jsx", + "@babel/types" + ] + }, + "@babel/plugin-transform-react-pure-annotations@7.27.1_@babel+core@7.28.5": { + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-plugin-utils" + ] + }, + "@babel/preset-react@7.28.5_@babel+core@7.28.5": { + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-validator-option", + "@babel/plugin-transform-react-display-name", + "@babel/plugin-transform-react-jsx", + "@babel/plugin-transform-react-jsx-development", + "@babel/plugin-transform-react-pure-annotations" + ] + }, + "@babel/template@7.27.2": { + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dependencies": [ + "@babel/code-frame", + "@babel/parser", + "@babel/types" + ] + }, + "@babel/traverse@7.28.5": { + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dependencies": [ + "@babel/code-frame", + "@babel/generator", + "@babel/helper-globals", + "@babel/parser", + "@babel/template", + "@babel/types", + "debug" + ] + }, + "@babel/types@7.28.5": { + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dependencies": [ + "@babel/helper-string-parser", + "@babel/helper-validator-identifier" + ] + }, + "@emnapi/runtime@1.6.0": { + "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", + "dependencies": [ + "tslib@2.8.1" + ] + }, + "@esbuild/aix-ppc64@0.25.11": { + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "os": ["aix"], + "cpu": ["ppc64"] + }, + "@esbuild/aix-ppc64@0.25.7": { + "integrity": "sha512-uD0kKFHh6ETr8TqEtaAcV+dn/2qnYbH/+8wGEdY70Qf7l1l/jmBUbrmQqwiPKAQE6cOQ7dTj6Xr0HzQDGHyceQ==", + "os": ["aix"], + "cpu": ["ppc64"] + }, + "@esbuild/android-arm64@0.25.11": { + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@esbuild/android-arm64@0.25.7": { + "integrity": "sha512-p0ohDnwyIbAtztHTNUTzN5EGD/HJLs1bwysrOPgSdlIA6NDnReoVfoCyxG6W1d85jr2X80Uq5KHftyYgaK9LPQ==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@esbuild/android-arm@0.25.11": { + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "os": ["android"], + "cpu": ["arm"] + }, + "@esbuild/android-arm@0.25.7": { + "integrity": "sha512-Jhuet0g1k9rAJHrXGIh7sFknFuT4sfytYZpZpuZl7YKDhnPByVAm5oy2LEBmMbuYf3ejWVYCc2seX81Mk+madA==", + "os": ["android"], + "cpu": ["arm"] + }, + "@esbuild/android-x64@0.25.11": { + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "os": ["android"], + "cpu": ["x64"] + }, + "@esbuild/android-x64@0.25.7": { + "integrity": "sha512-mMxIJFlSgVK23HSsII3ZX9T2xKrBCDGyk0qiZnIW10LLFFtZLkFD6imZHu7gUo2wkNZwS9Yj3mOtZD3ZPcjCcw==", + "os": ["android"], + "cpu": ["x64"] + }, + "@esbuild/darwin-arm64@0.25.11": { + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@esbuild/darwin-arm64@0.25.7": { + "integrity": "sha512-jyOFLGP2WwRwxM8F1VpP6gcdIJc8jq2CUrURbbTouJoRO7XCkU8GdnTDFIHdcifVBT45cJlOYsZ1kSlfbKjYUQ==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@esbuild/darwin-x64@0.25.11": { + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@esbuild/darwin-x64@0.25.7": { + "integrity": "sha512-m9bVWqZCwQ1BthruifvG64hG03zzz9gE2r/vYAhztBna1/+qXiHyP9WgnyZqHgGeXoimJPhAmxfbeU+nMng6ZA==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@esbuild/freebsd-arm64@0.25.11": { + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "os": ["freebsd"], + "cpu": ["arm64"] + }, + "@esbuild/freebsd-arm64@0.25.7": { + "integrity": "sha512-Bss7P4r6uhr3kDzRjPNEnTm/oIBdTPRNQuwaEFWT/uvt6A1YzK/yn5kcx5ZxZ9swOga7LqeYlu7bDIpDoS01bA==", + "os": ["freebsd"], + "cpu": ["arm64"] + }, + "@esbuild/freebsd-x64@0.25.11": { + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@esbuild/freebsd-x64@0.25.7": { + "integrity": "sha512-S3BFyjW81LXG7Vqmr37ddbThrm3A84yE7ey/ERBlK9dIiaWgrjRlre3pbG7txh1Uaxz8N7wGGQXmC9zV+LIpBQ==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@esbuild/linux-arm64@0.25.11": { + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@esbuild/linux-arm64@0.25.7": { + "integrity": "sha512-HfQZQqrNOfS1Okn7PcsGUqHymL1cWGBslf78dGvtrj8q7cN3FkapFgNA4l/a5lXDwr7BqP2BSO6mz9UremNPbg==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@esbuild/linux-arm@0.25.11": { + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@esbuild/linux-arm@0.25.7": { + "integrity": "sha512-JZMIci/1m5vfQuhKoFXogCKVYVfYQmoZJg8vSIMR4TUXbF+0aNlfXH3DGFEFMElT8hOTUF5hisdZhnrZO/bkDw==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@esbuild/linux-ia32@0.25.11": { + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "os": ["linux"], + "cpu": ["ia32"] + }, + "@esbuild/linux-ia32@0.25.7": { + "integrity": "sha512-9Jex4uVpdeofiDxnwHRgen+j6398JlX4/6SCbbEFEXN7oMO2p0ueLN+e+9DdsdPLUdqns607HmzEFnxwr7+5wQ==", + "os": ["linux"], + "cpu": ["ia32"] + }, + "@esbuild/linux-loong64@0.25.11": { + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@esbuild/linux-loong64@0.25.7": { + "integrity": "sha512-TG1KJqjBlN9IHQjKVUYDB0/mUGgokfhhatlay8aZ/MSORMubEvj/J1CL8YGY4EBcln4z7rKFbsH+HeAv0d471w==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@esbuild/linux-mips64el@0.25.11": { + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "os": ["linux"], + "cpu": ["mips64el"] + }, + "@esbuild/linux-mips64el@0.25.7": { + "integrity": "sha512-Ty9Hj/lx7ikTnhOfaP7ipEm/ICcBv94i/6/WDg0OZ3BPBHhChsUbQancoWYSO0WNkEiSW5Do4febTTy4x1qYQQ==", + "os": ["linux"], + "cpu": ["mips64el"] + }, + "@esbuild/linux-ppc64@0.25.11": { + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@esbuild/linux-ppc64@0.25.7": { + "integrity": "sha512-MrOjirGQWGReJl3BNQ58BLhUBPpWABnKrnq8Q/vZWWwAB1wuLXOIxS2JQ1LT3+5T+3jfPh0tyf5CpbyQHqnWIQ==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@esbuild/linux-riscv64@0.25.11": { + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@esbuild/linux-riscv64@0.25.7": { + "integrity": "sha512-9pr23/pqzyqIZEZmQXnFyqp3vpa+KBk5TotfkzGMqpw089PGm0AIowkUppHB9derQzqniGn3wVXgck19+oqiOw==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@esbuild/linux-s390x@0.25.11": { + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@esbuild/linux-s390x@0.25.7": { + "integrity": "sha512-4dP11UVGh9O6Y47m8YvW8eoA3r8qL2toVZUbBKyGta8j6zdw1cn9F/Rt59/Mhv0OgY68pHIMjGXWOUaykCnx+w==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@esbuild/linux-x64@0.25.11": { + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@esbuild/linux-x64@0.25.7": { + "integrity": "sha512-ghJMAJTdw/0uhz7e7YnpdX1xVn7VqA0GrWrAO2qKMuqbvgHT2VZiBv1BQ//VcHsPir4wsL3P2oPggfKPzTKoCA==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@esbuild/netbsd-arm64@0.25.11": { + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "os": ["netbsd"], + "cpu": ["arm64"] + }, + "@esbuild/netbsd-arm64@0.25.7": { + "integrity": "sha512-bwXGEU4ua45+u5Ci/a55B85KWaDSRS8NPOHtxy2e3etDjbz23wlry37Ffzapz69JAGGc4089TBo+dGzydQmydg==", + "os": ["netbsd"], + "cpu": ["arm64"] + }, + "@esbuild/netbsd-x64@0.25.11": { + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "os": ["netbsd"], + "cpu": ["x64"] + }, + "@esbuild/netbsd-x64@0.25.7": { + "integrity": "sha512-tUZRvLtgLE5OyN46sPSYlgmHoBS5bx2URSrgZdW1L1teWPYVmXh+QN/sKDqkzBo/IHGcKcHLKDhBeVVkO7teEA==", + "os": ["netbsd"], + "cpu": ["x64"] + }, + "@esbuild/openbsd-arm64@0.25.11": { + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "os": ["openbsd"], + "cpu": ["arm64"] + }, + "@esbuild/openbsd-arm64@0.25.7": { + "integrity": "sha512-bTJ50aoC+WDlDGBReWYiObpYvQfMjBNlKztqoNUL0iUkYtwLkBQQeEsTq/I1KyjsKA5tyov6VZaPb8UdD6ci6Q==", + "os": ["openbsd"], + "cpu": ["arm64"] + }, + "@esbuild/openbsd-x64@0.25.11": { + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "os": ["openbsd"], + "cpu": ["x64"] + }, + "@esbuild/openbsd-x64@0.25.7": { + "integrity": "sha512-TA9XfJrgzAipFUU895jd9j2SyDh9bbNkK2I0gHcvqb/o84UeQkBpi/XmYX3cO1q/9hZokdcDqQxIi6uLVrikxg==", + "os": ["openbsd"], + "cpu": ["x64"] + }, + "@esbuild/openharmony-arm64@0.25.11": { + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "os": ["openharmony"], + "cpu": ["arm64"] + }, + "@esbuild/openharmony-arm64@0.25.7": { + "integrity": "sha512-5VTtExUrWwHHEUZ/N+rPlHDwVFQ5aME7vRJES8+iQ0xC/bMYckfJ0l2n3yGIfRoXcK/wq4oXSItZAz5wslTKGw==", + "os": ["openharmony"], + "cpu": ["arm64"] + }, + "@esbuild/sunos-x64@0.25.11": { + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "os": ["sunos"], + "cpu": ["x64"] + }, + "@esbuild/sunos-x64@0.25.7": { + "integrity": "sha512-umkbn7KTxsexhv2vuuJmj9kggd4AEtL32KodkJgfhNOHMPtQ55RexsaSrMb+0+jp9XL4I4o2y91PZauVN4cH3A==", + "os": ["sunos"], + "cpu": ["x64"] + }, + "@esbuild/win32-arm64@0.25.11": { + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@esbuild/win32-arm64@0.25.7": { + "integrity": "sha512-j20JQGP/gz8QDgzl5No5Gr4F6hurAZvtkFxAKhiv2X49yi/ih8ECK4Y35YnjlMogSKJk931iNMcd35BtZ4ghfw==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@esbuild/win32-ia32@0.25.11": { + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@esbuild/win32-ia32@0.25.7": { + "integrity": "sha512-4qZ6NUfoiiKZfLAXRsvFkA0hoWVM+1y2bSHXHkpdLAs/+r0LgwqYohmfZCi985c6JWHhiXP30mgZawn/XrqAkQ==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@esbuild/win32-x64@0.25.11": { + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@esbuild/win32-x64@0.25.7": { + "integrity": "sha512-FaPsAHTwm+1Gfvn37Eg3E5HIpfR3i6x1AIcla/MkqAIupD4BW3MrSeUqfoTzwwJhk3WE2/KqUn4/eenEJC76VA==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@hexagon/base64@1.1.28": { + "integrity": "sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==" + }, + "@img/colour@1.0.0": { + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==" + }, + "@img/sharp-darwin-arm64@0.34.4": { + "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==", + "optionalDependencies": [ + "@img/sharp-libvips-darwin-arm64" + ], + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@img/sharp-darwin-x64@0.34.4": { + "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==", + "optionalDependencies": [ + "@img/sharp-libvips-darwin-x64" + ], + "os": ["darwin"], + "cpu": ["x64"] + }, + "@img/sharp-libvips-darwin-arm64@1.2.3": { + "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@img/sharp-libvips-darwin-x64@1.2.3": { + "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@img/sharp-libvips-linux-arm64@1.2.3": { + "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-libvips-linux-arm@1.2.3": { + "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@img/sharp-libvips-linux-ppc64@1.2.3": { + "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@img/sharp-libvips-linux-s390x@1.2.3": { + "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@img/sharp-libvips-linux-x64@1.2.3": { + "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-libvips-linuxmusl-arm64@1.2.3": { + "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-libvips-linuxmusl-x64@1.2.3": { + "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-linux-arm64@0.34.4": { + "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-arm64" + ], + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-linux-arm@0.34.4": { + "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-arm" + ], + "os": ["linux"], + "cpu": ["arm"] + }, + "@img/sharp-linux-ppc64@0.34.4": { + "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-ppc64" + ], + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@img/sharp-linux-s390x@0.34.4": { + "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-s390x" + ], + "os": ["linux"], + "cpu": ["s390x"] + }, + "@img/sharp-linux-x64@0.34.4": { + "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-x64" + ], + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-linuxmusl-arm64@0.34.4": { + "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==", + "optionalDependencies": [ + "@img/sharp-libvips-linuxmusl-arm64" + ], + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-linuxmusl-x64@0.34.4": { + "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==", + "optionalDependencies": [ + "@img/sharp-libvips-linuxmusl-x64" + ], + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-wasm32@0.34.4": { + "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==", + "dependencies": [ + "@emnapi/runtime" + ], + "cpu": ["wasm32"] + }, + "@img/sharp-win32-arm64@0.34.4": { + "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@img/sharp-win32-ia32@0.34.4": { + "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@img/sharp-win32-x64@0.34.4": { + "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@isaacs/cliui@8.0.2": { + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": [ + "string-width@5.1.2", + "string-width-cjs@npm:string-width@4.2.3", + "strip-ansi@7.1.2", + "strip-ansi-cjs@npm:strip-ansi@6.0.1", + "wrap-ansi@8.1.0", + "wrap-ansi-cjs@npm:wrap-ansi@7.0.0" + ] + }, + "@jridgewell/gen-mapping@0.3.13": { + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dependencies": [ + "@jridgewell/sourcemap-codec", + "@jridgewell/trace-mapping" + ] + }, + "@jridgewell/remapping@2.3.5": { + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dependencies": [ + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping" + ] + }, + "@jridgewell/resolve-uri@3.1.2": { + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + }, + "@jridgewell/sourcemap-codec@1.5.5": { + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "@jridgewell/trace-mapping@0.3.31": { + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dependencies": [ + "@jridgewell/resolve-uri", + "@jridgewell/sourcemap-codec" + ] + }, + "@kurkle/color@0.3.4": { + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==" + }, + "@levischuck/tiny-cbor@0.2.11": { + "integrity": "sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==" + }, + "@mjackson/node-fetch-server@0.7.0": { + "integrity": "sha512-un8diyEBKU3BTVj3GzlTPA1kIjCkGdD+AMYQy31Gf9JCkfoZzwgJ79GUtHrF2BN3XPNMLpubbzPcxys+a3uZEw==" + }, + "@noble/hashes@1.8.0": { + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==" + }, + "@nodelib/fs.scandir@2.1.5": { + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": [ + "@nodelib/fs.stat", + "run-parallel" + ] + }, + "@nodelib/fs.stat@2.0.5": { + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk@1.2.8": { + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": [ + "@nodelib/fs.scandir", + "fastq" + ] + }, + "@opentelemetry/api@1.9.0": { + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" + }, + "@peculiar/asn1-android@2.5.0": { + "integrity": "sha512-t8A83hgghWQkcneRsgGs2ebAlRe54ns88p7ouv8PW2tzF1nAW4yHcL4uZKrFpIU+uszIRzTkcCuie37gpkId0A==", + "dependencies": [ + "@peculiar/asn1-schema", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-cms@2.5.0": { + "integrity": "sha512-p0SjJ3TuuleIvjPM4aYfvYw8Fk1Hn/zAVyPJZTtZ2eE9/MIer6/18ROxX6N/e6edVSfvuZBqhxAj3YgsmSjQ/A==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "@peculiar/asn1-x509-attr", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-csr@2.5.0": { + "integrity": "sha512-ioigvA6WSYN9h/YssMmmoIwgl3RvZlAYx4A/9jD2qaqXZwGcNlAxaw54eSx2QG1Yu7YyBC5Rku3nNoHrQ16YsQ==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-ecc@2.5.0": { + "integrity": "sha512-t4eYGNhXtLRxaP50h3sfO6aJebUCDGQACoeexcelL4roMFRRVgB20yBIu2LxsPh/tdW9I282gNgMOyg3ywg/mg==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-pfx@2.5.0": { + "integrity": "sha512-Vj0d0wxJZA+Ztqfb7W+/iu8Uasw6hhKtCdLKXLG/P3kEPIQpqGI4P4YXlROfl7gOCqFIbgsj1HzFIFwQ5s20ug==", + "dependencies": [ + "@peculiar/asn1-cms", + "@peculiar/asn1-pkcs8", + "@peculiar/asn1-rsa", + "@peculiar/asn1-schema", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-pkcs8@2.5.0": { + "integrity": "sha512-L7599HTI2SLlitlpEP8oAPaJgYssByI4eCwQq2C9eC90otFpm8MRn66PpbKviweAlhinWQ3ZjDD2KIVtx7PaVw==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-pkcs9@2.5.0": { + "integrity": "sha512-UgqSMBLNLR5TzEZ5ZzxR45Nk6VJrammxd60WMSkofyNzd3DQLSNycGWSK5Xg3UTYbXcDFyG8pA/7/y/ztVCa6A==", + "dependencies": [ + "@peculiar/asn1-cms", + "@peculiar/asn1-pfx", + "@peculiar/asn1-pkcs8", + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "@peculiar/asn1-x509-attr", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-rsa@2.5.0": { + "integrity": "sha512-qMZ/vweiTHy9syrkkqWFvbT3eLoedvamcUdnnvwyyUNv5FgFXA3KP8td+ATibnlZ0EANW5PYRm8E6MJzEB/72Q==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-schema@2.5.0": { + "integrity": "sha512-YM/nFfskFJSlHqv59ed6dZlLZqtZQwjRVJ4bBAiWV08Oc+1rSd5lDZcBEx0lGDHfSoH3UziI2pXt2UM33KerPQ==", + "dependencies": [ + "asn1js", + "pvtsutils", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-x509-attr@2.5.0": { + "integrity": "sha512-9f0hPOxiJDoG/bfNLAFven+Bd4gwz/VzrCIIWc1025LEI4BXO0U5fOCTNDPbbp2ll+UzqKsZ3g61mpBp74gk9A==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-x509@2.5.0": { + "integrity": "sha512-CpwtMCTJvfvYTFMuiME5IH+8qmDe3yEWzKHe7OOADbGfq7ohxeLaXwQo0q4du3qs0AII3UbLCvb9NF/6q0oTKQ==", + "dependencies": [ + "@peculiar/asn1-schema", + "asn1js", + "pvtsutils", + "tslib@2.8.1" + ] + }, + "@peculiar/x509@1.14.0": { + "integrity": "sha512-Yc4PDxN3OrxUPiXgU63c+ZRXKGE8YKF2McTciYhUHFtHVB0KMnjeFSU0qpztGhsp4P0uKix4+J2xEpIEDu8oXg==", + "dependencies": [ + "@peculiar/asn1-cms", + "@peculiar/asn1-csr", + "@peculiar/asn1-ecc", + "@peculiar/asn1-pkcs9", + "@peculiar/asn1-rsa", + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "pvtsutils", + "reflect-metadata", + "tslib@2.8.1", + "tsyringe" + ] + }, + "@pkgjs/parseargs@0.11.0": { + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==" + }, + "@preact/signals-core@1.12.1": { + "integrity": "sha512-BwbTXpj+9QutoZLQvbttRg5x3l5468qaV2kufh+51yha1c53ep5dY4kTuZR35+3pAZxpfQerGJiQqg34ZNZ6uA==" + }, + "@preact/signals@2.3.1_preact@10.27.2": { + "integrity": "sha512-nyuRIGmcwM/HjvFHhN2xUWfyla9D4llHt+prWoxjQfD6b5prO7CFPlG/xjJkP31Oic4KQXfH9SIhJFP9cy4lmg==", + "dependencies": [ + "@preact/signals-core", + "preact" + ] + }, + "@prefresh/babel-plugin@0.5.2": { + "integrity": "sha512-AOl4HG6dAxWkJ5ndPHBgBa49oo/9bOiJuRDKHLSTyH+Fd9x00shTXpdiTj1W41l6oQIwUOAgJeHMn4QwIDpHkA==" + }, + "@prefresh/core@1.5.8_preact@10.27.2": { + "integrity": "sha512-T7HMpakS1iPVCFZvfDLMGyrWAcO3toUN9/RkJUqqoRr/vNhQrZgHjidfhq3awDzAQtw1emDWH8dsOeu0DWqtgA==", + "dependencies": [ + "preact" + ] + }, + "@prefresh/utils@1.2.1": { + "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==" + }, + "@prefresh/vite@2.4.11_preact@10.27.2_vite@7.1.7__picomatch@4.0.3": { + "integrity": "sha512-/XjURQqdRiCG3NpMmWqE9kJwrg9IchIOWHzulCfqg2sRe/8oQ1g5De7xrk9lbqPIQLn7ntBkKdqWXIj4E9YXyg==", + "dependencies": [ + "@babel/core", + "@prefresh/babel-plugin", + "@prefresh/core", + "@prefresh/utils", + "@rollup/pluginutils", + "preact", + "vite" + ] + }, + "@rollup/pluginutils@4.2.1": { + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dependencies": [ + "estree-walker", + "picomatch@2.3.1" + ] + }, + "@rollup/rollup-android-arm-eabi@4.52.5": { + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", + "os": ["android"], + "cpu": ["arm"] + }, + "@rollup/rollup-android-arm64@4.52.5": { + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@rollup/rollup-darwin-arm64@4.52.5": { + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@rollup/rollup-darwin-x64@4.52.5": { + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@rollup/rollup-freebsd-arm64@4.52.5": { + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", + "os": ["freebsd"], + "cpu": ["arm64"] + }, + "@rollup/rollup-freebsd-x64@4.52.5": { + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@rollup/rollup-linux-arm-gnueabihf@4.52.5": { + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@rollup/rollup-linux-arm-musleabihf@4.52.5": { + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@rollup/rollup-linux-arm64-gnu@4.52.5": { + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@rollup/rollup-linux-arm64-musl@4.52.5": { + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@rollup/rollup-linux-loong64-gnu@4.52.5": { + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@rollup/rollup-linux-ppc64-gnu@4.52.5": { + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@rollup/rollup-linux-riscv64-gnu@4.52.5": { + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@rollup/rollup-linux-riscv64-musl@4.52.5": { + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@rollup/rollup-linux-s390x-gnu@4.52.5": { + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@rollup/rollup-linux-x64-gnu@4.52.5": { + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@rollup/rollup-linux-x64-musl@4.52.5": { + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@rollup/rollup-openharmony-arm64@4.52.5": { + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", + "os": ["openharmony"], + "cpu": ["arm64"] + }, + "@rollup/rollup-win32-arm64-msvc@4.52.5": { + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@rollup/rollup-win32-ia32-msvc@4.52.5": { + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@rollup/rollup-win32-x64-gnu@4.52.5": { + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@rollup/rollup-win32-x64-msvc@4.52.5": { + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@trysound/sax@0.2.0": { + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + }, + "@types/estree@1.0.8": { + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + }, + "ansi-regex@5.0.1": { + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-regex@6.2.2": { + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" + }, + "ansi-styles@4.3.0": { + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": [ + "color-convert" + ] + }, + "ansi-styles@6.2.3": { + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==" + }, + "any-promise@1.3.0": { + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "anymatch@3.1.3": { + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": [ + "normalize-path", + "picomatch@2.3.1" + ] + }, + "arg@5.0.2": { + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "asn1js@3.0.6": { + "integrity": "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==", + "dependencies": [ + "pvtsutils", + "pvutils", + "tslib@2.8.1" + ] + }, + "autoprefixer@10.4.17_postcss@8.4.35": { + "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "dependencies": [ + "browserslist", + "caniuse-lite", + "fraction.js", + "normalize-range", + "picocolors", + "postcss@8.4.35", + "postcss-value-parser" + ], + "bin": true + }, + "balanced-match@1.0.2": { + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "baseline-browser-mapping@2.8.20": { + "integrity": "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==", + "bin": true + }, + "binary-extensions@2.3.0": { + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" + }, + "boolbase@1.0.0": { + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion@2.0.2": { + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": [ + "balanced-match" + ] + }, + "braces@3.0.3": { + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": [ + "fill-range" + ] + }, + "browserslist@4.27.0": { + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "dependencies": [ + "baseline-browser-mapping", + "caniuse-lite", + "electron-to-chromium", + "node-releases", + "update-browserslist-db" + ], + "bin": true + }, + "camelcase-css@2.0.1": { + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-api@3.0.0": { + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": [ + "browserslist", + "caniuse-lite", + "lodash.memoize", + "lodash.uniq" + ] + }, + "caniuse-lite@1.0.30001751": { + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==" + }, + "chart.js@4.5.0": { + "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", + "dependencies": [ + "@kurkle/color" + ] + }, + "chokidar@3.6.0": { + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": [ + "anymatch", + "braces", + "glob-parent@5.1.2", + "is-binary-path", + "is-glob", + "normalize-path", + "readdirp" + ], + "optionalDependencies": [ + "fsevents" + ] + }, + "color-convert@2.0.1": { + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": [ + "color-name" + ] + }, + "color-name@1.1.4": { + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colord@2.9.3": { + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "commander@4.1.1": { + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "commander@7.2.0": { + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "convert-source-map@2.0.0": { + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "cross-spawn@7.0.6": { + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": [ + "path-key", + "shebang-command", + "which" + ] + }, + "css-declaration-sorter@7.3.0_postcss@8.4.35": { + "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "dependencies": [ + "postcss@8.4.35" + ] + }, + "css-select@5.2.2": { + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dependencies": [ + "boolbase", + "css-what", + "domhandler", + "domutils", + "nth-check" + ] + }, + "css-tree@2.2.1": { + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dependencies": [ + "mdn-data@2.0.28", + "source-map-js" + ] + }, + "css-tree@2.3.1": { + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dependencies": [ + "mdn-data@2.0.30", + "source-map-js" + ] + }, + "css-what@6.2.2": { + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==" + }, + "cssesc@3.0.0": { + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": true + }, + "cssnano-preset-default@6.1.2_postcss@8.4.35": { + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "dependencies": [ + "browserslist", + "css-declaration-sorter", + "cssnano-utils", + "postcss@8.4.35", + "postcss-calc", + "postcss-colormin", + "postcss-convert-values", + "postcss-discard-comments", + "postcss-discard-duplicates", + "postcss-discard-empty", + "postcss-discard-overridden", + "postcss-merge-longhand", + "postcss-merge-rules", + "postcss-minify-font-values", + "postcss-minify-gradients", + "postcss-minify-params", + "postcss-minify-selectors", + "postcss-normalize-charset", + "postcss-normalize-display-values", + "postcss-normalize-positions", + "postcss-normalize-repeat-style", + "postcss-normalize-string", + "postcss-normalize-timing-functions", + "postcss-normalize-unicode", + "postcss-normalize-url", + "postcss-normalize-whitespace", + "postcss-ordered-values", + "postcss-reduce-initial", + "postcss-reduce-transforms", + "postcss-svgo", + "postcss-unique-selectors" + ] + }, + "cssnano-utils@4.0.2_postcss@8.4.35": { + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "dependencies": [ + "postcss@8.4.35" + ] + }, + "cssnano@6.0.3_postcss@8.4.35": { + "integrity": "sha512-MRq4CIj8pnyZpcI2qs6wswoYoDD1t0aL28n+41c1Ukcpm56m1h6mCexIHBGjfZfnTqtGSSCP4/fB1ovxgjBOiw==", + "dependencies": [ + "cssnano-preset-default", + "lilconfig", + "postcss@8.4.35" + ] + }, + "csso@5.0.5": { + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dependencies": [ + "css-tree@2.2.1" + ] + }, + "debug@4.4.3": { + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": [ + "ms" + ] + }, + "detect-libc@2.1.2": { + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" + }, + "didyoumean@1.2.2": { + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "dlv@1.1.3": { + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "dom-serializer@2.0.0": { + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": [ + "domelementtype", + "domhandler", + "entities" + ] + }, + "domelementtype@2.3.0": { + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler@5.0.3": { + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": [ + "domelementtype" + ] + }, + "domutils@3.2.2": { + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dependencies": [ + "dom-serializer", + "domelementtype", + "domhandler" + ] + }, + "eastasianwidth@0.2.0": { + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "electron-to-chromium@1.5.241": { + "integrity": "sha512-ILMvKX/ZV5WIJzzdtuHg8xquk2y0BOGlFOxBVwTpbiXqWIH0hamG45ddU4R3PQ0gYu+xgo0vdHXHli9sHIGb4w==" + }, + "emoji-regex@8.0.0": { + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emoji-regex@9.2.2": { + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "entities@4.5.0": { + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "esbuild-wasm@0.25.7": { + "integrity": "sha512-x3t1BlU59YOMtpwzayHxF4LPVujOvNKqm7y6jPvFKC13J8FmJRCdHPJwHq86er7ik+f7uwGcMbe+6KVzLGmsGw==", + "bin": true + }, + "esbuild@0.25.11": { + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", + "optionalDependencies": [ + "@esbuild/aix-ppc64@0.25.11", + "@esbuild/android-arm@0.25.11", + "@esbuild/android-arm64@0.25.11", + "@esbuild/android-x64@0.25.11", + "@esbuild/darwin-arm64@0.25.11", + "@esbuild/darwin-x64@0.25.11", + "@esbuild/freebsd-arm64@0.25.11", + "@esbuild/freebsd-x64@0.25.11", + "@esbuild/linux-arm@0.25.11", + "@esbuild/linux-arm64@0.25.11", + "@esbuild/linux-ia32@0.25.11", + "@esbuild/linux-loong64@0.25.11", + "@esbuild/linux-mips64el@0.25.11", + "@esbuild/linux-ppc64@0.25.11", + "@esbuild/linux-riscv64@0.25.11", + "@esbuild/linux-s390x@0.25.11", + "@esbuild/linux-x64@0.25.11", + "@esbuild/netbsd-arm64@0.25.11", + "@esbuild/netbsd-x64@0.25.11", + "@esbuild/openbsd-arm64@0.25.11", + "@esbuild/openbsd-x64@0.25.11", + "@esbuild/openharmony-arm64@0.25.11", + "@esbuild/sunos-x64@0.25.11", + "@esbuild/win32-arm64@0.25.11", + "@esbuild/win32-ia32@0.25.11", + "@esbuild/win32-x64@0.25.11" + ], + "scripts": true, + "bin": true + }, + "esbuild@0.25.7": { + "integrity": "sha512-daJB0q2dmTzo90L9NjRaohhRWrCzYxWNFTjEi72/h+p5DcY3yn4MacWfDakHmaBaDzDiuLJsCh0+6LK/iX+c+Q==", + "optionalDependencies": [ + "@esbuild/aix-ppc64@0.25.7", + "@esbuild/android-arm@0.25.7", + "@esbuild/android-arm64@0.25.7", + "@esbuild/android-x64@0.25.7", + "@esbuild/darwin-arm64@0.25.7", + "@esbuild/darwin-x64@0.25.7", + "@esbuild/freebsd-arm64@0.25.7", + "@esbuild/freebsd-x64@0.25.7", + "@esbuild/linux-arm@0.25.7", + "@esbuild/linux-arm64@0.25.7", + "@esbuild/linux-ia32@0.25.7", + "@esbuild/linux-loong64@0.25.7", + "@esbuild/linux-mips64el@0.25.7", + "@esbuild/linux-ppc64@0.25.7", + "@esbuild/linux-riscv64@0.25.7", + "@esbuild/linux-s390x@0.25.7", + "@esbuild/linux-x64@0.25.7", + "@esbuild/netbsd-arm64@0.25.7", + "@esbuild/netbsd-x64@0.25.7", + "@esbuild/openbsd-arm64@0.25.7", + "@esbuild/openbsd-x64@0.25.7", + "@esbuild/openharmony-arm64@0.25.7", + "@esbuild/sunos-x64@0.25.7", + "@esbuild/win32-arm64@0.25.7", + "@esbuild/win32-ia32@0.25.7", + "@esbuild/win32-x64@0.25.7" + ], + "scripts": true, + "bin": true + }, + "escalade@3.2.0": { + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" + }, + "estree-walker@2.0.2": { + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "fast-glob@3.3.3": { + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dependencies": [ + "@nodelib/fs.stat", + "@nodelib/fs.walk", + "glob-parent@5.1.2", + "merge2", + "micromatch" + ] + }, + "fastq@1.19.1": { + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dependencies": [ + "reusify" + ] + }, + "fdir@6.5.0_picomatch@4.0.3": { + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dependencies": [ + "picomatch@4.0.3" + ], + "optionalPeers": [ + "picomatch@4.0.3" + ] + }, + "fill-range@7.1.1": { + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": [ + "to-regex-range" + ] + }, + "foreground-child@3.3.1": { + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": [ + "cross-spawn", + "signal-exit" + ] + }, + "fraction.js@4.3.7": { + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==" + }, + "fsevents@2.3.3": { + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "os": ["darwin"], + "scripts": true + }, + "function-bind@1.1.2": { + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "gensync@1.0.0-beta.2": { + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "glob-parent@5.1.2": { + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": [ + "is-glob" + ] + }, + "glob-parent@6.0.2": { + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": [ + "is-glob" + ] + }, + "glob@10.4.5": { + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": [ + "foreground-child", + "jackspeak", + "minimatch", + "minipass", + "package-json-from-dist", + "path-scurry" + ], + "bin": true + }, + "hasown@2.0.2": { + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": [ + "function-bind" + ] + }, + "is-binary-path@2.1.0": { + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": [ + "binary-extensions" + ] + }, + "is-core-module@2.16.1": { + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": [ + "hasown" + ] + }, + "is-extglob@2.1.1": { + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point@3.0.0": { + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob@4.0.3": { + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": [ + "is-extglob" + ] + }, + "is-number@7.0.0": { + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "isexe@2.0.0": { + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "jackspeak@3.4.3": { + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": [ + "@isaacs/cliui" + ], + "optionalDependencies": [ + "@pkgjs/parseargs" + ] + }, + "jiti@1.21.7": { + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "bin": true + }, + "jose@6.1.0": { + "integrity": "sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==" + }, + "js-tokens@4.0.0": { + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc@3.1.0": { + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "bin": true + }, + "json5@2.2.3": { + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": true + }, + "lilconfig@3.1.3": { + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" + }, + "lines-and-columns@1.2.4": { + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "lodash.memoize@4.1.2": { + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "lodash.uniq@4.5.0": { + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "lru-cache@10.4.3": { + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "lru-cache@5.1.1": { + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": [ + "yallist" + ] + }, + "mdn-data@2.0.28": { + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + }, + "mdn-data@2.0.30": { + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + }, + "merge2@1.4.1": { + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "micromatch@4.0.8": { + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": [ + "braces", + "picomatch@2.3.1" + ] + }, + "minimatch@9.0.5": { + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": [ + "brace-expansion" + ] + }, + "minipass@7.1.2": { + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + }, + "mrmime@2.0.1": { + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==" + }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "mz@2.7.0": { + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": [ + "any-promise", + "object-assign", + "thenify-all" + ] + }, + "nanoid@3.3.11": { + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "bin": true + }, + "node-releases@2.0.26": { + "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==" + }, + "nodemailer@7.0.6": { + "integrity": "sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw==" + }, + "normalize-path@3.0.0": { + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range@0.1.2": { + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + }, + "nth-check@2.1.1": { + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": [ + "boolbase" + ] + }, + "oauth4webapi@3.8.2": { + "integrity": "sha512-FzZZ+bht5X0FKe7Mwz3DAVAmlH1BV5blSak/lHMBKz0/EBMhX6B10GlQYI51+oRp8ObJaX0g6pXrAxZh5s8rjw==" + }, + "object-assign@4.1.1": { + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash@3.0.0": { + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "openid-client@6.8.0": { + "integrity": "sha512-oG1d1nAVhIIE+JSjLS+7E9wY1QOJpZltkzlJdbZ7kEn7Hp3hqur2TEeQ8gLOHoHkhbRAGZJKoOnEQcLOQJuIyg==", + "dependencies": [ + "jose", + "oauth4webapi" + ] + }, + "otpauth@9.4.1": { + "integrity": "sha512-+iVvys36CFsyXEqfNftQm1II7SW23W1wx9RwNk0Cd97lbvorqAhBDksb/0bYry087QMxjiuBS0wokdoZ0iUeAw==", + "dependencies": [ + "@noble/hashes" + ] + }, + "package-json-from-dist@1.0.1": { + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "path-key@3.1.1": { + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse@1.0.7": { + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-scurry@1.11.1": { + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": [ + "lru-cache@10.4.3", + "minipass" + ] + }, + "picocolors@1.1.1": { + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "picomatch@2.3.1": { + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "picomatch@4.0.3": { + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + }, + "pify@2.3.0": { + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pirates@4.0.7": { + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==" + }, + "postcss-calc@9.0.1_postcss@8.4.35": { + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "dependencies": [ + "postcss@8.4.35", + "postcss-selector-parser", + "postcss-value-parser" + ] + }, + "postcss-colormin@6.1.0_postcss@8.4.35": { + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "dependencies": [ + "browserslist", + "caniuse-api", + "colord", + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-convert-values@6.1.0_postcss@8.4.35": { + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "dependencies": [ + "browserslist", + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-discard-comments@6.0.2_postcss@8.4.35": { + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "dependencies": [ + "postcss@8.4.35" + ] + }, + "postcss-discard-duplicates@6.0.3_postcss@8.4.35": { + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "dependencies": [ + "postcss@8.4.35" + ] + }, + "postcss-discard-empty@6.0.3_postcss@8.4.35": { + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "dependencies": [ + "postcss@8.4.35" + ] + }, + "postcss-discard-overridden@6.0.2_postcss@8.4.35": { + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "dependencies": [ + "postcss@8.4.35" + ] + }, + "postcss-import@15.1.0_postcss@8.5.6": { + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": [ + "postcss@8.5.6", + "postcss-value-parser", + "read-cache", + "resolve" + ] + }, + "postcss-js@4.1.0_postcss@8.5.6": { + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dependencies": [ + "camelcase-css", + "postcss@8.5.6" + ] + }, + "postcss-load-config@4.0.2_postcss@8.5.6": { + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dependencies": [ + "lilconfig", + "postcss@8.5.6", + "yaml" + ], + "optionalPeers": [ + "postcss@8.5.6" + ] + }, + "postcss-merge-longhand@6.0.5_postcss@8.4.35": { + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "dependencies": [ + "postcss@8.4.35", + "postcss-value-parser", + "stylehacks" + ] + }, + "postcss-merge-rules@6.1.1_postcss@8.4.35": { + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "dependencies": [ + "browserslist", + "caniuse-api", + "cssnano-utils", + "postcss@8.4.35", + "postcss-selector-parser" + ] + }, + "postcss-minify-font-values@6.1.0_postcss@8.4.35": { + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "dependencies": [ + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-minify-gradients@6.0.3_postcss@8.4.35": { + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "dependencies": [ + "colord", + "cssnano-utils", + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-minify-params@6.1.0_postcss@8.4.35": { + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "dependencies": [ + "browserslist", + "cssnano-utils", + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-minify-selectors@6.0.4_postcss@8.4.35": { + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "dependencies": [ + "postcss@8.4.35", + "postcss-selector-parser" + ] + }, + "postcss-nested@6.2.0_postcss@8.5.6": { + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dependencies": [ + "postcss@8.5.6", + "postcss-selector-parser" + ] + }, + "postcss-normalize-charset@6.0.2_postcss@8.4.35": { + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "dependencies": [ + "postcss@8.4.35" + ] + }, + "postcss-normalize-display-values@6.0.2_postcss@8.4.35": { + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "dependencies": [ + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-normalize-positions@6.0.2_postcss@8.4.35": { + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "dependencies": [ + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-normalize-repeat-style@6.0.2_postcss@8.4.35": { + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "dependencies": [ + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-normalize-string@6.0.2_postcss@8.4.35": { + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "dependencies": [ + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-normalize-timing-functions@6.0.2_postcss@8.4.35": { + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "dependencies": [ + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-normalize-unicode@6.1.0_postcss@8.4.35": { + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "dependencies": [ + "browserslist", + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-normalize-url@6.0.2_postcss@8.4.35": { + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "dependencies": [ + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-normalize-whitespace@6.0.2_postcss@8.4.35": { + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "dependencies": [ + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-ordered-values@6.0.2_postcss@8.4.35": { + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "dependencies": [ + "cssnano-utils", + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-reduce-initial@6.1.0_postcss@8.4.35": { + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "dependencies": [ + "browserslist", + "caniuse-api", + "postcss@8.4.35" + ] + }, + "postcss-reduce-transforms@6.0.2_postcss@8.4.35": { + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "dependencies": [ + "postcss@8.4.35", + "postcss-value-parser" + ] + }, + "postcss-selector-parser@6.1.2": { + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": [ + "cssesc", + "util-deprecate" + ] + }, + "postcss-svgo@6.0.3_postcss@8.4.35": { + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "dependencies": [ + "postcss@8.4.35", + "postcss-value-parser", + "svgo" + ] + }, + "postcss-unique-selectors@6.0.4_postcss@8.4.35": { + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "dependencies": [ + "postcss@8.4.35", + "postcss-selector-parser" + ] + }, + "postcss-value-parser@4.2.0": { + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "postcss@8.4.35": { + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dependencies": [ + "nanoid", + "picocolors", + "source-map-js" + ] + }, + "postcss@8.5.6": { + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dependencies": [ + "nanoid", + "picocolors", + "source-map-js" + ] + }, + "preact-render-to-string@6.6.3_preact@10.27.2": { + "integrity": "sha512-7oHG7jzjriqsFPkSPiPnzrQ0GcxFm6wOkYWNdStK5Ks9YlWSQQXKGBRAX4nKDdqX7HAQuRvI4pZNZMycK4WwDw==", + "dependencies": [ + "preact" + ] + }, + "preact@10.27.2": { + "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==" + }, + "pvtsutils@1.3.6": { + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dependencies": [ + "tslib@2.8.1" + ] + }, + "pvutils@1.1.5": { + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==" + }, + "queue-microtask@1.2.3": { + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "read-cache@1.0.0": { + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": [ + "pify" + ] + }, + "readdirp@3.6.0": { + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": [ + "picomatch@2.3.1" + ] + }, + "reflect-metadata@0.2.2": { + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" + }, + "resolve@1.22.11": { + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dependencies": [ + "is-core-module", + "path-parse", + "supports-preserve-symlinks-flag" + ], + "bin": true + }, + "reusify@1.1.0": { + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" + }, + "rollup@4.52.5": { + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", + "dependencies": [ + "@types/estree" + ], + "optionalDependencies": [ + "@rollup/rollup-android-arm-eabi", + "@rollup/rollup-android-arm64", + "@rollup/rollup-darwin-arm64", + "@rollup/rollup-darwin-x64", + "@rollup/rollup-freebsd-arm64", + "@rollup/rollup-freebsd-x64", + "@rollup/rollup-linux-arm-gnueabihf", + "@rollup/rollup-linux-arm-musleabihf", + "@rollup/rollup-linux-arm64-gnu", + "@rollup/rollup-linux-arm64-musl", + "@rollup/rollup-linux-loong64-gnu", + "@rollup/rollup-linux-ppc64-gnu", + "@rollup/rollup-linux-riscv64-gnu", + "@rollup/rollup-linux-riscv64-musl", + "@rollup/rollup-linux-s390x-gnu", + "@rollup/rollup-linux-x64-gnu", + "@rollup/rollup-linux-x64-musl", + "@rollup/rollup-openharmony-arm64", + "@rollup/rollup-win32-arm64-msvc", + "@rollup/rollup-win32-ia32-msvc", + "@rollup/rollup-win32-x64-gnu", + "@rollup/rollup-win32-x64-msvc", + "fsevents" + ], + "bin": true + }, + "run-parallel@1.2.0": { + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dependencies": [ + "queue-microtask" + ] + }, + "semver@6.3.1": { + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": true + }, + "semver@7.7.3": { + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "bin": true + }, + "sharp@0.34.4": { + "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==", + "dependencies": [ + "@img/colour", + "detect-libc", + "semver@7.7.3" + ], + "optionalDependencies": [ + "@img/sharp-darwin-arm64", + "@img/sharp-darwin-x64", + "@img/sharp-libvips-darwin-arm64", + "@img/sharp-libvips-darwin-x64", + "@img/sharp-libvips-linux-arm", + "@img/sharp-libvips-linux-arm64", + "@img/sharp-libvips-linux-ppc64", + "@img/sharp-libvips-linux-s390x", + "@img/sharp-libvips-linux-x64", + "@img/sharp-libvips-linuxmusl-arm64", + "@img/sharp-libvips-linuxmusl-x64", + "@img/sharp-linux-arm", + "@img/sharp-linux-arm64", + "@img/sharp-linux-ppc64", + "@img/sharp-linux-s390x", + "@img/sharp-linux-x64", + "@img/sharp-linuxmusl-arm64", + "@img/sharp-linuxmusl-x64", + "@img/sharp-wasm32", + "@img/sharp-win32-arm64", + "@img/sharp-win32-ia32", + "@img/sharp-win32-x64" + ], + "scripts": true + }, + "shebang-command@2.0.0": { + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": [ + "shebang-regex" + ] + }, + "shebang-regex@3.0.0": { + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit@4.1.0": { + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + }, + "source-map-js@1.2.1": { + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + }, + "string-width@4.2.3": { + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": [ + "emoji-regex@8.0.0", + "is-fullwidth-code-point", + "strip-ansi@6.0.1" + ] + }, + "string-width@5.1.2": { + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": [ + "eastasianwidth", + "emoji-regex@9.2.2", + "strip-ansi@7.1.2" + ] + }, + "strip-ansi@6.0.1": { + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": [ + "ansi-regex@5.0.1" + ] + }, + "strip-ansi@7.1.2": { + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": [ + "ansi-regex@6.2.2" + ] + }, + "stylehacks@6.1.1_postcss@8.4.35": { + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "dependencies": [ + "browserslist", + "postcss@8.4.35", + "postcss-selector-parser" + ] + }, + "sucrase@3.35.0": { + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": [ + "@jridgewell/gen-mapping", + "commander@4.1.1", + "glob", + "lines-and-columns", + "mz", + "pirates", + "ts-interface-checker" + ], + "bin": true + }, + "supports-preserve-symlinks-flag@1.0.0": { + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "svgo@3.3.2": { + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dependencies": [ + "@trysound/sax", + "commander@7.2.0", + "css-select", + "css-tree@2.3.1", + "css-what", + "csso", + "picocolors" + ], + "bin": true + }, + "tailwindcss@3.4.17_postcss@8.5.6": { + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dependencies": [ + "@alloc/quick-lru", + "arg", + "chokidar", + "didyoumean", + "dlv", + "fast-glob", + "glob-parent@6.0.2", + "is-glob", + "jiti", + "lilconfig", + "micromatch", + "normalize-path", + "object-hash", + "picocolors", + "postcss@8.5.6", + "postcss-import", + "postcss-js", + "postcss-load-config", + "postcss-nested", + "postcss-selector-parser", + "resolve", + "sucrase" + ], + "bin": true + }, + "thenify-all@1.6.0": { + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": [ + "thenify" + ] + }, + "thenify@3.3.1": { + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": [ + "any-promise" + ] + }, + "tinyglobby@0.2.15_picomatch@4.0.3": { + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dependencies": [ + "fdir", + "picomatch@4.0.3" + ] + }, + "to-regex-range@5.0.1": { + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": [ + "is-number" + ] + }, + "ts-interface-checker@0.1.13": { + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "tslib@1.14.1": { + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tslib@2.8.1": { + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "tsyringe@4.10.0": { + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "dependencies": [ + "tslib@1.14.1" + ] + }, + "update-browserslist-db@1.1.4_browserslist@4.27.0": { + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dependencies": [ + "browserslist", + "escalade", + "picocolors" + ], + "bin": true + }, + "util-deprecate@1.0.2": { + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "vite@7.1.7_picomatch@4.0.3": { + "integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", + "dependencies": [ + "esbuild@0.25.11", + "fdir", + "picomatch@4.0.3", + "postcss@8.5.6", + "rollup", + "tinyglobby" + ], + "optionalDependencies": [ + "fsevents" + ], + "bin": true + }, + "which@2.0.2": { + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": [ + "isexe" + ], + "bin": true + }, + "wrap-ansi@7.0.0": { + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": [ + "ansi-styles@4.3.0", + "string-width@4.2.3", + "strip-ansi@6.0.1" + ] + }, + "wrap-ansi@8.1.0": { + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": [ + "ansi-styles@6.2.3", + "string-width@5.1.2", + "strip-ansi@7.1.2" + ] + }, + "yallist@3.1.1": { + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml@2.8.1": { + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "bin": true + } + }, + "redirects": { + "https://esm.sh/@types/babel__helper-validator-identifier@~7.15.2/index.d.ts": "https://esm.sh/@types/babel__helper-validator-identifier@7.15.2/index.d.ts" + }, + "remote": { + "https://deno.land/std@0.208.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.208.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.208.0/fs/_util.ts": "fbf57dcdc9f7bc8128d60301eece608246971a7836a3bb1e78da75314f08b978", + "https://deno.land/std@0.208.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", + "https://deno.land/std@0.208.0/fs/expand_glob.ts": "4f98c508fc9e40d6311d2f7fd88aaad05235cc506388c22dda315e095305811d", + "https://deno.land/std@0.208.0/fs/walk.ts": "c1e6b43f72a46e89b630140308bd51a4795d416a416b4cfb7cd4bd1e25946723", + "https://deno.land/std@0.208.0/path/_common/assert_path.ts": "061e4d093d4ba5aebceb2c4da3318bfe3289e868570e9d3a8e327d91c2958946", + "https://deno.land/std@0.208.0/path/_common/basename.ts": "0d978ff818f339cd3b1d09dc914881f4d15617432ae519c1b8fdc09ff8d3789a", + "https://deno.land/std@0.208.0/path/_common/common.ts": "9e4233b2eeb50f8b2ae10ecc2108f58583aea6fd3e8907827020282dc2b76143", + "https://deno.land/std@0.208.0/path/_common/constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.208.0/path/_common/dirname.ts": "2ba7fb4cc9fafb0f38028f434179579ce61d4d9e51296fad22b701c3d3cd7397", + "https://deno.land/std@0.208.0/path/_common/format.ts": "11aa62e316dfbf22c126917f5e03ea5fe2ee707386555a8f513d27ad5756cf96", + "https://deno.land/std@0.208.0/path/_common/from_file_url.ts": "ef1bf3197d2efbf0297a2bdbf3a61d804b18f2bcce45548ae112313ec5be3c22", + "https://deno.land/std@0.208.0/path/_common/glob_to_reg_exp.ts": "5c3c2b79fc2294ec803d102bd9855c451c150021f452046312819fbb6d4dc156", + "https://deno.land/std@0.208.0/path/_common/normalize.ts": "2ba7fb4cc9fafb0f38028f434179579ce61d4d9e51296fad22b701c3d3cd7397", + "https://deno.land/std@0.208.0/path/_common/normalize_string.ts": "88c472f28ae49525f9fe82de8c8816d93442d46a30d6bb5063b07ff8a89ff589", + "https://deno.land/std@0.208.0/path/_common/relative.ts": "1af19d787a2a84b8c534cc487424fe101f614982ae4851382c978ab2216186b4", + "https://deno.land/std@0.208.0/path/_common/strip_trailing_separators.ts": "7ffc7c287e97bdeeee31b155828686967f222cd73f9e5780bfe7dfb1b58c6c65", + "https://deno.land/std@0.208.0/path/_common/to_file_url.ts": "a8cdd1633bc9175b7eebd3613266d7c0b6ae0fb0cff24120b6092ac31662f9ae", + "https://deno.land/std@0.208.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.208.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2", + "https://deno.land/std@0.208.0/path/basename.ts": "04bb5ef3e86bba8a35603b8f3b69537112cdd19ce64b77f2522006da2977a5f3", + "https://deno.land/std@0.208.0/path/common.ts": "f4d061c7d0b95a65c2a1a52439edec393e906b40f1caf4604c389fae7caa80f5", + "https://deno.land/std@0.208.0/path/dirname.ts": "88a0a71c21debafc4da7a4cd44fd32e899462df458fbca152390887d41c40361", + "https://deno.land/std@0.208.0/path/extname.ts": "2da4e2490f3b48b7121d19fb4c91681a5e11bd6bd99df4f6f47d7a71bb6ecdf2", + "https://deno.land/std@0.208.0/path/format.ts": "3457530cc85d1b4bab175f9ae73998b34fd456c830d01883169af0681b8894fb", + "https://deno.land/std@0.208.0/path/from_file_url.ts": "e7fa233ea1dff9641e8d566153a24d95010110185a6f418dd2e32320926043f8", + "https://deno.land/std@0.208.0/path/glob.ts": "a00a81a55c02bbe074ab21a50b6495c6f7795f54cd718c824adaa92c6c9b7419", + "https://deno.land/std@0.208.0/path/glob_to_regexp.ts": "74d7448c471e293d03f05ccb968df4365fed6aaa508506b6325a8efdc01d8271", + "https://deno.land/std@0.208.0/path/is_absolute.ts": "67232b41b860571c5b7537f4954c88d86ae2ba45e883ee37d3dec27b74909d13", + "https://deno.land/std@0.208.0/path/is_glob.ts": "567dce5c6656bdedfc6b3ee6c0833e1e4db2b8dff6e62148e94a917f289c06ad", + "https://deno.land/std@0.208.0/path/join.ts": "98d3d76c819af4a11a81d5ba2dbb319f1ce9d63fc2b615597d4bcfddd4a89a09", + "https://deno.land/std@0.208.0/path/join_globs.ts": "9b84d5103b63d3dbed4b2cf8b12477b2ad415c7d343f1488505162dc0e5f4db8", + "https://deno.land/std@0.208.0/path/mod.ts": "3defabebc98279e62b392fee7a6937adc932a8f4dcd2471441e36c15b97b00e0", + "https://deno.land/std@0.208.0/path/normalize.ts": "aa95be9a92c7bd4f9dc0ba51e942a1973e2b93d266cd74f5ca751c136d520b66", + "https://deno.land/std@0.208.0/path/normalize_glob.ts": "674baa82e1c00b6cb153bbca36e06f8e0337cb8062db6d905ab5de16076ca46b", + "https://deno.land/std@0.208.0/path/parse.ts": "d87ff0deef3fb495bc0d862278ff96da5a06acf0625ca27769fc52ac0d3d6ece", + "https://deno.land/std@0.208.0/path/posix/_util.ts": "ecf49560fedd7dd376c6156cc5565cad97c1abe9824f4417adebc7acc36c93e5", + "https://deno.land/std@0.208.0/path/posix/basename.ts": "a630aeb8fd8e27356b1823b9dedd505e30085015407caa3396332752f6b8406a", + "https://deno.land/std@0.208.0/path/posix/common.ts": "e781d395dc76f6282e3f7dd8de13194abb8b04a82d109593141abc6e95755c8b", + "https://deno.land/std@0.208.0/path/posix/dirname.ts": "f48c9c42cc670803b505478b7ef162c7cfa9d8e751b59d278b2ec59470531472", + "https://deno.land/std@0.208.0/path/posix/extname.ts": "ee7f6571a9c0a37f9218fbf510c440d1685a7c13082c348d701396cc795e0be0", + "https://deno.land/std@0.208.0/path/posix/format.ts": "b94876f77e61bfe1f147d5ccb46a920636cd3cef8be43df330f0052b03875968", + "https://deno.land/std@0.208.0/path/posix/from_file_url.ts": "b97287a83e6407ac27bdf3ab621db3fccbf1c27df0a1b1f20e1e1b5acf38a379", + "https://deno.land/std@0.208.0/path/posix/glob_to_regexp.ts": "6ed00c71fbfe0ccc35977c35444f94e82200b721905a60bd1278b1b768d68b1a", + "https://deno.land/std@0.208.0/path/posix/is_absolute.ts": "159900a3422d11069d48395568217eb7fc105ceda2683d03d9b7c0f0769e01b8", + "https://deno.land/std@0.208.0/path/posix/is_glob.ts": "ec4fbc604b9db8487f7b56ab0e759b24a971ab6a45f7b0b698bc39b8b9f9680f", + "https://deno.land/std@0.208.0/path/posix/join.ts": "0c0d84bdc344876930126640011ec1b888e6facf74153ffad9ef26813aa2a076", + "https://deno.land/std@0.208.0/path/posix/join_globs.ts": "f4838d54b1f60a34a40625a3293f6e583135348be1b2974341ac04743cb26121", + "https://deno.land/std@0.208.0/path/posix/mod.ts": "f1b08a7f64294b7de87fc37190d63b6ce5b02889af9290c9703afe01951360ae", + "https://deno.land/std@0.208.0/path/posix/normalize.ts": "11de90a94ab7148cc46e5a288f7d732aade1d616bc8c862f5560fa18ff987b4b", + "https://deno.land/std@0.208.0/path/posix/normalize_glob.ts": "10a1840c628ebbab679254d5fa1c20e59106102354fb648a1765aed72eb9f3f9", + "https://deno.land/std@0.208.0/path/posix/parse.ts": "199208f373dd93a792e9c585352bfc73a6293411bed6da6d3bc4f4ef90b04c8e", + "https://deno.land/std@0.208.0/path/posix/relative.ts": "e2f230608b0f083e6deaa06e063943e5accb3320c28aef8d87528fbb7fe6504c", + "https://deno.land/std@0.208.0/path/posix/resolve.ts": "51579d83159d5c719518c9ae50812a63959bbcb7561d79acbdb2c3682236e285", + "https://deno.land/std@0.208.0/path/posix/separator.ts": "0b6573b5f3269a3164d8edc9cefc33a02dd51003731c561008c8bb60220ebac1", + "https://deno.land/std@0.208.0/path/posix/to_file_url.ts": "08d43ea839ee75e9b8b1538376cfe95911070a655cd312bc9a00f88ef14967b6", + "https://deno.land/std@0.208.0/path/posix/to_namespaced_path.ts": "c9228a0e74fd37e76622cd7b142b8416663a9b87db643302fa0926b5a5c83bdc", + "https://deno.land/std@0.208.0/path/relative.ts": "23d45ede8b7ac464a8299663a43488aad6b561414e7cbbe4790775590db6349c", + "https://deno.land/std@0.208.0/path/resolve.ts": "5b184efc87155a0af9fa305ff68a109e28de9aee81fc3e77cd01380f19daf867", + "https://deno.land/std@0.208.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f", + "https://deno.land/std@0.208.0/path/to_file_url.ts": "edaafa089e0bce386e1b2d47afe7c72e379ff93b28a5829a5885e4b6c626d864", + "https://deno.land/std@0.208.0/path/to_namespaced_path.ts": "cf8734848aac3c7527d1689d2adf82132b1618eff3cc523a775068847416b22a", + "https://deno.land/std@0.208.0/path/windows/_util.ts": "f32b9444554c8863b9b4814025c700492a2b57ff2369d015360970a1b1099d54", + "https://deno.land/std@0.208.0/path/windows/basename.ts": "8a9dbf7353d50afbc5b221af36c02a72c2d1b2b5b9f7c65bf6a5a2a0baf88ad3", + "https://deno.land/std@0.208.0/path/windows/common.ts": "e781d395dc76f6282e3f7dd8de13194abb8b04a82d109593141abc6e95755c8b", + "https://deno.land/std@0.208.0/path/windows/dirname.ts": "5c2aa541384bf0bd9aca821275d2a8690e8238fa846198ef5c7515ce31a01a94", + "https://deno.land/std@0.208.0/path/windows/extname.ts": "07f4fa1b40d06a827446b3e3bcc8d619c5546b079b8ed0c77040bbef716c7614", + "https://deno.land/std@0.208.0/path/windows/format.ts": "343019130d78f172a5c49fdc7e64686a7faf41553268961e7b6c92a6d6548edf", + "https://deno.land/std@0.208.0/path/windows/from_file_url.ts": "d53335c12b0725893d768be3ac6bf0112cc5b639d2deb0171b35988493b46199", + "https://deno.land/std@0.208.0/path/windows/glob_to_regexp.ts": "290755e18ec6c1a4f4d711c3390537358e8e3179581e66261a0cf348b1a13395", + "https://deno.land/std@0.208.0/path/windows/is_absolute.ts": "245b56b5f355ede8664bd7f080c910a97e2169972d23075554ae14d73722c53c", + "https://deno.land/std@0.208.0/path/windows/is_glob.ts": "ec4fbc604b9db8487f7b56ab0e759b24a971ab6a45f7b0b698bc39b8b9f9680f", + "https://deno.land/std@0.208.0/path/windows/join.ts": "e6600bf88edeeef4e2276e155b8de1d5dec0435fd526ba2dc4d37986b2882f16", + "https://deno.land/std@0.208.0/path/windows/join_globs.ts": "f4838d54b1f60a34a40625a3293f6e583135348be1b2974341ac04743cb26121", + "https://deno.land/std@0.208.0/path/windows/mod.ts": "d7040f461465c2c21c1c68fc988ef0bdddd499912138cde3abf6ad60c7fb3814", + "https://deno.land/std@0.208.0/path/windows/normalize.ts": "9deebbf40c81ef540b7b945d4ccd7a6a2c5a5992f791e6d3377043031e164e69", + "https://deno.land/std@0.208.0/path/windows/normalize_glob.ts": "344ff5ed45430495b9a3d695567291e50e00b1b3b04ea56712a2acf07ab5c128", + "https://deno.land/std@0.208.0/path/windows/parse.ts": "120faf778fe1f22056f33ded069b68e12447668fcfa19540c0129561428d3ae5", + "https://deno.land/std@0.208.0/path/windows/relative.ts": "026855cd2c36c8f28f1df3c6fbd8f2449a2aa21f48797a74700c5d872b86d649", + "https://deno.land/std@0.208.0/path/windows/resolve.ts": "5ff441ab18a2346abadf778121128ee71bda4d0898513d4639a6ca04edca366b", + "https://deno.land/std@0.208.0/path/windows/separator.ts": "ae21f27015f10510ed1ac4a0ba9c4c9c967cbdd9d9e776a3e4967553c397bd5d", + "https://deno.land/std@0.208.0/path/windows/to_file_url.ts": "8e9ea9e1ff364aa06fa72999204229952d0a279dbb876b7b838b2b2fea55cce3", + "https://deno.land/std@0.208.0/path/windows/to_namespaced_path.ts": "e0f4d4a5e77f28a5708c1a33ff24360f35637ba6d8f103d19661255ef7bfd50d", + "https://deno.land/std@0.216.0/assert/_constants.ts": "a271e8ef5a573f1df8e822a6eb9d09df064ad66a4390f21b3e31f820a38e0975", + "https://deno.land/std@0.216.0/assert/_diff.ts": "dcc63d94ca289aec80644030cf88ccbf7acaa6fbd7b0f22add93616b36593840", + "https://deno.land/std@0.216.0/assert/_format.ts": "0ba808961bf678437fb486b56405b6fefad2cf87b5809667c781ddee8c32aff4", + "https://deno.land/std@0.216.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", + "https://deno.land/std@0.216.0/assert/assert_almost_equals.ts": "8b96b7385cc117668b0720115eb6ee73d04c9bcb2f5d2344d674918c9113688f", + "https://deno.land/std@0.216.0/assert/assert_array_includes.ts": "1688d76317fd45b7e93ef9e2765f112fdf2b7c9821016cdfb380b9445374aed1", + "https://deno.land/std@0.216.0/assert/assert_equals.ts": "4497c56fe7d2993b0d447926702802fc0becb44e319079e8eca39b482ee01b4e", + "https://deno.land/std@0.216.0/assert/assert_exists.ts": "24a7bf965e634f909242cd09fbaf38bde6b791128ece08e33ab08586a7cc55c9", + "https://deno.land/std@0.216.0/assert/assert_false.ts": "6f382568e5128c0f855e5f7dbda8624c1ed9af4fcc33ef4a9afeeedcdce99769", + "https://deno.land/std@0.216.0/assert/assert_greater.ts": "4945cf5729f1a38874d7e589e0fe5cc5cd5abe5573ca2ddca9d3791aa891856c", + "https://deno.land/std@0.216.0/assert/assert_greater_or_equal.ts": "573ed8823283b8d94b7443eb69a849a3c369a8eb9666b2d1db50c33763a5d219", + "https://deno.land/std@0.216.0/assert/assert_instance_of.ts": "72dc1faff1e248692d873c89382fa1579dd7b53b56d52f37f9874a75b11ba444", + "https://deno.land/std@0.216.0/assert/assert_is_error.ts": "6596f2b5ba89ba2fe9b074f75e9318cda97a2381e59d476812e30077fbdb6ed2", + "https://deno.land/std@0.216.0/assert/assert_less.ts": "2b4b3fe7910f65f7be52212f19c3977ecb8ba5b2d6d0a296c83cde42920bb005", + "https://deno.land/std@0.216.0/assert/assert_less_or_equal.ts": "b93d212fe669fbde959e35b3437ac9a4468f2e6b77377e7b6ea2cfdd825d38a0", + "https://deno.land/std@0.216.0/assert/assert_match.ts": "ec2d9680ed3e7b9746ec57ec923a17eef6d476202f339ad91d22277d7f1d16e1", + "https://deno.land/std@0.216.0/assert/assert_not_equals.ts": "ac86413ab70ffb14fdfc41740ba579a983fe355ba0ce4a9ab685e6b8e7f6a250", + "https://deno.land/std@0.216.0/assert/assert_not_instance_of.ts": "8f720d92d83775c40b2542a8d76c60c2d4aeddaf8713c8d11df8984af2604931", + "https://deno.land/std@0.216.0/assert/assert_not_match.ts": "b4b7c77f146963e2b673c1ce4846473703409eb93f5ab0eb60f6e6f8aeffe39f", + "https://deno.land/std@0.216.0/assert/assert_not_strict_equals.ts": "da0b8ab60a45d5a9371088378e5313f624799470c3b54c76e8b8abeec40a77be", + "https://deno.land/std@0.216.0/assert/assert_object_match.ts": "e85e5eef62a56ce364c3afdd27978ccab979288a3e772e6855c270a7b118fa49", + "https://deno.land/std@0.216.0/assert/assert_rejects.ts": "e9e0c8d9c3e164c7ac962c37b3be50577c5a2010db107ed272c4c1afb1269f54", + "https://deno.land/std@0.216.0/assert/assert_strict_equals.ts": "0425a98f70badccb151644c902384c12771a93e65f8ff610244b8147b03a2366", + "https://deno.land/std@0.216.0/assert/assert_string_includes.ts": "dfb072a890167146f8e5bdd6fde887ce4657098e9f71f12716ef37f35fb6f4a7", + "https://deno.land/std@0.216.0/assert/assert_throws.ts": "edddd86b39606c342164b49ad88dd39a26e72a26655e07545d172f164b617fa7", + "https://deno.land/std@0.216.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", + "https://deno.land/std@0.216.0/assert/equal.ts": "fae5e8a52a11d3ac694bbe1a53e13a7969e3f60791262312e91a3e741ae519e2", + "https://deno.land/std@0.216.0/assert/fail.ts": "f310e51992bac8e54f5fd8e44d098638434b2edb802383690e0d7a9be1979f1c", + "https://deno.land/std@0.216.0/assert/mod.ts": "325df8c0683ad83a873b9691aa66b812d6275fc9fec0b2d180ac68a2c5efed3b", + "https://deno.land/std@0.216.0/assert/unimplemented.ts": "47ca67d1c6dc53abd0bd729b71a31e0825fc452dbcd4fde4ca06789d5644e7fd", + "https://deno.land/std@0.216.0/assert/unreachable.ts": "38cfecb95d8b06906022d2f9474794fca4161a994f83354fd079cac9032b5145", + "https://deno.land/std@0.216.0/async/delay.ts": "8e1d18fe8b28ff95885e2bc54eccec1713f57f756053576d8228e6ca110793ad", + "https://deno.land/std@0.216.0/datetime/constants.ts": "5c198b3b47fbcc4d913e61dcae1c37e053937affc2c9a6a5ad7e5473bab3e4a6", + "https://deno.land/std@0.216.0/encoding/_util.ts": "beacef316c1255da9bc8e95afb1fa56ed69baef919c88dc06ae6cb7a6103d376", + "https://deno.land/std@0.216.0/encoding/hex.ts": "4d47d3b25103cf81a2ed38f54b394d39a77b63338e1eaa04b70c614cb45ec2e6", + "https://deno.land/std@0.216.0/flags/mod.ts": "9f13f3a49c54618277ac49195af934f1c7d235731bcf80fd33b8b234e6839ce9", + "https://deno.land/std@0.216.0/fmt/colors.ts": "d239d84620b921ea520125d778947881f62c50e78deef2657073840b8af9559a", + "https://deno.land/std@0.216.0/fs/_create_walk_entry.ts": "5d9d2aaec05bcf09a06748b1684224d33eba7a4de24cf4cf5599991ca6b5b412", + "https://deno.land/std@0.216.0/fs/_get_file_info_type.ts": "da7bec18a7661dba360a1db475b826b18977582ce6fc9b25f3d4ee0403fe8cbd", + "https://deno.land/std@0.216.0/fs/_is_same_path.ts": "709c95868345fea051c58b9e96af95cff94e6ae98dfcff2b66dee0c212c4221f", + "https://deno.land/std@0.216.0/fs/_is_subdir.ts": "c68b309d46cc8568ed83c000f608a61bbdba0943b7524e7a30f9e450cf67eecd", + "https://deno.land/std@0.216.0/fs/_to_path_string.ts": "29bfc9c6c112254961d75cbf6ba814d6de5349767818eb93090cecfa9665591e", + "https://deno.land/std@0.216.0/fs/copy.ts": "dc0f68c4b6c3b090bfdb909387e309f6169b746bd713927c9507c9ef545d71f6", + "https://deno.land/std@0.216.0/fs/empty_dir.ts": "4f01e6d56e2aa8d90ad60f20bc25601f516b00f6c3044cdf6863a058791d91aa", + "https://deno.land/std@0.216.0/fs/ensure_dir.ts": "dffff68de0d10799b5aa9e39dec4e327e12bbd29e762292193684542648c4aeb", + "https://deno.land/std@0.216.0/fs/ensure_file.ts": "ac5cfde94786b0284d2c8e9f7f9425269bea1b2140612b4aea1f20b508870f59", + "https://deno.land/std@0.216.0/fs/ensure_link.ts": "d42af2edefeaa9817873ec6e46dc5d209ac4d744f8c69c5ecc2dffade78465b6", + "https://deno.land/std@0.216.0/fs/ensure_symlink.ts": "aee3f1655700f60090b4a3037f5b6c07ab37c36807cccad746ce89987719e6d2", + "https://deno.land/std@0.216.0/fs/eol.ts": "c9807291f78361d49fd986a9be04654610c615c5e2ec63d748976197d30ff206", + "https://deno.land/std@0.216.0/fs/exists.ts": "d2757ef764eaf5c6c5af7228e8447db2de42ab084a2dae540097f905723d83f5", + "https://deno.land/std@0.216.0/fs/expand_glob.ts": "a1ce02b05ed7b96985b0665067c9f1018f3f2ade7ee0fb0d629231050260b158", + "https://deno.land/std@0.216.0/fs/mod.ts": "107f5afa4424c2d3ce2f7e9266173198da30302c69af662c720115fe504dc5ee", + "https://deno.land/std@0.216.0/fs/move.ts": "39e0d7ccb88a566d20b949712020e766b15ef1ec19159573d11f949bd677909c", + "https://deno.land/std@0.216.0/fs/walk.ts": "78e1d01a9f75715614bf8d6e58bd77d9fafb1222c41194e607cd3849d7a0e771", + "https://deno.land/std@0.216.0/http/server.ts": "6dce295abc169d0956ae00432441331b3425afad4d79e8b3475739be2f04d614", + "https://deno.land/std@0.216.0/http/status.ts": "ed61b4882af2514a81aefd3245e8df4c47b9a8e54929a903577643d2d1ebf514", + "https://deno.land/std@0.216.0/json/common.ts": "33f1a4f39a45e2f9f357823fd0b5cf88b63fb4784b8c9a28f8120f70a20b23e9", + "https://deno.land/std@0.216.0/jsonc/mod.ts": "82722888823e1af5a8f7918bf810ea581f68081064d529218533acad6cb7c2bc", + "https://deno.land/std@0.216.0/jsonc/parse.ts": "747a0753289fdbfcb9cb86b709b56348c98abc107fbb0a7f350b87af4425a76a", + "https://deno.land/std@0.216.0/media_types/_db.ts": "1d695d9fe1c785e523d6de7191b33f33ecc7866db77358a4f966221cca56e2f9", + "https://deno.land/std@0.216.0/media_types/_util.ts": "afd54920a8a81add64248897898d3f30ca414a8803fe0c4e6d2893a3f6bd32b0", + "https://deno.land/std@0.216.0/media_types/content_type.ts": "ed3f2e1f243b418ad3f441edc95fd92efbadb0f9bde36219c7564c67f9639513", + "https://deno.land/std@0.216.0/media_types/format_media_type.ts": "ffef4718afa2489530cb94021bb865a466eb02037609f7e82899c017959d288a", + "https://deno.land/std@0.216.0/media_types/get_charset.ts": "bce5c0343c14590516cbfa1a3e80891d9a7a53bc9b4a9010061cc4f879e18f6c", + "https://deno.land/std@0.216.0/media_types/parse_media_type.ts": "487f000a38c230ccbac25420a50f600862e06796d0eee19d19631b9e84ee9654", + "https://deno.land/std@0.216.0/media_types/type_by_extension.ts": "bf4e3f5d6b58b624d5daa01cbb8b1e86d9939940a77e7c26e796a075b60ec73b", + "https://deno.land/std@0.216.0/media_types/vendor/mime-db.v1.52.0.ts": "0218d2c7d900e8cd6fa4a866e0c387712af4af9a1bae55d6b2546c73d273a1e6", + "https://deno.land/std@0.216.0/path/_common/assert_path.ts": "2ca275f36ac1788b2acb60fb2b79cb06027198bc2ba6fb7e163efaedde98c297", + "https://deno.land/std@0.216.0/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2", + "https://deno.land/std@0.216.0/path/_common/common.ts": "6157c7ec1f4db2b4a9a187efd6ce76dcaf1e61cfd49f87e40d4ea102818df031", + "https://deno.land/std@0.216.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c", + "https://deno.land/std@0.216.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", + "https://deno.land/std@0.216.0/path/_common/format.ts": "92500e91ea5de21c97f5fe91e178bae62af524b72d5fcd246d6d60ae4bcada8b", + "https://deno.land/std@0.216.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf", + "https://deno.land/std@0.216.0/path/_common/glob_to_reg_exp.ts": "2007aa87bed6eb2c8ae8381adcc3125027543d9ec347713c1ad2c68427330770", + "https://deno.land/std@0.216.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", + "https://deno.land/std@0.216.0/path/_common/normalize_string.ts": "dfdf657a1b1a7db7999f7c575ee7e6b0551d9c20f19486c6c3f5ff428384c965", + "https://deno.land/std@0.216.0/path/_common/relative.ts": "faa2753d9b32320ed4ada0733261e3357c186e5705678d9dd08b97527deae607", + "https://deno.land/std@0.216.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a", + "https://deno.land/std@0.216.0/path/_common/to_file_url.ts": "7f76adbc83ece1bba173e6e98a27c647712cab773d3f8cbe0398b74afc817883", + "https://deno.land/std@0.216.0/path/_interface.ts": "a1419fcf45c0ceb8acdccc94394e3e94f99e18cfd32d509aab514c8841799600", + "https://deno.land/std@0.216.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15", + "https://deno.land/std@0.216.0/path/basename.ts": "5d341aadb7ada266e2280561692c165771d071c98746fcb66da928870cd47668", + "https://deno.land/std@0.216.0/path/common.ts": "03e52e22882402c986fe97ca3b5bb4263c2aa811c515ce84584b23bac4cc2643", + "https://deno.land/std@0.216.0/path/constants.ts": "0c206169ca104938ede9da48ac952de288f23343304a1c3cb6ec7625e7325f36", + "https://deno.land/std@0.216.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c", + "https://deno.land/std@0.216.0/path/extname.ts": "593303db8ae8c865cbd9ceec6e55d4b9ac5410c1e276bfd3131916591b954441", + "https://deno.land/std@0.216.0/path/format.ts": "98fad25f1af7b96a48efb5b67378fcc8ed77be895df8b9c733b86411632162af", + "https://deno.land/std@0.216.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069", + "https://deno.land/std@0.216.0/path/glob_to_regexp.ts": "5e51f78a0248c75464bf1d49173de3ec2c032880a530578e56b3fed2a57e69d3", + "https://deno.land/std@0.216.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7", + "https://deno.land/std@0.216.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141", + "https://deno.land/std@0.216.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a", + "https://deno.land/std@0.216.0/path/join_globs.ts": "5b3bf248b93247194f94fa6947b612ab9d3abd571ca8386cf7789038545e54a0", + "https://deno.land/std@0.216.0/path/mod.ts": "6f856db94f6a72fc2cf69e0a85eb523aee6a3cd274470717e96f4bee0c9fe329", + "https://deno.land/std@0.216.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352", + "https://deno.land/std@0.216.0/path/normalize_glob.ts": "cc89a77a7d3b1d01053b9dcd59462b75482b11e9068ae6c754b5cf5d794b374f", + "https://deno.land/std@0.216.0/path/parse.ts": "65e8e285f1a63b714e19ef24b68f56e76934c3df0b6e65fd440d3991f4f8aefb", + "https://deno.land/std@0.216.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d", + "https://deno.land/std@0.216.0/path/posix/basename.ts": "39ee27a29f1f35935d3603ccf01d53f3d6e0c5d4d0f84421e65bd1afeff42843", + "https://deno.land/std@0.216.0/path/posix/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", + "https://deno.land/std@0.216.0/path/posix/constants.ts": "93481efb98cdffa4c719c22a0182b994e5a6aed3047e1962f6c2c75b7592bef1", + "https://deno.land/std@0.216.0/path/posix/dirname.ts": "6535d2bdd566118963537b9dda8867ba9e2a361015540dc91f5afbb65c0cce8b", + "https://deno.land/std@0.216.0/path/posix/extname.ts": "8d36ae0082063c5e1191639699e6f77d3acf501600a3d87b74943f0ae5327427", + "https://deno.land/std@0.216.0/path/posix/format.ts": "185e9ee2091a42dd39e2a3b8e4925370ee8407572cee1ae52838aed96310c5c1", + "https://deno.land/std@0.216.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40", + "https://deno.land/std@0.216.0/path/posix/glob_to_regexp.ts": "54d3ff40f309e3732ab6e5b19d7111d2d415248bcd35b67a99defcbc1972e697", + "https://deno.land/std@0.216.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede", + "https://deno.land/std@0.216.0/path/posix/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", + "https://deno.land/std@0.216.0/path/posix/join.ts": "aef88d5fa3650f7516730865dbb951594d1a955b785e2450dbee93b8e32694f3", + "https://deno.land/std@0.216.0/path/posix/join_globs.ts": "f6e2619c196b82d8fd67ba2cf680e5b44461f38bdfeec26d7b3f55bd92a85988", + "https://deno.land/std@0.216.0/path/posix/mod.ts": "2301fc1c54a28b349e20656f68a85f75befa0ee9b6cd75bfac3da5aca9c3f604", + "https://deno.land/std@0.216.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91", + "https://deno.land/std@0.216.0/path/posix/normalize_glob.ts": "41b477068deb832df7f51d6e2b3c0bc274d20919e20c5240d785ba535572d3d0", + "https://deno.land/std@0.216.0/path/posix/parse.ts": "d5bac4eb21262ab168eead7e2196cb862940c84cee572eafedd12a0d34adc8fb", + "https://deno.land/std@0.216.0/path/posix/relative.ts": "3907d6eda41f0ff723d336125a1ad4349112cd4d48f693859980314d5b9da31c", + "https://deno.land/std@0.216.0/path/posix/resolve.ts": "bac20d9921beebbbb2b73706683b518b1d0c1b1da514140cee409e90d6b2913a", + "https://deno.land/std@0.216.0/path/posix/to_file_url.ts": "7aa752ba66a35049e0e4a4be5a0a31ac6b645257d2e031142abb1854de250aaf", + "https://deno.land/std@0.216.0/path/posix/to_namespaced_path.ts": "28b216b3c76f892a4dca9734ff1cc0045d135532bfd9c435ae4858bfa5a2ebf0", + "https://deno.land/std@0.216.0/path/relative.ts": "ab739d727180ed8727e34ed71d976912461d98e2b76de3d3de834c1066667add", + "https://deno.land/std@0.216.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d", + "https://deno.land/std@0.216.0/path/to_file_url.ts": "88f049b769bce411e2d2db5bd9e6fd9a185a5fbd6b9f5ad8f52bef517c4ece1b", + "https://deno.land/std@0.216.0/path/to_namespaced_path.ts": "b706a4103b104cfadc09600a5f838c2ba94dbcdb642344557122dda444526e40", + "https://deno.land/std@0.216.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808", + "https://deno.land/std@0.216.0/path/windows/basename.ts": "e2dbf31d1d6385bfab1ce38c333aa290b6d7ae9e0ecb8234a654e583cf22f8fe", + "https://deno.land/std@0.216.0/path/windows/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", + "https://deno.land/std@0.216.0/path/windows/constants.ts": "5afaac0a1f67b68b0a380a4ef391bf59feb55856aa8c60dfc01bd3b6abb813f5", + "https://deno.land/std@0.216.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9", + "https://deno.land/std@0.216.0/path/windows/extname.ts": "165a61b00d781257fda1e9606a48c78b06815385e7d703232548dbfc95346bef", + "https://deno.land/std@0.216.0/path/windows/format.ts": "bbb5ecf379305b472b1082cd2fdc010e44a0020030414974d6029be9ad52aeb6", + "https://deno.land/std@0.216.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01", + "https://deno.land/std@0.216.0/path/windows/glob_to_regexp.ts": "6dcd1242bd8907aa9660cbdd7c93446e6927b201112b0cba37ca5d80f81be51b", + "https://deno.land/std@0.216.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a", + "https://deno.land/std@0.216.0/path/windows/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", + "https://deno.land/std@0.216.0/path/windows/join.ts": "e0b3356615c1a75c56ebb6a7311157911659e11fd533d80d724800126b761ac3", + "https://deno.land/std@0.216.0/path/windows/join_globs.ts": "f6e2619c196b82d8fd67ba2cf680e5b44461f38bdfeec26d7b3f55bd92a85988", + "https://deno.land/std@0.216.0/path/windows/mod.ts": "2301fc1c54a28b349e20656f68a85f75befa0ee9b6cd75bfac3da5aca9c3f604", + "https://deno.land/std@0.216.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780", + "https://deno.land/std@0.216.0/path/windows/normalize_glob.ts": "c57c186b0785ba5320a85e573c264f42c46eb1d0a4a78611f4791a7083baaa17", + "https://deno.land/std@0.216.0/path/windows/parse.ts": "b9239edd892a06a06625c1b58425e199f018ce5649ace024d144495c984da734", + "https://deno.land/std@0.216.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7", + "https://deno.land/std@0.216.0/path/windows/resolve.ts": "75b2e3e1238d840782cee3d8864d82bfaa593c7af8b22f19c6422cf82f330ab3", + "https://deno.land/std@0.216.0/path/windows/to_file_url.ts": "1cd63fd35ec8d1370feaa4752eccc4cc05ea5362a878be8dc7db733650995484", + "https://deno.land/std@0.216.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c", + "https://deno.land/std@0.216.0/regexp/escape.ts": "57303d6c9c6aa058d9a79a3c70113c545391639a87e9a18428220c1bad407549", + "https://deno.land/std@0.216.0/semver/_comparator_format.ts": "b5a56b999670c0b3a3e8ad437ca0fafbfce0e973bba6769979d7665e318e8b6c", + "https://deno.land/std@0.216.0/semver/_comparator_intersects.ts": "65b744d76b3be4ed91afd149754f530681032890d32fd65d02faf8ef96491cb7", + "https://deno.land/std@0.216.0/semver/_comparator_max.ts": "c3a97d5b43b9104afa3687780500ef79b69ae5107cee2359004f80ea48969c7d", + "https://deno.land/std@0.216.0/semver/_comparator_min.ts": "080a9939b177d64904e1772da02dc4673f9cd1b3c9ae1a5c534cfdf4bb3ee9af", + "https://deno.land/std@0.216.0/semver/_constants.ts": "90879e4ea94a34c49c8ecea3d9c06e13e61ecb7caca80c8f289139440ca9835a", + "https://deno.land/std@0.216.0/semver/_is_comparator.ts": "d032762a6993b7cd3e4243cbeded0eeab70773dff960d4e92af8770550eea7b6", + "https://deno.land/std@0.216.0/semver/_parse_comparator.ts": "2dfa7f08da84038f8e2c50d629a329b2870a096791fd1f299a00de3bb547c34a", + "https://deno.land/std@0.216.0/semver/_shared.ts": "8d44684775cde4a64bd6bdb99b51f3bc59ed65f10af78ca136cc2eab3f6716f1", + "https://deno.land/std@0.216.0/semver/can_parse.ts": "d4a26f74be078f3ab10293b07bf022021a2f362b3e21b58422c214e7268110b2", + "https://deno.land/std@0.216.0/semver/compare.ts": "e8871844a35cc8fe16e883c16e5237e06a93aa4830ae10d06501abe63586fc57", + "https://deno.land/std@0.216.0/semver/constants.ts": "04c8625428552e967c85c59e80766441418839f7a94c50c652c6a9d83b0f3ef1", + "https://deno.land/std@0.216.0/semver/difference.ts": "be4f01b7745406408a16b708185a48c1c652cc87e0244b12a5ca75c5585db668", + "https://deno.land/std@0.216.0/semver/equals.ts": "8b9b18260c9a55feee9d3f9250fba345be922380f2e8f8009e455c394ce5e81d", + "https://deno.land/std@0.216.0/semver/format.ts": "26d3a357ac5abd73dee0fe7dbbac6107fbdce0a844370c7b1bcb673c92e46bf6", + "https://deno.land/std@0.216.0/semver/format_range.ts": "ee96cc1f3002cfb62b821477f1a90374e6c021ec13045c34a0620021b1d862af", + "https://deno.land/std@0.216.0/semver/greater_or_equal.ts": "89c26f68070896944676eb9704cbb617febc6ed693720282741d6859c3d1fe80", + "https://deno.land/std@0.216.0/semver/greater_than.ts": "d8c4a227cd28ea80a1de9c80215d7f3f95786fe1b196f0cb5ec91d6567adad27", + "https://deno.land/std@0.216.0/semver/gtr.ts": "1101ecf6f427de9ba6348860f312c15b55f9301f97d2e34bd9e57957184574e9", + "https://deno.land/std@0.216.0/semver/increment.ts": "427a043be71d6481e45c1a3939b955e800924d70779cb297b872d9cbf9f0e46d", + "https://deno.land/std@0.216.0/semver/is_range.ts": "4cea4096436ea02555d38cc758effd978ca77d8ae63d8db15f2910b1ff04aec2", + "https://deno.land/std@0.216.0/semver/is_semver.ts": "57914027d6141e593eb04418aaabbfd6f4562a1c53c6c33a1743fa50ada8d849", + "https://deno.land/std@0.216.0/semver/less_or_equal.ts": "7dbf8190f37f3281048c30cf11e072a7af18685534ae88d295baa170b485bd90", + "https://deno.land/std@0.216.0/semver/less_than.ts": "b0c7902c54cecadcc7c1c80afc2f6a0f1bf0b3f53c8d2bfd11f01a3a414cccfe", + "https://deno.land/std@0.216.0/semver/ltr.ts": "4c147830444c9020eccc17cd8d4d9aced5b0f6cfb3c8b99fb9cdcca8fe90356f", + "https://deno.land/std@0.216.0/semver/max_satisfying.ts": "03e5182a7424c308ddbb410e4b927da0dabc4e07d4b5a72f7e9b26fb18a02152", + "https://deno.land/std@0.216.0/semver/min_satisfying.ts": "b6fadc9af17278289481c416e1eb135614f88063f4fc2b7b72b43eb3baa2f08f", + "https://deno.land/std@0.216.0/semver/mod.ts": "6fcb9531909763993c70e1278b898cc9dd1373d6f4cbcdc41be4fc629e9e2052", + "https://deno.land/std@0.216.0/semver/not_equals.ts": "17147a6f68b9d14f4643c1e2150378ccf6954710309f9618f75b411752a8e13d", + "https://deno.land/std@0.216.0/semver/parse.ts": "2ba215c9aa3c71be753570724cfad75cc81972f0026dc81836ea3d1986112066", + "https://deno.land/std@0.216.0/semver/parse_range.ts": "7ce841031e14af27c9abcc10878efe60135de59c935e311d671a91ffc48bbc46", + "https://deno.land/std@0.216.0/semver/range_intersects.ts": "28de545143652cffa447e859ad087d75e74c009762df0ebc2f03cca2eed9831d", + "https://deno.land/std@0.216.0/semver/range_max.ts": "b994695e885045518e1655a2c519d726003c7381b3e64be2090663378a6bfe20", + "https://deno.land/std@0.216.0/semver/range_min.ts": "269ace0521e055fe10ef8c3d342ddf2cf3eb9c53a8efb2eecac198085cc789c3", + "https://deno.land/std@0.216.0/semver/reverse_sort.ts": "98316b5c960cb0608df949d563328c7696d6b4f76ccea22a08974d27c1969893", + "https://deno.land/std@0.216.0/semver/test_range.ts": "6262307357a8b413dc34546c8401392ed2bc7a5e4ddd999195a56a0fe4fc1d4a", + "https://deno.land/std@0.216.0/semver/try_parse.ts": "a2639ec588c374331d5f655bfbdf8d5a2f2cc704c8b56ac94cd077944de150c7", + "https://deno.land/std@0.216.0/semver/try_parse_range.ts": "239e0d711c5745da8c4dcda3c0797b4b5a83bfe494a51d3a0f005472cdc7b016", + "https://deno.land/std@0.216.0/semver/types.ts": "8ed52c8cfc59e249a0dbab597d8c31bcf10405dcbe9714585055ea02252ae0d0", + "https://deno.land/std@0.216.0/testing/snapshot.ts": "35ca1c8e8bfb98d7b7e794f1b7be8d992483fcff572540e41396f22a5bddb944", + "https://deno.land/x/code_block_writer@12.0.0/mod.ts": "2c3448060e47c9d08604c8f40dee34343f553f33edcdfebbf648442be33205e5", + "https://deno.land/x/code_block_writer@12.0.0/utils/string_utils.ts": "60cb4ec8bd335bf241ef785ccec51e809d576ff8e8d29da43d2273b69ce2a6ff", + "https://deno.land/x/denoflate@1.2.1/mod.ts": "f5628e44b80b3d80ed525afa2ba0f12408e3849db817d47a883b801f9ce69dd6", + "https://deno.land/x/denoflate@1.2.1/pkg/denoflate.js": "b9f9ad9457d3f12f28b1fb35c555f57443427f74decb403113d67364e4f2caf4", + "https://deno.land/x/denoflate@1.2.1/pkg/denoflate_bg.wasm.js": "d581956245407a2115a3d7e8d85a9641c032940a8e810acbd59ca86afd34d44d", + "https://deno.land/x/esbuild@v0.20.2/mod.js": "67c608ee283233f5d0faa322b887356857c547a8e6a00981f798b2cd38e02436", + "https://deno.land/x/esbuild@v0.20.2/wasm.js": "5a887c1e38ad1056af11c58d45b6084d33bd33a62afa480d805801739370eed0", + "https://deno.land/x/fresh@1.7.3/dev.ts": "720dd3a64b62b852db7b6ae471c246c5c605cf4a3091c4cbc802790f36d43e4c", + "https://deno.land/x/fresh@1.7.3/plugins/tailwind.ts": "0e5451ce2845c869e0c4e5744505e3bff179ff2ef51356326ba24aeeeb88b05c", + "https://deno.land/x/fresh@1.7.3/plugins/tailwind/compiler.ts": "9658827e8717076e6d1f7815c081ef6a93bdca409640cd55b6cc171435cd189c", + "https://deno.land/x/fresh@1.7.3/plugins/tailwind/types.ts": "745dded1323498ebd8c439a8975dfcaae3db376566f2ab47b82a34643da85898", + "https://deno.land/x/fresh@1.7.3/runtime.ts": "49f4f70c24d14c5d5e112a671ef0314e438e5cd83eacb4f75c6db2fbdc22b540", + "https://deno.land/x/fresh@1.7.3/server.ts": "d5817615a3ac822d422627f2cd6f850a31e11f7e73b328a79807f722e6519bac", + "https://deno.land/x/fresh@1.7.3/src/build/aot_snapshot.ts": "4ac6330e5325dd9411fa2a46e97bb289f910fde4be82dc349d3e2b4bb1a7c07d", + "https://deno.land/x/fresh@1.7.3/src/build/deps.ts": "03f73580f7e1ccf2027cb45357bfb82c73c3971876680ea8b44666bcbcd1a9f0", + "https://deno.land/x/fresh@1.7.3/src/build/esbuild.ts": "fdad9cc58f0ead0f954faad4a3c6b07da312acbe3306da742ba083ddb666d4b3", + "https://deno.land/x/fresh@1.7.3/src/build/mod.ts": "b9d1695a86746ac3a1c52f0e07e723faa2310d1dfd109b9a2eebab6727c4702b", + "https://deno.land/x/fresh@1.7.3/src/constants.ts": "4795d194b6c6b95f0e876c0a997fbaf57f94cfe253442c5819f95410870b79b3", + "https://deno.land/x/fresh@1.7.3/src/dev/build.ts": "9aaf84a781ee4d11d73ec549425f273fe8339812fdd8f726e1ec1ba61bdf0e9d", + "https://deno.land/x/fresh@1.7.3/src/dev/deps.ts": "93af624becfb2d8497e3d7ef0cf5ef48df61495dc5951b5f922c6a129a9fb75c", + "https://deno.land/x/fresh@1.7.3/src/dev/dev_command.ts": "3e3dcc80180faf8868d44d892ddfa8c5ad06033e4d94c0934302e157db1de63d", + "https://deno.land/x/fresh@1.7.3/src/dev/error.ts": "21a38d240c00279662e6adde41367f1da0ae7e2836d993f818ea94aabab53e7b", + "https://deno.land/x/fresh@1.7.3/src/dev/manifest.ts": "18911c84ee422799faf7dff2eeed75c7c9670ee26a01d0a33ab3b2aba1ba0381", + "https://deno.land/x/fresh@1.7.3/src/dev/mod.ts": "d44f3063d157bce53ba534d37b7ff8f262c379ab75229bc63d06c47c67b6b7e6", + "https://deno.land/x/fresh@1.7.3/src/dev/update_check.ts": "0b8e4659b49e3a951c684b7faf66be7428948c3e7d492d37397f9a485874515a", + "https://deno.land/x/fresh@1.7.3/src/runtime/Partial.tsx": "92e16fa7edf37dc8e254024a5410ea2c8986804a6ddf911af4d30209dff80a22", + "https://deno.land/x/fresh@1.7.3/src/runtime/active_url.ts": "c718797b11189c7e2c86569355d55056148907121e958e00f71c56593aecc329", + "https://deno.land/x/fresh@1.7.3/src/runtime/build_id.ts": "8376e70e42ce456dfa6932c638409d2ef1bca4833b4ceba0bf74510080a7f976", + "https://deno.land/x/fresh@1.7.3/src/runtime/csp.ts": "9ee900e9b0b786057b1009da5976298c202d1b86d1f1e4d2510bde5f06530ac9", + "https://deno.land/x/fresh@1.7.3/src/runtime/deserializer.ts": "1b83e75fa61c48b074ea121f33647d1ed15c68fa2f2a11b0a7f7a12cd38af627", + "https://deno.land/x/fresh@1.7.3/src/runtime/entrypoints/client.ts": "a9224606e41bc58d81f37b7125650432920a7d136bdf416051e925ac9bbd1f05", + "https://deno.land/x/fresh@1.7.3/src/runtime/entrypoints/deserializer.ts": "e836f44c454e1f67c86eab30f108eb9be05a38489604a24e418b564b77058b96", + "https://deno.land/x/fresh@1.7.3/src/runtime/entrypoints/main.ts": "99e9882a376176b017059a8cda05e4f74caf3ea8c18e45a017c8562a50807c77", + "https://deno.land/x/fresh@1.7.3/src/runtime/entrypoints/main_dev.ts": "d2960e339119e45017954c7cf6798b9e0a3110d173cc378e1e3e7bc84bd68c34", + "https://deno.land/x/fresh@1.7.3/src/runtime/entrypoints/signals.ts": "782c81f97d125ad4f92aa0160dad3a2e8b6ea7a61cec7fdab87bbbbd8c0d215c", + "https://deno.land/x/fresh@1.7.3/src/runtime/head.ts": "0f9932874497ab6e57ed1ba01d549e843523df4a5d36ef97460e7a43e3132fdc", + "https://deno.land/x/fresh@1.7.3/src/runtime/polyfills.ts": "c3de932b2f23df9a4ade1ab4f8890730c0db0a71bf85faa41742a1763631e917", + "https://deno.land/x/fresh@1.7.3/src/runtime/utils.ts": "4f40630c308e8ea7d53860687905caf1a2f2a46ad8692f24e905a8e996b584c3", + "https://deno.land/x/fresh@1.7.3/src/server/boot.ts": "3a574c4baa6120f6770f419af6d8d6d5ae32c8e1bdddf2bb14cb258ba18ac62f", + "https://deno.land/x/fresh@1.7.3/src/server/build_id.ts": "82d9cb985de6b1e38c3108e5a00667b16e80eedc145d73835d6b44349ebe6389", + "https://deno.land/x/fresh@1.7.3/src/server/code_frame.ts": "fac505f138fbd1bb260030122b87aeb2f5b5e54018e3066e105c669c686cc373", + "https://deno.land/x/fresh@1.7.3/src/server/compose.ts": "490aa1a7d540cc02bd4a184bea03eb2370aa34d93fe5a6ae1f31e2086eef4e76", + "https://deno.land/x/fresh@1.7.3/src/server/config.ts": "a5d0545d18c68d01770a4eb321d2fc85081ad7992ae63b1497f0b92ee122410a", + "https://deno.land/x/fresh@1.7.3/src/server/constants.ts": "e75a7f7b14185b6f85747613591348313200fe8e218cb473b1da9db941ee68d1", + "https://deno.land/x/fresh@1.7.3/src/server/context.ts": "1211da93ab80bf148892f0322df795e07212ea33ba361a2053e22cae3b5b54b3", + "https://deno.land/x/fresh@1.7.3/src/server/default_error_page.tsx": "094ad8d52d31f99172a606d0a0d8236604a1f9bb6d1f928d0d466d55b36dae70", + "https://deno.land/x/fresh@1.7.3/src/server/defines.ts": "f518ff10e499d4543bb9231f55026f26be2507eaccb072aafab93c8cc0bc3adc", + "https://deno.land/x/fresh@1.7.3/src/server/deps.ts": "efa2ddf6a21457839e42b6a69eca0c12a22a0bf3a6dd140b58abfe54e66328e8", + "https://deno.land/x/fresh@1.7.3/src/server/error_overlay.tsx": "e6ab4cef0ea812a1e1f32ee9116c61f64db8466d46e228acbb953215f4517d9c", + "https://deno.land/x/fresh@1.7.3/src/server/fs_extract.ts": "4dda675f03f0397310e4e6d4a57f3bf907db8a61a1a65423e67855daf5b9b36e", + "https://deno.land/x/fresh@1.7.3/src/server/htmlescape.ts": "834ac7d0caa9fc38dffd9b8613fb47aeecd4f22d5d70c51d4b20a310c085835c", + "https://deno.land/x/fresh@1.7.3/src/server/init_safe_deps.ts": "8c74d8708986d156126355b0935a1915069bfdc389ccabd3d2d72d1c9e04025c", + "https://deno.land/x/fresh@1.7.3/src/server/mod.ts": "6cee56e234f6bc19f62f3b6c0d287dc7b9632fcbfb8f56dde1d81423532d65c4", + "https://deno.land/x/fresh@1.7.3/src/server/render.ts": "b89387eb20c91969ace2de27b6c462f4e42c040d37b68440fe374e5cea9ea794", + "https://deno.land/x/fresh@1.7.3/src/server/rendering/fresh_tags.tsx": "5f1238e465d9ad94aebdf5e3701f2b9da3c944d8c5cc4dc8005ff1418b164989", + "https://deno.land/x/fresh@1.7.3/src/server/rendering/preact_hooks.ts": "db1a1ad7e4fbdac19b0758789ba7700531c214d531e1d03264b81a73beab05b5", + "https://deno.land/x/fresh@1.7.3/src/server/rendering/state.ts": "5e0c3a60964596cc28c1804545eae323cbc92eec9ce8cb0932d5168a6d1f33e9", + "https://deno.land/x/fresh@1.7.3/src/server/rendering/template.tsx": "bd1bc8edb054caac22043117f254927e8413e04cd1897009a2214ab374a1be19", + "https://deno.land/x/fresh@1.7.3/src/server/router.ts": "d051f24ff5578772703cb7af2bc4516da08c73c769839d7a1e9a3c82e8dfe0e8", + "https://deno.land/x/fresh@1.7.3/src/server/serializer.ts": "f0cffb863bbdbac6ed53fefe181e415d6aefc2101f2dc92a562b364088809e44", + "https://deno.land/x/fresh@1.7.3/src/server/tailwind_aot_error_page.tsx": "7265b66dc76a2e54b40774bbeb3cc7d4deb2eac537e08712e90e9c7b9399e53a", + "https://deno.land/x/fresh@1.7.3/src/server/types.ts": "cf4943a6d3e7df100aed20f243c0464cebb6af657749f742bd2c13e78c40dff2", + "https://deno.land/x/fresh@1.7.3/src/types.ts": "05169e3389979d8283de0ec1db3a765324ffd730b6af29ffe02752f341ae7d35", + "https://deno.land/x/fresh@1.7.3/versions.json": "953bb3cfa81ef8048733f47431f6683447aec211dd149a341a7d7244cf72d2cd", + "https://deno.land/x/ts_morph@21.0.1/common/DenoRuntime.ts": "a505f1feae9a77c8f6ab1c18c55d694719e96573f68e9c36463b243e1bef4c3e", + "https://deno.land/x/ts_morph@21.0.1/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", + "https://deno.land/x/ts_morph@21.0.1/common/ts_morph_common.js": "236475fb18476307e07b3a97dc92fe8fb69e4a9df4ca59aa098dd6430bae7237", + "https://deno.land/x/ts_morph@21.0.1/common/typescript.js": "d72ba73c3eb625ff755075dbde78df2a844d22190ef1ad74d0c5dcd7005ba85e", + "https://deno.land/x/ts_morph@21.0.1/mod.ts": "adba9b82f24865d15d2c78ef6074b9a7457011719056c9928c800f130a617c93", + "https://deno.land/x/ts_morph@21.0.1/ts_morph.js": "fddb96abdf0cb0ac427d52757c4ffa6ff7fe9a772846d9bf6167518b7b276cad", + "https://deno.land/x/xml@2.1.3/mod.ts": "4a314a7a28d1ec92f899ce4c6991f0356c77550a75955ec3f4a36733f08548e8", + "https://deno.land/x/xml@2.1.3/parse.ts": "614b8648345ae93c641368836947484d321c7ac9312ae12ec750434353cd7385", + "https://deno.land/x/xml@2.1.3/stringify.ts": "930d35431f153b29d36549cff08fcfbe978e52ccb56af1e3baa2e0760f418b04", + "https://deno.land/x/xml@2.1.3/utils/parser.ts": "263e06191bf7ec983eb542743f377f29f8a715590d67d1ffe4c848dd13389452", + "https://deno.land/x/xml@2.1.3/utils/stream.ts": "056e2f368d47932d77e431bbc4a8292359171cc9ce881ea31ce0aae30d763e68", + "https://deno.land/x/xml@2.1.3/utils/streamable.ts": "1603a5f10c859b95d4e9502365a0fba0b19d5d068356e20d5a6813cd37fee780", + "https://deno.land/x/xml@2.1.3/utils/stringifier.ts": "c701b506835237c0c6c0a08fd94e0a012b644def3f4c819c64788daf2e649ea3", + "https://deno.land/x/xml@2.1.3/utils/types.ts": "ecaf7785e54a6f1da6f8e56da2bce9853407ceb7d5b3b70f0a60a0890151fe4c", + "https://esm.sh/*preact-render-to-string@6.3.1": "37f046906d7cc1ce35828a029a05a4eed6c8eefc4b646a301939757dfbf8ab18", + "https://esm.sh/*preact-render-to-string@6.3.1/denonext/preact-render-to-string.mjs": "859e9f3dc137a53c17542bbed4cf8accdca81a2895d7a52d1fca38e6c5c00c90", + "https://esm.sh/@babel/helper-validator-identifier@7.22.20": "3b0b7d94b8ac689175ecb7e72183b07c6a771cc7680a7c9916091add73bd7f88", + "https://esm.sh/@babel/helper-validator-identifier@7.22.20/denonext/helper-validator-identifier.mjs": "f765fd69eb4fd81b839b76bf60f227caac4fe4d41b4c646cc08aa7b8d948fe17" + }, + "workspace": { + "dependencies": [ + "jsr:@b-fuze/deno-dom@0.1.56", + "jsr:@db/postgres@0.19.5", + "jsr:@fresh/plugin-vite@1.0.4", + "jsr:@hexagon/croner@9.1.0", + "jsr:@libs/qrcode@3.0.0", + "jsr:@mikaelporttila/rss@1.1.3", + "jsr:@simplewebauthn/browser@13.2.0", + "jsr:@simplewebauthn/server@13.2.1", + "jsr:@std/assert@1.0.14", + "jsr:@std/dotenv@0.225.5", + "jsr:@std/encoding@1.0.10", + "jsr:@std/http@1.0.20", + "jsr:@std/path@1.1.2", + "npm:@preact/signals@2.3.1", + "npm:chart.js@4.5.0", + "npm:mrmime@2.0.1", + "npm:nodemailer@7.0.6", + "npm:openid-client@6.8.0", + "npm:otpauth@9.4.1", + "npm:preact@10.27.2", + "npm:sharp@0.34.4", + "npm:tailwindcss@3.4.17", + "npm:vite@7.1.7" + ] + } +} diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index e4fd493..9f337cb 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -1,13 +1,13 @@ services: postgresql: - image: postgres:17 + image: postgres:18.1 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=fake - POSTGRES_DB=bewcloud restart: on-failure volumes: - - pgdata:/var/lib/postgresql/data + - pgdata:/var/lib/postgresql/18/docker ports: - 5432:5432 ulimits: @@ -18,7 +18,7 @@ services: # NOTE: If you don't want to use the CardDav/CalDav servers, you can comment/remove this service. radicale: - image: tomsquest/docker-radicale:3.5.7.0 + image: tomsquest/docker-radicale:3.5.8.2 ports: - 5232:5232 init: true diff --git a/docker-compose.yml b/docker-compose.yml index 74be34b..40df03f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ services: website: - image: ghcr.io/bewcloud/bewcloud:v2.7.0 + image: ghcr.io/bewcloud/bewcloud:v3.0.0 restart: always ports: - 127.0.0.1:8000:8000 @@ -13,14 +13,14 @@ services: - ./bewcloud.config.ts:/app/bewcloud.config.ts postgresql: - image: postgres:17 + image: postgres:18.1 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=fake - POSTGRES_DB=bewcloud restart: always volumes: - - bewcloud-db:/var/lib/postgresql/data + - bewcloud-db:/var/lib/postgresql/18/docker # NOTE: uncomment below only if you need to connect to the database from outside the container # ports: # - 127.0.0.1:5432:5432 @@ -32,7 +32,7 @@ services: # NOTE: If you don't want to use the CardDav/CalDav servers, you can comment/remove this service. radicale: - image: tomsquest/docker-radicale:3.5.7.0 + image: tomsquest/docker-radicale:3.5.8.2 # NOTE: uncomment below only if you need to connect to the CardDav/CalDav servers from outside the container # ports: # - 127.0.0.1:5232:5232 diff --git a/lib/config.ts b/lib/config.ts index 7bab846..3711cca 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -26,7 +26,7 @@ export class AppConfig { allowDirectoryDownloads: false, }, core: { - enabledApps: ['news', 'notes', 'photos', 'expenses', 'contacts', 'calendar'], + enabledApps: ['dashboard', 'files', 'news', 'notes', 'photos', 'expenses', 'contacts', 'calendar'], }, visuals: { title: '', @@ -98,6 +98,10 @@ export class AppConfig { console.info('\nConfig loaded from bewcloud.config.ts', JSON.stringify(this.config, null, 2), '\n'); + if (this.config.core.enabledApps.length === 0) { + throw new Error('At least one app must be enabled. Please check the config.core.enabledApps array.'); + } + return; } catch (error) { console.error('Error loading config from bewcloud.config.ts. Using default config instead.', error); diff --git a/lib/models/oidc.ts b/lib/models/oidc.ts index 7e4f45a..d8456ae 100644 --- a/lib/models/oidc.ts +++ b/lib/models/oidc.ts @@ -184,7 +184,9 @@ export class OidcModel { throw new Error('There was a problem signing up or logging in!'); } - let urlToRedirectTo = '/dashboard'; + const firstEnabledApp = config.core.enabledApps[0]; + + let urlToRedirectTo = `/${firstEnabledApp}`; if (urlSearchParams.has('state')) { const state = this.parseState(urlSearchParams.get('state')!); diff --git a/lib/types.ts b/lib/types.ts index 2f1b481..04dd1a3 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -152,7 +152,7 @@ export const currencyMap = new Map([ export type PartialDeep = (T extends (infer U)[] ? PartialDeep[] : { [P in keyof T]?: PartialDeep }) | T; -export type OptionalApp = 'news' | 'notes' | 'photos' | 'expenses' | 'contacts' | 'calendar'; +export type OptionalApp = 'dashboard' | 'files' | 'news' | 'notes' | 'photos' | 'expenses' | 'contacts' | 'calendar'; export interface Config { auth: { @@ -188,7 +188,7 @@ export interface Config { allowDirectoryDownloads: boolean; }; core: { - /** dashboard and files cannot be disabled */ + /** The apps to show, in order of appearance in the header. The first app will be the default one shown after logging in. At least one is required. */ enabledApps: OptionalApp[]; }; visuals: { diff --git a/lib/utils/webdav_test.ts b/lib/utils/webdav_test.ts new file mode 100644 index 0000000..d3311e0 --- /dev/null +++ b/lib/utils/webdav_test.ts @@ -0,0 +1,225 @@ +import { assertEquals } from '@std/assert'; +import { parse, stringify } from '@libs/xml'; + +import { addDavPrefixToKeys, getProperDestinationPath, getPropertyNames } from './webdav.ts'; + +Deno.test('that getProperDestinationPath works', () => { + const tests: { input: string; expected?: string }[] = [ + { + input: `http://127.0.0.1/dav/12345-abcde-67890`, + expected: 'dav/12345-abcde-67890', + }, + { + input: `http://127.0.0.1/dav/spaced-%20uid`, + expected: 'dav/spaced- uid', + }, + { + input: `http://127.0.0.1/dav/something-deeper/spaced-%C3%A7uid`, + expected: 'dav/something-deeper/spaced-çuid', + }, + ]; + + for (const test of tests) { + const output = getProperDestinationPath(test.input); + if (test.expected) { + assertEquals(output, test.expected); + } + } +}); + +Deno.test('that addDavPrefixToKeys works', () => { + const tests: { + input: { object: Record | Record[]; prefix?: string }; + expected: Record; + }[] = [ + { + input: { + object: { + displayname: 'test', + }, + }, + expected: { + 'D:displayname': 'test', + }, + }, + { + input: { + object: [ + { displayname: 'test' }, + { color: 'black' }, + ], + }, + expected: [ + { 'D:displayname': 'test' }, + { 'D:color': 'black' }, + ], + }, + { + input: { + object: { '@version': '1.0', '@encoding': 'UTF-8', displayname: 'test', color: 'black' }, + }, + expected: { + '@version': '1.0', + '@encoding': 'UTF-8', + 'D:displayname': 'test', + 'D:color': 'black', + }, + }, + { + input: { + object: { displayname: 'test', color: 'black' }, + prefix: 'S:', + }, + expected: { + 'S:displayname': 'test', + 'S:color': 'black', + }, + }, + ]; + + for (const test of tests) { + const output = addDavPrefixToKeys(test.input.object, test.input.prefix); + if (test.expected) { + assertEquals(output, test.expected); + } + } +}); + +Deno.test('that getPropertyNames works', () => { + const tests: { + input: Record; + expected: string[]; + }[] = [ + { + input: { + 'D:propfind': { + 'D:prop': { + 'D:displayname': 'test', + }, + }, + }, + expected: ['displayname'], + }, + { + input: { + 'D:propfind': { + 'D:prop': { + 'D:displayname': 'test', + 'D:color': 'black', + }, + }, + }, + expected: ['displayname', 'color'], + }, + { + input: {}, + expected: ['allprop'], + }, + ]; + + for (const test of tests) { + const output = getPropertyNames(test.input); + if (test.expected) { + assertEquals(output, test.expected); + } + } +}); + +Deno.test('that @libs/xml.parse works', () => { + const tests: { input: string; expected: Record }[] = [ + { + input: ` + + + test + +`, + expected: { + xml: { + '@version': 1, + '@encoding': 'UTF-8', + }, + propfind: { + '@xmlns': 'DAV:', + prop: { + displayname: 'test', + }, + }, + }, + }, + { + input: ` + + + test + +`, + expected: { + xml: { + '@version': 1, + '@encoding': 'UTF-8', + }, + 'D:propfind': { + '@xmlns:D': 'DAV:', + 'D:prop': { + 'D:displayname': 'test', + }, + }, + }, + }, + ]; + + for (const test of tests) { + const output = parse(test.input); + assertEquals(output, test.expected); + } +}); + +Deno.test('that @libs/xml.stringify works', () => { + const tests: { input: Record; expected: string }[] = [ + { + input: { + xml: { + '@version': '1.0', + '@encoding': 'UTF-8', + }, + 'D:propfind': { + 'D:prop': { + 'D:displayname': 'test', + }, + }, + }, + expected: ` + + + test + +`, + }, + { + input: { + xml: { + '@version': '1.0', + '@encoding': 'UTF-8', + }, + 'D:propfind': { + '@xmlns:D': 'DAV:', + 'D:prop': { + 'D:displayname': 'test', + }, + }, + }, + expected: ` + + + test + +`, + }, + ]; + + for (const test of tests) { + const output = stringify(test.input); + assertEquals(output, test.expected); + } +}); diff --git a/routes/api/calendar/add-event.tsx b/routes/api/calendar/add-event.tsx index 790a036..b7cd2f8 100644 --- a/routes/api/calendar/add-event.tsx +++ b/routes/api/calendar/add-event.tsx @@ -3,6 +3,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { CalendarEvent, CalendarEventModel, CalendarModel } from '/lib/models/calendar.ts'; import { generateVCalendar, getDateRangeForCalendarView } from '/lib/utils/calendar.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -28,6 +29,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/calendar/add.tsx b/routes/api/calendar/add.tsx index 08e8cfc..16ee672 100644 --- a/routes/api/calendar/add.tsx +++ b/routes/api/calendar/add.tsx @@ -3,6 +3,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { Calendar, CalendarModel } from '/lib/models/calendar.ts'; import { CALENDAR_COLOR_OPTIONS, getColorAsHex } from '/lib/utils/calendar.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (requestBody.name) { diff --git a/routes/api/calendar/delete-event.tsx b/routes/api/calendar/delete-event.tsx index 1859bdc..be9155a 100644 --- a/routes/api/calendar/delete-event.tsx +++ b/routes/api/calendar/delete-event.tsx @@ -3,6 +3,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { CalendarEvent, CalendarEventModel, CalendarModel } from '/lib/models/calendar.ts'; import { getDateRangeForCalendarView } from '/lib/utils/calendar.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -25,6 +26,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/calendar/delete.tsx b/routes/api/calendar/delete.tsx index ae64db5..9de4f34 100644 --- a/routes/api/calendar/delete.tsx +++ b/routes/api/calendar/delete.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { Calendar, CalendarModel } from '/lib/models/calendar.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -20,6 +21,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (requestBody.calendarId) { diff --git a/routes/api/calendar/export-events.tsx b/routes/api/calendar/export-events.tsx index 39927f4..ff3facc 100644 --- a/routes/api/calendar/export-events.tsx +++ b/routes/api/calendar/export-events.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { CalendarEvent, CalendarEventModel } from '/lib/models/calendar.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -20,6 +21,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (!requestBody.calendarIds) { diff --git a/routes/api/calendar/import.tsx b/routes/api/calendar/import.tsx index df60736..3458557 100644 --- a/routes/api/calendar/import.tsx +++ b/routes/api/calendar/import.tsx @@ -4,6 +4,7 @@ import { FreshContextState } from '/lib/types.ts'; import { CalendarEvent, CalendarEventModel, CalendarModel } from '/lib/models/calendar.ts'; import { concurrentPromises } from '/lib/utils/misc.ts'; import { getDateRangeForCalendarView, getIdFromVEvent, splitTextIntoVEvents } from '/lib/utils/calendar.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -26,6 +27,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/calendar/search-events.tsx b/routes/api/calendar/search-events.tsx index 31bf660..2e57794 100644 --- a/routes/api/calendar/search-events.tsx +++ b/routes/api/calendar/search-events.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { CalendarEvent, CalendarEventModel } from '/lib/models/calendar.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/calendar/update.tsx b/routes/api/calendar/update.tsx index b651e0c..6ab7350 100644 --- a/routes/api/calendar/update.tsx +++ b/routes/api/calendar/update.tsx @@ -4,6 +4,7 @@ import { FreshContextState } from '/lib/types.ts'; import { Calendar, CalendarModel } from '/lib/models/calendar.ts'; import { UserModel } from '/lib/models/user.ts'; import { CALENDAR_COLOR_OPTIONS, getColorAsHex } from '/lib/utils/calendar.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -25,6 +26,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (requestBody.id) { diff --git a/routes/api/contacts/add-addressbook.tsx b/routes/api/contacts/add-addressbook.tsx index d292ed0..987bf2c 100644 --- a/routes/api/contacts/add-addressbook.tsx +++ b/routes/api/contacts/add-addressbook.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { AddressBook, ContactModel } from '/lib/models/contacts.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -20,6 +21,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('contacts'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (!requestBody.name) { diff --git a/routes/api/contacts/add.tsx b/routes/api/contacts/add.tsx index 5544574..fd79eb4 100644 --- a/routes/api/contacts/add.tsx +++ b/routes/api/contacts/add.tsx @@ -3,6 +3,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { Contact, ContactModel } from '/lib/models/contacts.ts'; import { generateVCard } from '/lib/utils/contacts.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -23,6 +24,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('contacts'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (!requestBody.firstName || !requestBody.addressBookId) { diff --git a/routes/api/contacts/delete-addressbook.tsx b/routes/api/contacts/delete-addressbook.tsx index 053bb19..a694fe9 100644 --- a/routes/api/contacts/delete-addressbook.tsx +++ b/routes/api/contacts/delete-addressbook.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { AddressBook, ContactModel } from '/lib/models/contacts.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -20,6 +21,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('contacts'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (!requestBody.addressBookId) { diff --git a/routes/api/contacts/delete.tsx b/routes/api/contacts/delete.tsx index 438aed5..7b9d449 100644 --- a/routes/api/contacts/delete.tsx +++ b/routes/api/contacts/delete.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { Contact, ContactModel } from '/lib/models/contacts.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('contacts'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (!requestBody.contactId || !requestBody.addressBookId) { diff --git a/routes/api/contacts/get-addressbooks.tsx b/routes/api/contacts/get-addressbooks.tsx index 07937da..b75fa17 100644 --- a/routes/api/contacts/get-addressbooks.tsx +++ b/routes/api/contacts/get-addressbooks.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { AddressBook, ContactModel } from '/lib/models/contacts.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -18,6 +19,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('contacts'))) { + return new Response('Forbidden', { status: 403 }); + } + const addressBooks = await ContactModel.listAddressBooks(context.state.user.id); const responseBody: ResponseBody = { success: true, addressBooks }; diff --git a/routes/api/contacts/get.tsx b/routes/api/contacts/get.tsx index d5d70ca..bbf6ceb 100644 --- a/routes/api/contacts/get.tsx +++ b/routes/api/contacts/get.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { Contact, ContactModel } from '/lib/models/contacts.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -20,6 +21,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('contacts'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (!requestBody.addressBookId) { diff --git a/routes/api/contacts/import.tsx b/routes/api/contacts/import.tsx index 24f2d28..f3179b7 100644 --- a/routes/api/contacts/import.tsx +++ b/routes/api/contacts/import.tsx @@ -4,6 +4,7 @@ import { FreshContextState } from '/lib/types.ts'; import { Contact, ContactModel } from '/lib/models/contacts.ts'; import { concurrentPromises } from '/lib/utils/misc.ts'; import { getIdFromVCard, splitTextIntoVCards } from '/lib/utils/contacts.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -23,6 +24,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('contacts'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (!requestBody.vCards || !requestBody.addressBookId) { diff --git a/routes/api/dashboard/save-links.tsx b/routes/api/dashboard/save-links.tsx index 531828b..2d3c15a 100644 --- a/routes/api/dashboard/save-links.tsx +++ b/routes/api/dashboard/save-links.tsx @@ -1,6 +1,7 @@ import { Handlers } from 'fresh/server.ts'; import { DashboardLink, FreshContextState } from '/lib/types.ts'; +import { AppConfig } from '/lib/config.ts'; import { DashboardModel } from '/lib/models/dashboard.ts'; interface Data {} @@ -19,6 +20,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('dashboard'))) { + return new Response('Forbidden', { status: 403 }); + } + const userDashboard = await DashboardModel.getByUserId(context.state.user.id); if (!userDashboard) { diff --git a/routes/api/dashboard/save-notes.tsx b/routes/api/dashboard/save-notes.tsx index 91ae900..9613935 100644 --- a/routes/api/dashboard/save-notes.tsx +++ b/routes/api/dashboard/save-notes.tsx @@ -1,6 +1,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; +import { AppConfig } from '/lib/config.ts'; import { DashboardModel } from '/lib/models/dashboard.ts'; interface Data {} @@ -19,6 +20,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('dashboard'))) { + return new Response('Forbidden', { status: 403 }); + } + const userDashboard = await DashboardModel.getByUserId(context.state.user.id); if (!userDashboard) { diff --git a/routes/api/expenses/add-budget.tsx b/routes/api/expenses/add-budget.tsx index abc0228..81f3c25 100644 --- a/routes/api/expenses/add-budget.tsx +++ b/routes/api/expenses/add-budget.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Budget, FreshContextState } from '/lib/types.ts'; import { BudgetModel } from '/lib/models/expenses.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -23,6 +24,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('expenses'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/expenses/add-expense.tsx b/routes/api/expenses/add-expense.tsx index 36198cb..791292a 100644 --- a/routes/api/expenses/add-expense.tsx +++ b/routes/api/expenses/add-expense.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Budget, Expense, FreshContextState } from '/lib/types.ts'; import { BudgetModel, ExpenseModel } from '/lib/models/expenses.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -26,6 +27,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('expenses'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/expenses/auto-complete.tsx b/routes/api/expenses/auto-complete.tsx index dbeb609..5efc2b9 100644 --- a/routes/api/expenses/auto-complete.tsx +++ b/routes/api/expenses/auto-complete.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { ExpenseModel } from '/lib/models/expenses.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -20,6 +21,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('expenses'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (!requestBody.name || requestBody.name.length < 2) { diff --git a/routes/api/expenses/delete-budget.tsx b/routes/api/expenses/delete-budget.tsx index ec9ad8b..e681a84 100644 --- a/routes/api/expenses/delete-budget.tsx +++ b/routes/api/expenses/delete-budget.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Budget, FreshContextState } from '/lib/types.ts'; import { BudgetModel } from '/lib/models/expenses.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('expenses'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/expenses/delete-expense.tsx b/routes/api/expenses/delete-expense.tsx index 928e800..ef9fa27 100644 --- a/routes/api/expenses/delete-expense.tsx +++ b/routes/api/expenses/delete-expense.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Budget, Expense, FreshContextState } from '/lib/types.ts'; import { BudgetModel, ExpenseModel } from '/lib/models/expenses.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -22,6 +23,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('expenses'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/expenses/export-expenses.tsx b/routes/api/expenses/export-expenses.tsx index 6728c60..3d40fea 100644 --- a/routes/api/expenses/export-expenses.tsx +++ b/routes/api/expenses/export-expenses.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Budget, Expense, FreshContextState } from '/lib/types.ts'; import { BudgetModel, ExpenseModel } from '/lib/models/expenses.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('expenses'))) { + return new Response('Forbidden', { status: 403 }); + } + const newExpenses = await ExpenseModel.getAllForExport(context.state.user.id); const newBudgets = await BudgetModel.getAllForExport(context.state.user.id); diff --git a/routes/api/expenses/import-expenses.tsx b/routes/api/expenses/import-expenses.tsx index 90a23b7..9f5ea36 100644 --- a/routes/api/expenses/import-expenses.tsx +++ b/routes/api/expenses/import-expenses.tsx @@ -3,6 +3,7 @@ import { Handlers } from 'fresh/server.ts'; import { Budget, Expense, FreshContextState } from '/lib/types.ts'; import { concurrentPromises } from '/lib/utils/misc.ts'; import { BudgetModel, deleteAllBudgetsAndExpenses, ExpenseModel } from '/lib/models/expenses.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -25,6 +26,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('expenses'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/expenses/update-budget.tsx b/routes/api/expenses/update-budget.tsx index 5a6cdd0..b18ba4a 100644 --- a/routes/api/expenses/update-budget.tsx +++ b/routes/api/expenses/update-budget.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Budget, FreshContextState } from '/lib/types.ts'; import { BudgetModel } from '/lib/models/expenses.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -24,6 +25,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('expenses'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/expenses/update-expense.tsx b/routes/api/expenses/update-expense.tsx index 6c43de7..d043435 100644 --- a/routes/api/expenses/update-expense.tsx +++ b/routes/api/expenses/update-expense.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Budget, Expense, FreshContextState } from '/lib/types.ts'; import { BudgetModel, ExpenseModel } from '/lib/models/expenses.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -27,6 +28,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('expenses'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/create-directory.tsx b/routes/api/files/create-directory.tsx index 302c467..d25a178 100644 --- a/routes/api/files/create-directory.tsx +++ b/routes/api/files/create-directory.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Directory, FreshContextState } from '/lib/types.ts'; import { DirectoryModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,13 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/create-share.tsx b/routes/api/files/create-share.tsx index 1fb2535..2aa82bf 100644 --- a/routes/api/files/create-share.tsx +++ b/routes/api/files/create-share.tsx @@ -27,6 +27,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('files'))) { + return new Response('Forbidden', { status: 403 }); + } + const isPublicFileSharingAllowed = await AppConfig.isPublicFileSharingAllowed(); if (!isPublicFileSharingAllowed) { diff --git a/routes/api/files/delete-directory.tsx b/routes/api/files/delete-directory.tsx index 414c3bb..3a894d3 100644 --- a/routes/api/files/delete-directory.tsx +++ b/routes/api/files/delete-directory.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Directory, FreshContextState } from '/lib/types.ts'; import { DirectoryModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,13 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/delete-share.tsx b/routes/api/files/delete-share.tsx index c048d47..3e06dbc 100644 --- a/routes/api/files/delete-share.tsx +++ b/routes/api/files/delete-share.tsx @@ -29,6 +29,10 @@ export const handler: Handlers = { return new Response('Forbidden', { status: 403 }); } + if (!(await AppConfig.isAppEnabled('files'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/delete.tsx b/routes/api/files/delete.tsx index 6d86a1d..683de4f 100644 --- a/routes/api/files/delete.tsx +++ b/routes/api/files/delete.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { DirectoryFile, FreshContextState } from '/lib/types.ts'; import { FileModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,13 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/download-directory.tsx b/routes/api/files/download-directory.tsx index 0185dea..7635e94 100644 --- a/routes/api/files/download-directory.tsx +++ b/routes/api/files/download-directory.tsx @@ -58,6 +58,13 @@ export const handler: Handlers = { return new Response('Directory downloads are not enabled', { status: 403 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const searchParams = new URL(request.url).searchParams; const parentPath = searchParams.get('parentPath') || '/'; const name = searchParams.get('name'); diff --git a/routes/api/files/get-directories.tsx b/routes/api/files/get-directories.tsx index 57fb679..4da4924 100644 --- a/routes/api/files/get-directories.tsx +++ b/routes/api/files/get-directories.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Directory, FreshContextState } from '/lib/types.ts'; import { DirectoryModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,13 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/get-share.tsx b/routes/api/files/get-share.tsx index 2a6d3ff..164face 100644 --- a/routes/api/files/get-share.tsx +++ b/routes/api/files/get-share.tsx @@ -27,6 +27,10 @@ export const handler: Handlers = { return new Response('Forbidden', { status: 403 }); } + if (!(await AppConfig.isAppEnabled('files'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (!requestBody.fileShareId) { diff --git a/routes/api/files/get.tsx b/routes/api/files/get.tsx index 1d81ae6..ef32012 100644 --- a/routes/api/files/get.tsx +++ b/routes/api/files/get.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { DirectoryFile, FreshContextState } from '/lib/types.ts'; import { FileModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -20,6 +21,13 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/move-directory.tsx b/routes/api/files/move-directory.tsx index 9b5da7a..28275e1 100644 --- a/routes/api/files/move-directory.tsx +++ b/routes/api/files/move-directory.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Directory, FreshContextState } from '/lib/types.ts'; import { DirectoryModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -22,6 +23,13 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/move.tsx b/routes/api/files/move.tsx index dd0156e..af40f42 100644 --- a/routes/api/files/move.tsx +++ b/routes/api/files/move.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { DirectoryFile, FreshContextState } from '/lib/types.ts'; import { FileModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -22,6 +23,13 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/rename-directory.tsx b/routes/api/files/rename-directory.tsx index 3e10f14..9084239 100644 --- a/routes/api/files/rename-directory.tsx +++ b/routes/api/files/rename-directory.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Directory, FreshContextState } from '/lib/types.ts'; import { DirectoryModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -22,6 +23,13 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/rename.tsx b/routes/api/files/rename.tsx index 751bc0a..75c9f94 100644 --- a/routes/api/files/rename.tsx +++ b/routes/api/files/rename.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { DirectoryFile, FreshContextState } from '/lib/types.ts'; import { FileModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -22,6 +23,13 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/search.tsx b/routes/api/files/search.tsx index 9229941..299a5c1 100644 --- a/routes/api/files/search.tsx +++ b/routes/api/files/search.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Directory, DirectoryFile, FreshContextState } from '/lib/types.ts'; import { searchFilesAndDirectories } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,13 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (!requestBody.searchTerm?.trim()) { diff --git a/routes/api/files/update-share.tsx b/routes/api/files/update-share.tsx index 2941ebd..e55b622 100644 --- a/routes/api/files/update-share.tsx +++ b/routes/api/files/update-share.tsx @@ -32,6 +32,10 @@ export const handler: Handlers = { return new Response('Forbidden', { status: 403 }); } + if (!(await AppConfig.isAppEnabled('files'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/api/files/upload.tsx b/routes/api/files/upload.tsx index 790f50e..cceea74 100644 --- a/routes/api/files/upload.tsx +++ b/routes/api/files/upload.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { Directory, DirectoryFile, FreshContextState } from '/lib/types.ts'; import { DirectoryModel, FileModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -17,6 +18,13 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().formData(); const pathInView = requestBody.get('path_in_view') as string; diff --git a/routes/api/news/add-feed.tsx b/routes/api/news/add-feed.tsx index cfe08f0..68fe432 100644 --- a/routes/api/news/add-feed.tsx +++ b/routes/api/news/add-feed.tsx @@ -3,6 +3,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState, NewsFeed } from '/lib/types.ts'; import { FeedModel } from '/lib/models/news.ts'; import { fetchNewArticles } from '/crons/news.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('news'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (requestBody.feedUrl) { diff --git a/routes/api/news/delete-feed.tsx b/routes/api/news/delete-feed.tsx index 28f425a..2a469ae 100644 --- a/routes/api/news/delete-feed.tsx +++ b/routes/api/news/delete-feed.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState, NewsFeed } from '/lib/types.ts'; import { FeedModel } from '/lib/models/news.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -20,6 +21,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('news'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (requestBody.feedId) { diff --git a/routes/api/news/import-feeds.tsx b/routes/api/news/import-feeds.tsx index 2716962..cd04bfa 100644 --- a/routes/api/news/import-feeds.tsx +++ b/routes/api/news/import-feeds.tsx @@ -4,6 +4,7 @@ import { FreshContextState, NewsFeed } from '/lib/types.ts'; import { concurrentPromises } from '/lib/utils/misc.ts'; import { FeedModel } from '/lib/models/news.ts'; import { fetchNewArticles } from '/crons/news.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -22,6 +23,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('news'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (requestBody.feedUrls) { diff --git a/routes/api/news/mark-read.tsx b/routes/api/news/mark-read.tsx index 8c4a263..6ddc633 100644 --- a/routes/api/news/mark-read.tsx +++ b/routes/api/news/mark-read.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { ArticleModel } from '/lib/models/news.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -19,6 +20,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('news'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if (requestBody.articleId) { diff --git a/routes/api/news/refresh-articles.tsx b/routes/api/news/refresh-articles.tsx index 17ae173..600d8bf 100644 --- a/routes/api/news/refresh-articles.tsx +++ b/routes/api/news/refresh-articles.tsx @@ -3,6 +3,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState, NewsFeedArticle } from '/lib/types.ts'; import { ArticleModel, FeedModel } from '/lib/models/news.ts'; import { fetchNewArticles } from '/crons/news.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -19,6 +20,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('news'))) { + return new Response('Forbidden', { status: 403 }); + } + const newsFeeds = await FeedModel.list(context.state.user.id); if (!newsFeeds.length) { diff --git a/routes/api/notes/save.tsx b/routes/api/notes/save.tsx index ca38159..6c27de2 100644 --- a/routes/api/notes/save.tsx +++ b/routes/api/notes/save.tsx @@ -2,6 +2,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { FileModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -21,6 +22,10 @@ export const handler: Handlers = { return new Response('Unauthorized', { status: 401 }); } + if (!(await AppConfig.isAppEnabled('notes'))) { + return new Response('Forbidden', { status: 403 }); + } + const requestBody = await request.clone().json() as RequestBody; if ( diff --git a/routes/calendar.tsx b/routes/calendar.tsx index 2891082..f0a7d2a 100644 --- a/routes/calendar.tsx +++ b/routes/calendar.tsx @@ -29,6 +29,10 @@ export const handler: Handlers = { throw new Error('CalDAV server is not enabled'); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + throw new Error('Calendar app is not enabled'); + } + const userId = context.state.user.id; const timezoneId = context.state.user.extra.timezone?.id || 'UTC'; const timezoneUtcOffset = context.state.user.extra.timezone?.utcOffset || 0; diff --git a/routes/calendar/[calendarEventId].tsx b/routes/calendar/[calendarEventId].tsx index 239eaa6..f38f431 100644 --- a/routes/calendar/[calendarEventId].tsx +++ b/routes/calendar/[calendarEventId].tsx @@ -28,6 +28,10 @@ export const handler: Handlers = { throw new Error('CalDAV server is not enabled'); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + throw new Error('Calendar app is not enabled'); + } + let { calendarEventId } = context.params; const searchParams = new URL(request.url).searchParams; @@ -63,6 +67,10 @@ export const handler: Handlers = { throw new Error('CalDAV server is not enabled'); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + throw new Error('Calendar app is not enabled'); + } + const { calendarEventId } = context.params; const searchParams = new URL(request.url).searchParams; diff --git a/routes/calendars.tsx b/routes/calendars.tsx index cf545ae..0e50c50 100644 --- a/routes/calendars.tsx +++ b/routes/calendars.tsx @@ -21,6 +21,10 @@ export const handler: Handlers = { throw new Error('CalDAV server is not enabled'); } + if (!(await AppConfig.isAppEnabled('calendar'))) { + throw new Error('Calendar app is not enabled'); + } + const userCalendars = await CalendarModel.list(context.state.user.id); return await context.render({ userCalendars }); diff --git a/routes/contacts.tsx b/routes/contacts.tsx index a469d5e..e6bdd15 100644 --- a/routes/contacts.tsx +++ b/routes/contacts.tsx @@ -28,6 +28,10 @@ export const handler: Handlers = { throw new Error('CardDAV server is not enabled'); } + if (!(await AppConfig.isAppEnabled('contacts'))) { + throw new Error('Contacts app is not enabled'); + } + const userId = context.state.user.id; const searchParams = new URL(request.url).searchParams; diff --git a/routes/contacts/[contactId].tsx b/routes/contacts/[contactId].tsx index b855412..72119a2 100644 --- a/routes/contacts/[contactId].tsx +++ b/routes/contacts/[contactId].tsx @@ -6,6 +6,7 @@ import { Contact, ContactModel } from '/lib/models/contacts.ts'; import { getFormDataField } from '/lib/form-utils.tsx'; import ViewContact, { formFields } from '/islands/contacts/ViewContact.tsx'; import { updateVCard } from '/lib/utils/contacts.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data { contact: Contact; @@ -21,6 +22,10 @@ export const handler: Handlers = { return new Response('Redirect', { status: 303, headers: { 'Location': `/login` } }); } + if (!(await AppConfig.isAppEnabled('contacts'))) { + throw new Error('Contacts app is not enabled'); + } + const { contactId } = context.params; const searchParams = new URL(request.url).searchParams; @@ -43,6 +48,10 @@ export const handler: Handlers = { return new Response('Redirect', { status: 303, headers: { 'Location': `/login` } }); } + if (!(await AppConfig.isAppEnabled('contacts'))) { + throw new Error('Contacts app is not enabled'); + } + const { contactId } = context.params; const searchParams = new URL(request.url).searchParams; diff --git a/routes/dashboard.tsx b/routes/dashboard.tsx index d56ca0a..0ef9ea3 100644 --- a/routes/dashboard.tsx +++ b/routes/dashboard.tsx @@ -2,6 +2,7 @@ import { Handlers, PageProps } from 'fresh/server.ts'; import { Dashboard, FreshContextState } from '/lib/types.ts'; import { DashboardModel } from '/lib/models/dashboard.ts'; +import { AppConfig } from '/lib/config.ts'; import Notes from '/islands/dashboard/Notes.tsx'; import Links from '/islands/dashboard/Links.tsx'; @@ -15,6 +16,10 @@ export const handler: Handlers = { return new Response('Redirect', { status: 303, headers: { 'Location': `/login` } }); } + if (!(await AppConfig.isAppEnabled('dashboard'))) { + return new Response('Redirect', { status: 303, headers: { 'Location': `/` } }); + } + let userDashboard = await DashboardModel.getByUserId(context.state.user.id); if (!userDashboard) { diff --git a/routes/dav.tsx b/routes/dav.tsx index 432e70b..1d3c88b 100644 --- a/routes/dav.tsx +++ b/routes/dav.tsx @@ -27,6 +27,13 @@ export const handler: Handler = async (request, context }); } + if ( + !(await AppConfig.isAppEnabled('files')) && !(await AppConfig.isAppEnabled('photos')) && + !(await AppConfig.isAppEnabled('notes')) + ) { + return new Response('Forbidden', { status: 403 }); + } + let { filePath } = context.params; if (!filePath) { @@ -218,10 +225,17 @@ export const handler: Handler = async (request, context const depthString = request.headers.get('depth'); const depth = depthString ? parseInt(depthString, 10) : null; const xml = await request.clone().text(); + let properties: string[] = []; - const parsedXml = parse(xml); + try { + const parsedXml = parse(xml) as Record; - const properties = getPropertyNames(parsedXml); + properties = getPropertyNames(parsedXml); + } catch (error) { + console.error('Error parsing XML: ', error); + + properties = ['allprop']; + } await ensureUserPathIsValidAndSecurelyAccessible(userId, filePath); diff --git a/routes/expenses.tsx b/routes/expenses.tsx index 4d5acba..9ffb62d 100644 --- a/routes/expenses.tsx +++ b/routes/expenses.tsx @@ -19,7 +19,7 @@ export const handler: Handlers = { } if (!(await AppConfig.isAppEnabled('expenses'))) { - return new Response('Redirect', { status: 303, headers: { 'Location': `/files` } }); + return new Response('Redirect', { status: 303, headers: { 'Location': `/` } }); } const searchParams = new URL(request.url).searchParams; diff --git a/routes/file-share/[fileShareId].tsx b/routes/file-share/[fileShareId].tsx index 0709597..f693f69 100644 --- a/routes/file-share/[fileShareId].tsx +++ b/routes/file-share/[fileShareId].tsx @@ -35,6 +35,10 @@ export const handler: Handlers = { const baseUrl = (await AppConfig.getConfig()).auth.baseUrl; + if (!(await AppConfig.isAppEnabled('files'))) { + return new Response('Not Found', { status: 404 }); + } + const fileShare = await FileShareModel.getById(fileShareId); if (!fileShare) { diff --git a/routes/file-share/[fileShareId]/open/[fileName].tsx b/routes/file-share/[fileShareId]/open/[fileName].tsx index ef213d1..37919e5 100644 --- a/routes/file-share/[fileShareId]/open/[fileName].tsx +++ b/routes/file-share/[fileShareId]/open/[fileName].tsx @@ -21,6 +21,10 @@ export const handler: Handlers = { return new Response('Not Found', { status: 404 }); } + if (!(await AppConfig.isAppEnabled('files'))) { + return new Response('Not Found', { status: 404 }); + } + const fileShare = await FileShareModel.getById(fileShareId); if (!fileShare) { diff --git a/routes/file-share/[fileShareId]/verify.tsx b/routes/file-share/[fileShareId]/verify.tsx index ffb851c..678266c 100644 --- a/routes/file-share/[fileShareId]/verify.tsx +++ b/routes/file-share/[fileShareId]/verify.tsx @@ -29,6 +29,10 @@ export const handler: Handlers = { return new Response('Not Found', { status: 404 }); } + if (!(await AppConfig.isAppEnabled('files'))) { + return new Response('Not Found', { status: 404 }); + } + const fileShare = await FileShareModel.getById(fileShareId); if (!fileShare) { @@ -54,6 +58,10 @@ export const handler: Handlers = { return new Response('Not Found', { status: 404 }); } + if (!(await AppConfig.isAppEnabled('files'))) { + return new Response('Not Found', { status: 404 }); + } + const fileShare = await FileShareModel.getById(fileShareId); if (!fileShare) { diff --git a/routes/files.tsx b/routes/files.tsx index abf4980..610844e 100644 --- a/routes/files.tsx +++ b/routes/files.tsx @@ -22,6 +22,10 @@ export const handler: Handlers = { const baseUrl = (await AppConfig.getConfig()).auth.baseUrl; + if (!(await AppConfig.isAppEnabled('files'))) { + return new Response('Redirect', { status: 303, headers: { 'Location': `/` } }); + } + const searchParams = new URL(request.url).searchParams; let currentPath = searchParams.get('path') || '/'; diff --git a/routes/files/open/[fileName].tsx b/routes/files/open/[fileName].tsx index 5732228..d38454f 100644 --- a/routes/files/open/[fileName].tsx +++ b/routes/files/open/[fileName].tsx @@ -1,6 +1,7 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; +import { AppConfig } from '/lib/config.ts'; import { FileModel } from '/lib/models/files.ts'; interface Data {} @@ -17,6 +18,10 @@ export const handler: Handlers = { return new Response('Not Found', { status: 404 }); } + if (!(await AppConfig.isAppEnabled('files'))) { + return new Response('Redirect', { status: 303, headers: { 'Location': `/` } }); + } + const searchParams = new URL(request.url).searchParams; let currentPath = searchParams.get('path') || '/'; diff --git a/routes/index.tsx b/routes/index.tsx index ca06a93..070a3f6 100644 --- a/routes/index.tsx +++ b/routes/index.tsx @@ -1,13 +1,18 @@ import { Handlers } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} export const handler: Handlers = { - GET(request, context) { + async GET(request, context) { + const config = await AppConfig.getConfig(); + if (context.state.user) { - return new Response('Redirect', { status: 303, headers: { 'Location': `/dashboard` } }); + const firstEnabledApp = config.core.enabledApps[0]; + + return new Response('Redirect', { status: 303, headers: { 'Location': `/${firstEnabledApp}` } }); } return new Response('Redirect', { status: 303, headers: { 'Location': '/login' } }); diff --git a/routes/news.tsx b/routes/news.tsx index f373396..5e5d39f 100644 --- a/routes/news.tsx +++ b/routes/news.tsx @@ -16,7 +16,7 @@ export const handler: Handlers = { } if (!(await AppConfig.isAppEnabled('news'))) { - return new Response('Redirect', { status: 303, headers: { 'Location': `/dashboard` } }); + return new Response('Redirect', { status: 303, headers: { 'Location': `/` } }); } const userArticles = await ArticleModel.listUnread(context.state.user.id); diff --git a/routes/news/feeds.tsx b/routes/news/feeds.tsx index f6edbed..a4c1333 100644 --- a/routes/news/feeds.tsx +++ b/routes/news/feeds.tsx @@ -2,6 +2,7 @@ import { Handlers, PageProps } from 'fresh/server.ts'; import { FreshContextState, NewsFeed } from '/lib/types.ts'; import { FeedModel } from '/lib/models/news.ts'; +import { AppConfig } from '/lib/config.ts'; import Feeds from '/islands/news/Feeds.tsx'; interface Data { @@ -14,6 +15,10 @@ export const handler: Handlers = { return new Response('Redirect', { status: 303, headers: { 'Location': `/login` } }); } + if (!(await AppConfig.isAppEnabled('news'))) { + return new Response('Redirect', { status: 303, headers: { 'Location': `/` } }); + } + const userFeeds = await FeedModel.list(context.state.user.id); return await context.render({ userFeeds }); diff --git a/routes/notes/open/[fileName].tsx b/routes/notes/open/[fileName].tsx index b409a5f..97c69c8 100644 --- a/routes/notes/open/[fileName].tsx +++ b/routes/notes/open/[fileName].tsx @@ -3,6 +3,7 @@ import { Handlers, PageProps } from 'fresh/server.ts'; import { FreshContextState } from '/lib/types.ts'; import { FileModel } from '/lib/models/files.ts'; import Note from '/islands/notes/Note.tsx'; +import { AppConfig } from '/lib/config.ts'; interface Data { fileName: string; @@ -22,6 +23,10 @@ export const handler: Handlers = { return new Response('Not Found', { status: 404 }); } + if (!(await AppConfig.isAppEnabled('notes'))) { + throw new Error('Notes app is not enabled'); + } + const searchParams = new URL(request.url).searchParams; let currentPath = searchParams.get('path') || '/'; diff --git a/routes/photos/thumbnail/[fileName].tsx b/routes/photos/thumbnail/[fileName].tsx index 58048f7..194848d 100644 --- a/routes/photos/thumbnail/[fileName].tsx +++ b/routes/photos/thumbnail/[fileName].tsx @@ -3,6 +3,7 @@ import sharp from 'sharp'; import { FreshContextState } from '/lib/types.ts'; import { FileModel } from '/lib/models/files.ts'; +import { AppConfig } from '/lib/config.ts'; interface Data {} @@ -23,6 +24,10 @@ export const handler: Handlers = { return new Response('Not Found', { status: 404 }); } + if (!(await AppConfig.isAppEnabled('photos'))) { + throw new Error('Photos app is not enabled'); + } + const searchParams = new URL(request.url).searchParams; let currentPath = searchParams.get('path') || '/';